您的位置 首页 php

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

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

1. 定义服务类

<?phpdeclare (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

<?phpnamespace 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);

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

文章来源:智云一二三科技

文章标题:分享TP6框架中Redis操作服务类的记录

文章地址:https://www.zhihuclub.com/24827.shtml

关于作者: 智云科技

热门文章

网站地图