• 技术文章 >php框架 >ThinkPHP

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

    藏色散人藏色散人2021-08-26 09:00:30转载323
    下面由thinkphp框架教程栏目给大家分享ThinkPHP6中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);
    推荐:《最新的10个thinkphp视频教程

    以上就是分享TP6框架中Redis操作服务类的记录的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除
    专题推荐:ThinkPHP6 Redis
    上一篇:一文详解thinkphp控制器的定义和使用 下一篇:thinkphp中.htaccess文件的巧妙运用
    线上培训班

    相关文章推荐

    • 关于thinkphp6在命令行访问控制器• 解决ThinkPHP6控制器不存在app\controller\Index的问题• 关于web hooks服务器自动拉取代码php thinkphp6• 详解thinkphp6后台添加google登录验证• ThinkPHP6加载中间件及多应用解析

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网