首页 > 其他分享 >24. Laravel 缓存

24. Laravel 缓存

时间:2023-02-28 13:57:59浏览次数:50  
标签:24 Laravel 缓存 users 10 Cache value key put

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 () {
    // 没有获取到锁的话,五秒内不断尝试再获取,超时就异常。如果得到锁就执行闭包。闭包执行完毕,自动释放锁。
});

标签:24,Laravel,缓存,users,10,Cache,value,key,put
From: https://www.cnblogs.com/fuqian/p/17163946.html

相关文章

  • 28. Laravel 内置聊天室
    Laravel内置聊天室配套视频地址:https://www.bilibili.com/video/av80196918配置打开config/app.php中BroadcastServiceProvider注释,即注册广播授权路由。在.e......
  • 27. Laravel 广播 – 私有频道
    Laravel内置聊天室配套视频地址:https://www.bilibili.com/video/av80196918配置打开config/app.php中BroadcastServiceProvider注释,即注册广播授权路由。在.e......
  • 30. Laravel 开发第三方包
    Laravel开发第三方包使用Contracts代替Facades,因为扩展包不能访问Laravel提供的所有测试Facades的辅助函数。自动发现和注册Facades"extra":{"laravel......
  • 29. Laravel 广播系统补充
    Laravel广播系统补充配套视频地址:https://www.bilibili.com/video/av80196918?p=2设置广播名称//默认是事件的类名publicfunctionbroadcastAs(){return's......
  • Laravel 最佳实践
    Laravel最佳实践翻译来源:https://github.com/alexeymezenin/laravel-best-practices单一职责原则不要这样做:publicfunctiongetFullNameAttribute(){if(aut......
  • Laravel 核心概念
    Laravel核心概念配套视频地址:https://www.bilibili.com/video/av76060293核心概念简介、服务容器、服务提供者、facade、contract、生命周期。简介我叫Laravel。......
  • 18. Laravel 模型关系:远程一对一
    Laravel模型关系:远程一对一配套视频地址:https://www.bilibili.com/video/av73028135?p=5一个帖子属于一个作者,该作者就读一所学校。帖子可通过作者访问作者所在的学校......
  • 17. Laravel 模型关系:多对多
    Laravel模型关系:多对多配套视频地址:https://www.bilibili.com/video/av73028135?p=4多对多:一个人可以扮演多个角色,一个角色可以被多个人扮演。数据结构#users:id,......
  • 19. Laravel 模型关系:远程一对多
    Laravel模型关系:远程一对多配套视频地址:https://www.bilibili.com/video/av73028135?p=5简单的说:Thread模型可以通过Author模型访问多个的Book模型。表threads......
  • 8. Laravel 视图
    Laravel视图配套视频地址https://www.bilibili.com/video/av70545323?p=8知识点返回视图给视图传递数据模版语法1.返回视图//resources/views/test.blade.p......