美文网首页
Laravel 缓存系统及事件系统

Laravel 缓存系统及事件系统

作者: phpnet | 来源:发表于2019-12-18 12:12 被阅读0次

    缓存系统

    Laravel 为各种后端缓存提供了丰富而统一的 API,其配置信息位于 config/cache.php 文件中。默认情况下,Laravel 配置为使用 file 缓存驱动,它将序列化的缓存对象存储在文件系统中。

    缓存配置

    mysql:

    Schema::create('cache', function ($table) {
        $table->string('key')->unique();
        $table->text('value');
        $table->integer('expiration');
    });
    

    file:

    'file' => [
        'driver' => 'file',
        'path' => storage_path('framework/cache/data'),
    ],
    

    memcache:

    'memcached' => [
        [
            'host' => '127.0.0.1',
            'port' => 11211,
            'weight' => 100
        ],
    ],
    

    redis:

    // cache.php
    'redis' => [
        'driver' => 'redis',
        'connection' => 'cache',
    ],
    
    // database.php
    'redis' => [
        'cache' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => env('REDIS_CACHE_DB', 1),
        ],
    ],
    

    使用示例

    // 获取某个缓存
    $value = Cache::get('key');
    $value = Cache::get('key', 'default');
    $value = Cache::get('key', function () {
        return DB::table(...)->get();
    });
    
    // 访问多个缓存存储
    $value = Cache::store('file')->get('foo');
    Cache::store('redis')->put('bar', 'baz', $seconds);
    
    // 检查缓存是否存在
    if (Cache::has('key')) {
    }
    
    // 递增与递减
    Cache::increment('key');
    Cache::increment('key', $amount);
    Cache::decrement('key');
    Cache::decrement('key', $amount);
    
    // 获取不存时则存储缓存
    $value = Cache::remember('users', $seconds, function () {
        return DB::table('users')->get();
    });
    
    // 获取数据或永久存储缓存
    $value = Cache::rememberForever('users', function () {
        return DB::table('users')->get();
    });
    
    // 获取数据并删除缓存(不存在返回 null)
    $value = Cache::pull('key');
    
    // 存储缓存数据(没有过期时间则永久有效)
    Cache::put('key', 'value', $seconds);
    Cache::put('key', 'value');
    Cache::put('key', 'value', now()->addMinutes(10));
    
    // 仅存储不存在的数据(true 和 fasle)
    Cache::add('key', 'value', $seconds);
    
    // 永久存储缓存数据(必须通过 forget 才能删除)
    Cache::forever('key', 'value');
    
    // 删除缓存数据
    Cache::forget('key');
    // 通过零或负值来删除数据
    Cache::put('key', 'value', 0);
    Cache::put('key', 'value', -5);
    
    // 清空所有的缓存
    Cache::flush();
    
    // 原子锁(仅限使用 memcache、redis 等缓存驱动)
    // 原子锁允许对分布式锁进行操作而不必担心竞争条件,即使用原子锁来确保在一台服务器上每次只有一个远程任务在执行。
    $lock = Cache::lock('foo', 10);
    if ($lock->get()) {
        // 获取锁定10秒...
        $lock->release();
    }
    Cache::lock('foo')->get(function () {
        // 获取无限期锁并自动释放...
    });
    
    // 在指定的时间限制内无法获取锁则抛出异常
    use Illuminate\Contracts\Cache\LockTimeoutException;
    $lock = Cache::lock('foo', 10);
    try {
        $lock->block(5);
        // 等待最多5秒后获取的锁...
    } catch (LockTimeoutException $e) {
        // 无法获取锁...
    } finally {
        optional($lock)->release();
    }
    Cache::lock('foo', 10)->block(5, function () {
        // 等待最多5秒后获取的锁...
    });
    
    // 管理跨进程锁
    // 控制器里
    $podcast = Podcast::find($id);
    $lock = Cache::lock('foo', 120);
    if ($result = $lock->get()) {
        ProcessPodcast::dispatch($podcast, $lock->owner());
    }
    
    // 队列里
    Cache::restoreLock('foo', $this->owner)->release();
    
    // 无视当前锁的所有者的情况下释放锁
    Cache::lock('foo')->forceRelease();
    
    // Cache 辅助函数
    $value = cache('key');
    cache(['key' => 'value'], $seconds);
    cache(['key' => 'value'], now()->addMinutes(10));
    cache()->remember('users', $seconds, function () {
        return DB::table('users')->get();
    });
    

    缓存标记

    缓存标签允许你给相关的缓存标签项打上同一个标签以便后续可以清除这些缓存值。

    // 存储被打上标签的缓存数据
    Cache::tags(['people', 'artists'])->put('John', $john, $seconds);
    Cache::tags(['people', 'authors'])->put('Anne', $anne, $seconds);
    
    // 访问被打上标签的缓存数据
    $john = Cache::tags(['people', 'artists'])->get('John');
    $anne = Cache::tags(['people', 'authors'])->get('Anne');
    
    // 移除带有标签的缓存数据
    Cache::tags(['people', 'authors'])->flush();
    

    事件系统

    Laravel 的事件提供了一个简单的观察者实现,允许你在应用中订阅和监听各种发生的事件。事件类通常放在 app/Events 目录下,而这些事件类的监听器则放在 app/Listeners 目录下。如果在你的应用中你没有看到这些目录,不用担心,它们会在你使用 Artisan 控制台命令生成事件与监听器的时候自动创建。

    相关文章

      网友评论

          本文标题:Laravel 缓存系统及事件系统

          本文链接:https://www.haomeiwen.com/subject/aszynctx.html