Thinkphp6读取redis不带前缀

背景

跨系统读取 redis,如何自定义 key 值?

问题

不同的系统应用,公用 redis 时,由于每个系统配置的 redis 前缀不一样,读取公用 key 时就会读取不到。

(new \think\facade\Cache)->store('redis_remote')->get('wx_token');

举例:A应用默认 redis 前缀为 a_ ,B应用默认前缀为 b_,当 A应用读取 B应用生成的 key(b_wx_token)时,默认读取的是 a_wx_token 。

解决

查看底层实现 \think\cache\driver\Redis::__construct

public function __construct(array $options = [])
    {
        if (!empty($options)) {
            $this->options = array_merge($this->options, $options);
        }

        if (extension_loaded('redis')) {
            $this->handler = new \Redis;

            if ($this->options['persistent']) {
                $this->handler->pconnect($this->options['host'], (int) $this->options['port'], (int) $this->options['timeout'], 'persistent_id_' . $this->options['select']);
            } else {
                $this->handler->connect($this->options['host'], (int) $this->options['port'], (int) $this->options['timeout']);
            }

            if ('' != $this->options['password']) {
                $this->handler->auth($this->options['password']);
            }
        } elseif (class_exists('\Predis\Client')) {
            $params = [];
            foreach ($this->options as $key => $val) {
                if (in_array($key, ['aggregate', 'cluster', 'connections', 'exceptions', 'prefix', 'profile', 'replication', 'parameters'])) {
                    $params[$key] = $val;
                    unset($this->options[$key]);
                }
            }

            if ('' == $this->options['password']) {
                unset($this->options['password']);
            }

            $this->handler = new \Predis\Client($this->options, $params);

            $this->options['prefix'] = '';
        } else {
            throw new \BadFunctionCallException('not support: redis');
        }

        if (0 != $this->options['select']) {
            $this->handler->select($this->options['select']);
        }
    }

可以看到初始化后的 $this->handler是原始的 redis 连接,应用中修改代码如下即可实现自定义key值获取数据:

(new \think\facade\Cache)->store('redis_remote')->handler()->get('b_wx_token');
Author: thinkwei

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注