缓存

IMI 中的缓存,符合PSR-16规范。使用时需要先配置驱动和实例。

配置

默认缓存设置

  1. <?php
  2. return [
  3. 'cache' => [
  4. 'default' => 'alias1',
  5. ],
  6. ];

文件缓存

  1. <?php
  2. return [
  3. 'caches' => [
  4. // 缓存名称
  5. 'alias1' => [
  6. // 缓存驱动类
  7. 'handlerClass' => \Imi\Cache\Handler\File::class,
  8. // 驱动实例配置
  9. 'option' => [
  10. 'savePath' => '文件缓存保存路径',
  11. // 保存文件名处理回调,一般可以不写
  12. // 'saveFileNameCallback' => function($savePath, $key){
  13. // return '';
  14. // },
  15. ],
  16. ],
  17. ],
  18. ];

文件缓存不支持分布式存储,请慎重选择!

Redis 缓存

使用 redis 的 set 和 get 方法,支持 ttl

  1. return [
  2. 'caches' => [
  3. // 缓存名称
  4. 'alias1' => [
  5. // 缓存驱动类
  6. 'handlerClass' => \Imi\Cache\Handler\Redis::class,
  7. // 驱动实例配置
  8. 'option' => [
  9. 'poolName' => '连接池名称',
  10. ],
  11. ],
  12. ],
  13. ];

Redis Hash 缓存

使用 redis 的 hash,即 hset 和 hget 方法,不支持ttl

  1. return [
  2. 'caches' => [
  3. // 缓存名称
  4. 'alias1' => [
  5. // 缓存驱动类
  6. 'handlerClass' => \Imi\Cache\Handler\RedisHash::class,
  7. // 驱动实例配置
  8. 'option' => [
  9. 'poolName' => '连接池名称',
  10. 'separator' => '分隔符,分隔 hash key和 member,默认为->',
  11. ],
  12. ],
  13. ],
  14. ];

RedisHash 缓存使用时需要注意,key格式为hashkey->member,即为$redis->hget('hashkey', 'member')

手动使用

写入缓存

  1. // 永久有效
  2. Imi\Cache\CacheManager::set('缓存名称', 'key', 'value');
  3. $ttl = 3600; // 缓存有效时间,单位:秒
  4. Imi\Cache\CacheManager::set('缓存名称', 'key', 'value', $ttl);

批量写入缓存

  1. $values = [
  2. 'k1' => 'v1',
  3. 'k2' => 'v2',
  4. ];
  5. Imi\Cache\CacheManager::setMultiple('缓存名称', $values);
  6. $ttl = 3600; // 缓存有效时间,单位:秒
  7. Imi\Cache\CacheManager::setMultiple('缓存名称', $values, $ttl);

读取缓存

  1. Imi\Cache\CacheManager::get('缓存名称', 'key');
  2. Imi\Cache\CacheManager::get('缓存名称', 'key', 'default');

批量读取缓存

  1. $keys = ['k1', 'k2'];
  2. Imi\Cache\CacheManager::getMultiple('缓存名称', $keys);
  3. Imi\Cache\CacheManager::getMultiple('缓存名称', $keys, 'default');

删除缓存

  1. Imi\Cache\CacheManager::delete('缓存名称', 'key');

批量删除缓存

  1. $keys = ['k1', 'k2'];
  2. Imi\Cache\CacheManager::deleteMultiple('缓存名称', $keys);

缓存是否存在

  1. Imi\Cache\CacheManager::has('缓存名称', 'key');

清空缓存

  1. Imi\Cache\CacheManager::clear('缓存名称');

注解使用

除了手动控制缓存读写,你还可以使用注解来做,真的炒鸡方便哦!

首先来认识一下 imi 中的缓存注解吧!

@Cacheable

调用方法前检测是否存在缓存,如果存在直接返回;不存在则执行方法体,然后将返回值存入缓存

用法:

基本用法:

@Cacheable(name="缓存器名,为null则取cache.default配置", key="缓存键名,支持{id}、{data.name}、{:args}(所有参数的hash值)形式,代入参数,如果为null,则使用类名+方法名+全部参数,序列化后hash", ttl="超时时间,单位秒", lockable="Lock 注解,在调用方法体前后加锁", hashMethod="md5")

防止缓存击穿:

  1. /*
  2. * @Cacheable(
  3. * key="index:{page}",
  4. * ttl=10,
  5. * lockable=@Lockable(
  6. * id="index:{page}",
  7. * waitTimeout=999999,
  8. * ),
  9. * preventBreakdown=true,
  10. * )
  11. */

lockable 用法请参考 Lock

preventBreakdown 如果设为 true,会在获得锁后,尝试获取缓存,如果缓存存在则不再执行方法体

如果 preventBreakdown 设为 true,并且lockable中也设定了afterLock,优先级为:afterLock > 缓存检测

@CacheEvict

缓存驱逐注解,方法体执行时,将指定缓存清除

用法:

在方法执行前删除缓存:

@CacheEvict(name="同上", key="同上", beforeInvocation=true, hashMethod="md5")

在方法执行后删除缓存:

@CacheEvict(name="同上", key="同上", hashMethod="md5")

@CachePut

方法体执行后,将返回值存入缓存

用法:

将方法返回值全部写入缓存:

@CachePut(name="同上", key="同上", ttl="同上", hashMethod="md5")

将方法返回值的一部分写入缓存:

@CachePut(name="同上", key="同上", ttl="同上", value="a.b", hashMethod="md5")

上面的注解,如果方法返回值为:

  1. [
  2. 'a' => [
  3. 'b' => 123,
  4. ],
  5. ]

则会将123写入缓存。