站长资讯网
最全最丰富的资讯网站

分享TP6框架中Redis操作服务类的记录

下面由thinkphp框架教程栏目给大家分享ThinkPHP6中Redis操作服务类的记录,希望对需要的朋友有所帮助!

1. 定义服务类

<?php  declare (strict_types=1);  namespace appapiservicecommon;  use thinkfacadeCache;  /**  * 缓存服务  * Class RedisService  *  * @package appapiservicecommon  */ 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 appapifacade;   use appapiservicecommonRedisService; use thinkFacade;  /**  * Class Redis  *  * @package appapifacade  *  * @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);

推荐:《最新的10个thinkphp视频教程》

赞(0)
分享到: 更多 (0)
网站地图   沪ICP备18035694号-2    沪公网安备31011702889846号