Laravel 缓存
配置与准备
配置文件: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 () {
// 没有获取到锁的话,五秒内不断尝试再获取,超时就异常。如果得到锁就执行闭包。闭包执行完毕,自动释放锁。
});
标签:24,Laravel,缓存,users,10,Cache,value,key,put
From: https://www.cnblogs.com/fuqian/p/17163946.html