Laravel

Laravel 缓存

配套视频地址:https://www.bilibili.com/video/av77035719


配置与准备

配置文件:config/cache.php, .env
可配置内容:
    1. 使用哪个驱动
    2. 驱动的配置信息
    3. 所有缓存的统一 key 前缀

注意点:
    1. 使用 redis 驱动,需要安装 phpredis 拓展,并且注释 config/app.php 中的 alias 中 Redis 一行防止 Redis 命名空间冲突。
    2. 缓存的时间单位由早期的分钟变成了秒。
    3. Cache::flush(); 会删除 redis 中的所有缓存,不只是涉及你的项目!
    4. 原子锁只支持 memcached, dynamodb, redis 驱动,并且只与同一台中心 cache 服务器通信。
    5. file 和 database 驱动不支持 tag 功能。

提示:
    1. 尽量不要用永久存储。
    2. 如果 tag 功能涉及到永久存储,可以使用自动清除老旧记录的驱动,类似 memcached。

配置不同的驱动

数据库
    php artisan cache:table
    php artisan migrate
memcached
    回环地址链接
        'memcached' => [
            [
                'host' => '127.0.0.1',
                'port' => 11211,
                'weight' => 100
            ],
        ],
    unix socket 连接  
        'memcached' => [
            [
                'host' => '/var/run/memcached/memcached.sock',
                'port' => 0,
                'weight' => 100
            ],
        ],
Cache::put('key', 'value', 10);
Cache::put('key', 'value');
Cache::put('key', 'value', now()->addMinutes(10));  // 第三个参数可以是 DateTime 对象

Cache::putMany(['helen' => new Student('helen'), 'jack' => '10'], 10);  // 这个是 ok 的
// 不生效 cache(['helen' => new Student('helen'), 'jack' => '10'], 10); 

$bool = Cache::add('key', 'value', 10);   // add: 如果缓存存在了,就返回 false;如果不存在,则添加缓存,然后返回 true

Cache::forever('key', 'value'); // === Cache::put('key', 'value');

Cache::store('redis')->put('bar', 'baz', 600); // 10 Minutes
Cache::forget('key');
Cache::put('key', 'value', 0);
Cache::put('key', 'value', -5);

注意:

Cache::flush(); // 不区别前缀,删除所有

$value = Cache::get('key');
$value = Cache::get('key', 'default');
if (Cache::has('key')) {   // 只要 key 的值是 null,返回 false。
    //
}

$value = Cache::store('file')->get('foo');
$aStudent = Cache::many(['helen', 'jack']);

$aStudent = Cache::many(['helen' => new Student(), 'jack']);
Cache::put('key', 'value', 10);
Cache::put('key', 'value');
Cache::put('key', 'value', now()->addMinutes(10));  // 第三个参数可以是 DateTime 对象

Cache::putMany(['helen' => new Student('helen'), 'jack' => '10'], 10);  // 这个是 ok 的
// 不生效 cache(['helen' => new Student('helen'), 'jack' => '10'], 10); 

Cache::forever('key', 'value'); // === Cache::put('key', 'value');

Cache::increment('key');
$amount = Cache::increment('key', 3)        // 如果 key 不存在,返回 3,并且设置缓存 key 为 3
Cache::decrement('key');
Cache::decrement('key', $amount);

复合操作

$value = Cache::pull('key');  // 如果不存在 key,返回 null
$value = Cache::pull('key', 'value');
$value = Cache::get('key', function () {
    return DB::table(...)->get();
});
$users = Cache::get('users');
if (is_null($users)) {
    $users = DB::table('users')->get();
    Cache::set('users', $users, 10);
}

// 等同于

$users = Cache::remember('users', 10, function () {
    return DB::table('users')->get();
});
$users = Cache::rememberForever('users', function () {  // 同名方法 sear
    return DB::table('users')->get();
});

辅助全局函数

cache('key');

cache(['key' => 'value'], $seconds);

cache(['key' => 'value'], now()->addSeconds(10));

cache()->sear('users', function () {
    return DB::table('users')->get();
});

tag: 设置标签

# 取的时候标签内容必须一致,不能多,不能少。
# 删的时候标签内容中只要命中,则删除
Cache::tags(['people', 'artists'])->put('John', 190, $seconds);
Cache::tags(['people', 'authors'])->put('Anne', 166, $seconds);

Cache::tags(['people', 'authors'])->get('Anne'); 

Cache::tags('authors')->flush();  
Cache::tags(['people', 'authors'])->flush(); // 删除 people, authors, people and authors

原子锁

$lock = Cache::lock('foo', 10);

if ($lock->get()) {
    // 获取锁 10s,超时释放锁

    $lock->release();
}
Cache::lock('foo')->get(function () {
    // 闭包执行完毕,自动释放锁
});
$lock = Cache::lock('foo', 10);

try {
    $lock->block(5); // 没有获取到锁的话,五秒内不断尝试再获取,超时就异常
    // ...
} catch (LockTimeoutException $e) {
    // Unable to acquire lock...
} finally {
    optional($lock)->release();
}

Cache::lock('foo', 10)->block(5, function () {
    // 没有获取到锁的话,五秒内不断尝试再获取,超时就异常。如果得到锁就执行闭包。闭包执行完毕,自动释放锁。
});

发表评论