[扩展]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 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 2

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

3年前 评论
南城以南

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

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