[扩展]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 协议》,转载必须注明作者和本文链接
风起于青萍之末 浪成于微澜之间
南城以南
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

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

3年前 评论
南城以南

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

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

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