您好,登錄后才能下訂單哦!
小編給大家分享一下TP6框架中Redis操作服務類的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
1. 定義服務類
<?php declare (strict_types=1); namespace app\api\service\common; use think\facade\Cache; /** * 緩存服務 * Class RedisService * * @package app\api\service\common */ class RedisService { private $expire; private $expire_at; /** * 獲取redis句柄 * * @return object|null */ public function client(): ?object { return Cache::store('redis')->handler(); } /** * 處理緩存key(添加前綴...) * * @param string $key key * * @return string */ private function cacheKey(string $key): string { return Cache::getCacheKey($key); } /** * 緩存程序運行結果 * * @param $key * @param callable $callback * @param int $expire * * @return mixed */ public function cache($key, callable $callback, int $expire = 3600) { $cache = $this->client()->get($key); if (! $cache || ! unserialize($cache)) { $data = $callback(); $this->client()->set($key, $cache = serialize($data), $expire); } return unserialize($cache); } /** * 程序運行鎖 * @param $key * @param callable $callback * @param int $timeout * * @return array */ public function lock($key, callable $callback, int $timeout = 10): array { $lock = $this->client()->get($key); if ($lock) return ['code' => 0, 'data' => null]; $this->client()->setex($key, $timeout, 1); $data = $callback(); $this->client()->del($key); return ['code' => 1, 'data' => $data]; } /** * 設置有效時間 * * @param $ttl * * @return $this|false * @throws \Exception */ public function setExpire($ttl) { if ($this->expire_at) throw new \Exception('setExpire and setExpireAt can not set both'); $this->expire = $ttl; return $this; } /** * 設置到期時間 * * @param $timestamp * * @return $this|false * @throws \Exception */ public function setExpireAt($timestamp) { if ($this->expire > 0) throw new \Exception('setExpire and setExpireAt can not set both'); $this->expire_at = $timestamp; return $this; } /** * 調用原生redis方法 * * @return mixed */ public function __call($name, $arguments) { $cache_key = $this->cacheKey($arguments[0]); $result = $this->client()->{$name}(...$arguments); // 設置過期時間 $this->expire && $this->client()->expire($cache_key, $this->expire); $this->expire_at && $this->client()->expireAt($cache_key, $this->expire_at); return $result; } }
2. 定義門面Facade
<?php namespace app\api\facade; use app\api\service\common\RedisService; use think\Facade; /** * Class Redis * * @package app\api\facade * * @method static \Redis client() * @method static \Redis setExpire($ttl) * @method static \Redis setExpireAt($timestamp) * @method static mixed cache($key, callable $callback, int $expire = 3600) * @method static array lock($key, callable $callback, int $timeout = 10) */ class Redis extends Facade { protected static function getFacadeClass() { return RedisService::class; } }
3. 如何使用
3.1 程序鎖
public function test() { $a = 1; $b = 2; $result = Redis::lock('lock:demo', function () use ($a, $b) { return $a + $b; }, 5); if ($result['code'] == 0) return '操作頻繁,請稍后再試'; return $result['data']; // 成功返回數據 3 }
3.2 方法數據緩存
public function test() { $a = 1; $b = 2; $result = Redis::cache('cache:demo', function () use ($a, $b) { return $a + $b; }, 5); return $result; // 成功返回數據 3,有效時長5秒 }
3.3 簡化過期時間設置
// 24小時到期 Redis::setExpire(86400)->hSet('expire:demo', 'hash-key', 'hash-value'); // 2021-08-24 23:59:59到期 Redis::setExpireAt(strtotime('2021-08-24 23:59:59'))->hSet('expireAt:demo', 'hash-key', 'hash-value');
3.4 普通調用
// 普通調用,直接跟redis方法名 Redis::set('set:demo', 132456); // idea支持代碼提示調用 Redis::client()->set('set:demo', 132456);
以上是“TP6框架中Redis操作服務類的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。