FastCache
EasySwoole 提供了一個快速緩存,是基礎UnixSock通訊和自定義進程存儲數據實現的,提供基本的緩存服務,本緩存為解決小型應用中,需要動不動就部署Redis服務而出現。
組件要求
- php: >=7.1.0
- easyswoole/component: ^2.0
- easyswoole/spl: ^1.1
安裝方法
composer require easyswoole/fast-cache
倉庫地址
基本使用
服務注冊
我們在EasySwoole全局的事件中進行注冊
use EasySwoole\FastCache\Cache;
Cache::getInstance()->setTempDir(EASYSWOOLE_TEMP_DIR)->attachToServer(ServerManager::getInstance()->getSwooleServer());
FastCache只能在服務啟動之后使用,需要有創建unix sock權限(建議使用vm,docker或者linux系統開發),虛擬機共享目錄文件夾是無法創建unix sock監聽的
客戶端調用
服務啟動后,可以在任意位置調用
use EasySwoole\FastCache\Cache;
Cache::getInstance()->set('get','a');
var_dump(Cache::getInstance()->get('get'));
相關方法
設置臨時目錄
- public function setTempDir(string $tempDir): Cache
設置緩存進程數
- public function setProcessNum(int $num): Cache
設置緩存進程所在服務名
- public function setServerName(string $serverName): Cache
設置定時回調,可用于數據定時落地
- public function setOnTick($onTick): Cache
設置定時回調間隔
- public function setTickInterval($tickInterval): Cache
設置進程啟動回調,可以用于數據落地恢復
- public function setOnStart($onStart): Cache
設置進程關閉回調,可以用于數據落地
- public function setOnShutdown(callable $onShutdown): Cache
設置指定 key 的值
- public function set($key, $value, ?int $ttl = null, float $timeout = 1.0)
獲取指定 key 的值
- public function get($key, float $timeout = 1.0)
刪除指定 key的值
- public function unset($key, float $timeout = 1.0)
獲取所有key的值
- public function keys($key = null, float $timeout = 1.0): ?array
清空所有進程的數據
- public function flush(float $timeout = 1.0)
推入隊列
- public function enQueue($key, $value, $timeout = 1.0)
從隊列中取出
- public function deQueue($key, $timeout = 1.0)
獲取隊列當前長度
- public function queueSize($key, $timeout = 1.0)
釋放隊列
- public function unsetQueue($key, $timeout = 1.0)
返回當前隊列的全部key名稱
- public function queueList($timeout = 1.0): ?array
清空所有隊列
- public function flushQueue(float $timeout = 1.0): bool
設置一個key的過期時間
- public function expire($key, int $ttl, $timeout = 1.0)
移除一個key的過期時間
- public function persist($key, $timeout = 1.0)
查看某個key的ttl
- public function ttl($key, $timeout = 1.0)
將哈希表 key 中的字段 field 的值設為 value
- function hSet($key, $field, $value, float $timeout = 1.0)
獲取存儲在哈希表中指定字段的值
- function hGet($key, $field = null, float $timeout = 1.0)
刪除一個哈希表字段
- function hDel($key, $field = null, float $timeout = 1.0)
清空所有
- function hFlush(float $timeout = 1.0)
獲取所有哈希表中的字段
- function hKeys($key, float $timeout = 1.0)
迭代哈希表中的鍵值對
- function hScan($key, $cursor = 0, $limit = 10, float $timeout = 1.0)
只有在字段 field 不存在時,設置哈希表字段的值
- function hSetnx($key, $field, $value, float $timeout = 1.0)
查看哈希表 key 中,指定的字段是否存在
- function hExists($key, $field, float $timeout = 1.0)
獲取哈希表中字段的數量
- function hLen($key, float $timeout = 1.0)
為哈希表 key 中的指定字段的整數值加上
- function hIncrby($key, $field, $value, float $timeout = 1.0)
同時將多個 field-value對設置到哈希表 key 中
- function hMset($key, $fieldValues, float $timeout = 1.0)
獲取所有給定字段的值
- function hMget($key, $fields, float $timeout = 1.0)
獲取哈希表中所有值
- function hVals($key, float $timeout = 1.0)
獲取在哈希表中指定 key 的所有字段和值
- function hGetAll($key, float $timeout = 1.0)
落地重啟恢復數據方案
FastCache提供了3個方法,用于數據落地以及重啟恢復,在EasySwooleEvent.php
中的mainServerCreate
回調事件中設置以下方法:
設置回調要在注冊cache服務之前,注冊服務之后不能更改回調事件。
<?php
use EasySwoole\FastCache\Cache;
use EasySwoole\FastCache\CacheProcessConfig;
use EasySwoole\FastCache\SyncData;
use EasySwoole\Utility\File;
// 每隔5秒將數據存回文件
Cache::getInstance()->setTickInterval(5 * 1000);//設置定時頻率
Cache::getInstance()->setOnTick(function (SyncData $SyncData, CacheProcessConfig $cacheProcessConfig) {
$data = [
'data' => $SyncData->getArray(),
'queue' => $SyncData->getQueueArray(),
'ttl' => $SyncData->getTtlKeys(),
// queue支持
'jobIds' => $SyncData->getJobIds(),
'readyJob' => $SyncData->getReadyJob(),
'reserveJob' => $SyncData->getReserveJob(),
'delayJob' => $SyncData->getDelayJob(),
'buryJob' => $SyncData->getBuryJob(),
];
$path = EASYSWOOLE_TEMP_DIR . '/FastCacheData/' . $cacheProcessConfig->getProcessName();
File::createFile($path,serialize($data));
});
// 啟動時將存回的文件重新寫入
Cache::getInstance()->setOnStart(function (CacheProcessConfig $cacheProcessConfig) {
$path = EASYSWOOLE_TEMP_DIR . '/FastCacheData/' . $cacheProcessConfig->getProcessName();
if(is_file($path)){
$data = unserialize(file_get_contents($path));
$syncData = new SyncData();
$syncData->setArray($data['data']);
$syncData->setQueueArray($data['queue']);
$syncData->setTtlKeys(($data['ttl']));
// queue支持
$syncData->setJobIds($data['jobIds']);
$syncData->setReadyJob($data['readyJob']);
$syncData->setReserveJob($data['reserveJob']);
$syncData->setDelayJob($data['delayJob']);
$syncData->setBuryJob($data['buryJob']);
return $syncData;
}
});
// 在守護進程時,php easyswoole.php stop 時會調用,落地數據
Cache::getInstance()->setOnShutdown(function (SyncData $SyncData, CacheProcessConfig $cacheProcessConfig) {
$data = [
'data' => $SyncData->getArray(),
'queue' => $SyncData->getQueueArray(),
'ttl' => $SyncData->getTtlKeys(),
// queue支持
'jobIds' => $SyncData->getJobIds(),
'readyJob' => $SyncData->getReadyJob(),
'reserveJob' => $SyncData->getReserveJob(),
'delayJob' => $SyncData->getDelayJob(),
'buryJob' => $SyncData->getBuryJob(),
];
$path = EASYSWOOLE_TEMP_DIR . '/FastCacheData/' . $cacheProcessConfig->getProcessName();
File::createFile($path,serialize($data));
});
Cache::getInstance()->setTempDir(EASYSWOOLE_TEMP_DIR)->attachToServer(ServerManager::getInstance()->getSwooleServer());
消息隊列支持
如具體查看消息隊列,請查看FastCacheQueue