[扩展]Laravel-smartcache 基于Yac/APCu 与Redis的二级缓存器

Laravel-smartcache 一款基于yac/apcu的laravel二级缓存扩展包

二级缓存器,基于APCu/Yac。

如果本扩展帮助到了你 欢迎star。laravel-smartcache

如果本扩展有任何问题或有其他想法 欢迎提 issue与pull request。

Yac官方文档

APCu官方文档

安装

 composer require lysice/laravel-smartcache

将服务提供者添加入app.php

 'providers' => [ 
        ...
        \Lysice\Cache\CacheServiceProvider::class 
    ]

配置

  • data_connection Redis的数据连接,指定要同步数据到哪个Redis连接。
  • cache_type
    内存缓存选择两种模式
    \Lysice\Cache\Constants::CACHE_TYPE_YAC 基于Yac 该选项需要安装php的yac扩展
    \Lysice\Cache\Constants::CACHE_TYPE_APCU 基于APCu 该选项需要安装apcu的扩展
  • sync_mode 同步模式
    const SYNC_MODE_PUBSUB = 1; 异步订阅模式, 使用Redis的订阅来同步数据到Redis 该选项需要执行`php artisan 2cache:sync &` 且保证该命令高可用。
    const SYNC_MODE_SYNC = 2; 同步模式,当设置缓存时直接设置Redis数据。
    const SYNC_MODE_JOB = 3; 队列模式 将Redis的缓存设置任务分配到队列 该模式需要您开启队列且保证队列高可用。一般使用`supervisor`
  • pub_connection
    Redis的订阅连接 当同步模式为SYNC_MODE_PUBSUB时使用。注意,Redis的订阅连接为阻塞连接 需要保证数据连接data_connectionpub_connection不是同一个连接。
    这种模式的缺点是会浪费一个RedisDB
  • redis_channel
    Redis的订阅渠道 当同步模式为SYNC_MODE_PUBSUB时使用。
  • log 是否记录简单日志

使用

CacheManager的方法定义如下

remember(string $key, int $ttl, Callable $callback){}

如果您习惯使用Facade模式 首先加入Facade

 'aliases' => [ 'SecondaryCache' => \Lysice\Cache\SecondaryCache::class ],

然后使用:

    $ttl = 10 * 60;
    $key = 'your key';
    $result = SecondaryCache::remember($key, $ttl, function () { 
        return  [ 'cached' => true ]; 
    });

或者您也可以直接按照如下使用

    app(CacheManager::class)->remember(
        'your key', 
        'your ttl', 
        function () {            
            return  [ 'cached' => 1 ]; 
        });

需要注意的是 首次返回的数据为您自己定义的 $callback中的数据。如果您返回的是数组 则缓存时会将数据 json_encode后存储。
当您第二次访问,取到的数据为缓存数据,此时您应该将数据反序列化为数组。
另外,在laravel中大量使用了 collection,由于collection数据量太大,因此在开发中并未考虑callback返回collection的情况。建议使用者直接返回数组。

单独使用

如果您觉得本扩展的remember方法不好用可以基于本扩展提供的类直接操作。
以下本扩展提供的类

  • RedisInstance

  • YacInstance

  • APCu
    以上三个类实现了CacheConcern接口 因此提供方法:

    /**
    public function set($key, $value, $ttl); 设置缓存 支持数组。$key = ['key' => 'value'] $value = null
    
    public function update($key, $old, $new); 更新缓存
    
    public function clear(); 清除缓存
    
    public function decrease($key = '', $step = 1, $ttl = 0); 计数减少
    
    public function delete($keys); 删除缓存 
    
    public function exists($keys); 是否存在
    
    public function get($key); 获取缓存
    
    public function increase($key = '', $step = 1, $ttl = 0); 计数增加
    
    public function info(); 返回缓存信息

如果本扩展帮助到了你 欢迎star。

如果本扩展有任何问题或有其他想法 欢迎提 issue与pull request。

本作品采用《CC 协议》,转载必须注明作者和本文链接
风起于青萍之末 浪成于微澜之间
南城以南
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

这个缓存 和redis比起来有什么好处呢

2年前 评论
南城以南

都是内存缓存。 但是 Redis这样的缓存定位是分布式缓存,与应用交互需要使用Redis的RESP协议。只要是走协议 就有开销。Redis还可以支持各种数据结构和持久化等。 APCu现在没几个人用了 仍然企业化的使用场景是 PHPopcacheYac比起APCu无锁高效 简单缓存应用场景 且容忍单机缓存错误率,可以使用APCu/Yac。 分布式应用场景还是使用Redis这种重量级的。 引用知乎的回答:

取决于你的业务是用分布式缓存还是本地缓存了。。分布式缓存涉及到网络部署问题,本地缓存涉及到缓存是否需要同步问题,取决业务的具体情况。到底选用哪种比较合适。例如你的业务逻辑比较复杂,执行时间较长,那么肯定是分布式缓存好,因为一份缓存只需要生成一次,如果是逻辑较为简单,那么各个节点使用自己的本地缓存是最好的。
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!