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 協議》,轉載必須註明作者和本文連結