Swoft Cache :協程版切面快取元件,讓你的程式健步如飛

Polaris發表於2020-01-03

1. 介紹

  • 遵循PSR16 cache元件,支援傳統靜態呼叫,注入呼叫,註解呼叫,事件繫結等。只需一個閉包即可支援分散式原子鎖。基於swoft/cache
  • Github專案地址

2. 配置

2.1 composer

composer require devweyes/cache

2.2 無需額外配置,Autoload.php中包含預設配置(可覆蓋, key名需相同)。

<?php

use Jcsp\Cache\Cache;
use Swoft\Serialize\PhpSerializer;
use Jcsp\Cache\Annotation\Mapping\CacheRemember;

return [
    //cache主要配置
    Cache::MANAGER => [
        'class' => \Jcsp\Cache\CacheManager::class,
        'adapter' => bean(Cache::ADAPTER),
        'lockAdapter' => Cache::LOCK
    ],
    //cache選擇器 redis
    Cache::ADAPTER => [
        'class' => \Swoft\Cache\Adapter\RedisAdapter::class,
        'redis' => bean('redis.pool'),
        'prefix' => 'cache_',
        'serializer' => bean(Cache::SERIALIZER),
    ],
    //cache原子鎖配置
    Cache::LOCK => [
        'class' => \Jcsp\Cache\Lock\RedisLock::class,
        'redis' => bean('redis.pool'),
        'prefix' => 'lock:'
    ],
    //cache序列化
    Cache::SERIALIZER => [
        'class' => PhpSerializer::class
    ],
];

3. 使用

3.1 基本使用

<?php

namespace App\Rpc\Service;

use Jcsp\Cache\Cache;
use Jcsp\Cache\CacheManager;

/**
 * Class TestingService
 * @since 2.0
 * @Service()
 */
class UserService implements UserInterface
{
  /**
   * @Inject()
   * @var CacheManager
   */
   private $cache;
  /**
   * 快取靜態呼叫
   */
   public function statics()
    {
        //快取30秒
        Cache::set('key','value', 30);

        //快取獲取
        $value = Cache::get('key');

        //快取清除
        Cache::delete('key');

        //30秒快取 快取不存在則查庫 查庫資料再存入快取
        $value = Cache::remember('users', 30, function () {
              return DB::table('users')->get();
        });
        //獲取並刪除
        $value = Cache::pull('key');

        //資料永久儲存  需要呼叫delete清除
        Cache::forever('key', 'value');

        //快取不存在則查庫 查庫資料再永久存入快取 需要呼叫delete清除
        $value = Cache::rememberForever('users', function () {
              return DB::table('users')->get();
        });
    }
  /**
   * 注入方式呼叫
   */
   public function di()
    {
        //快取30秒
        $this->cache->set('key','value', 30);

        //快取獲取
        $value = $this->cache->get('key');

        //快取清除
        $this->cache->delete('key');

        //30秒快取 快取不存在則查庫 查庫資料再存入快取
        $value = $this->cache->remember('users', 30, function () {
              return DB::table('users')->get();
        });
        //獲取並刪除
        $value = $this->cache->pull('key');

        //資料永久儲存  需要呼叫delete清除
        $this->cache->forever('key', 'value');

        //快取不存在則查庫 查庫資料再永久存入快取 需要呼叫delete清除
        $value = $this->cache->rememberForever('users', function () {
              return DB::table('users')->get();
        });
    }

  /**
   * 註解方式呼叫
   * 快取30秒,否則從function拿
   * 
   * key為空則以class@action作為key,忽略引數
   * key支援引數傳入,key規則其他註解通用
   * 當putListener不為空,觸發快取寫入則觸發此事件
   * 
   * @CacheRemember(ttl=30, key="cache1_#{id}", putListener="CACHE_PUT")
   */
   public function cache1($id)
   {
      // TODO something
   }

  /**
   * 每次都觸發寫入快取
   * 當clearListener不為空,呼叫此事件則清除快取
   * 
   * @CachePut(ttl=30, clearListener="CACHE_CLEAR")
   */
   public function cache2($id)
   {
      // TODO something
   }
  /**
   * 每次都觸發清除快取
   * position標識清除操作的位置,執行前或執行後
   * 
   * @CacheClear(position=Cache::ASP_AFTER)
   */
   public function cache3($id)
   {
      // TODO something
   }
}

3.2 事件支援

  • 快取清除事件,事件方式清除,無需關心key名。僅支援註解CachePut與CacheRemember。
use Jcsp\Cache\Cache;
/**
* @param string $event clearListener對應字串
* @param array $args 引數鍵值對,與方法引數對應,如['id'=>1]
*/
Cache::clearTrigger(string $event, array $args = [])

3.3 原子鎖

  • 暫只支援reids驅動
  • 常見場景:分散式定時任務。前提需連線同一快取伺服器
use Jcsp\Cache\Cache;
if (Cache::lock('foo', 10)->get()) {
    // 獲取鎖定10秒...

    Cache::lock('foo')->release();
}
Cache::lock('foo')->get(function () {
  // 鎖無限期獲取並自動釋放...
});
if (Cache::lock('foo', 10)->block(5)) {
  // 等待最多5秒後獲取鎖定...
});
Cache::lock('foo', 10)->block(5, function () {
  // 等待最多5秒後獲取鎖定...
});   
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章