缓存

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

    配置

    默认缓存设置

    <?php
    return [
        'cache'    =>    [
            'default'    =>    'alias1',
        ],
    ];
    缓存相关注解,不指定 name 属性时,使用该配置

    手动使用

    写入缓存

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

    批量写入缓存

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

    读取缓存

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

    批量读取缓存

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

    删除缓存

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

    批量删除缓存

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

    缓存是否存在

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

    清空缓存

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

    注解使用

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

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

    @Cacheable

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

    用法:

    基本用法:

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

    防止缓存击穿:

    /*
     * @Cacheable(
     *   key="index:{page}",
     *   ttl=10,
     *   lockable=@Lockable(
     *     id="index:{page}",
     *     waitTimeout=999999,
     *   ),
     *   preventBreakdown=true,
     * )
     */

    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")

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

    [
        'a' =>  [
            'b' =>  123,
        ],
    ]

    则会将123写入缓存。