redis类型 tp5_【redis专题(12)】正确优雅的在ThinkPHP5中使用redis

TP5的redis驱动在项目中使用遇到的问题

缓存的Key前缀取的是config中配置的,没有单独管理。

不能使用redis一些本身高级命令,比如sadd等。

一些常用的操作可以再次封装,比如分布式锁等。

key的管理类

key要统一管理起来,便于后续的阅读以及扩展

namespace libs;

/**

* 缓存key映射类:缓存KEY要统一配置,便于后期批量更改和管理

* 注意其命名规则: 项目名:模块名:名称:类型 tkmall:mem:uid:hash

* Class CacheKeyMap

* @package libs

*/

class CacheKeyMap

{

public static $prefix = 'tkmall:';

/**

* 基于会员uid的hash,管理会员资料

* @param $uid

* @param int $prefix

* @return string

*/

public static function memberUidHash($uid,$prefix=0)

{

if($prefix){

// 用于keys,scan等命令

return self::$prefix . 'mem:' . $uid .':*';

}

return self::$prefix . 'mem:' . $uid .':hash';

}

}

libsRedis

namespace libs;

use think\cache\driver\Redis as tpRedis;

/**

* 定制化的redis

* Class Redis

* @package libs

*/

class Redis extends tpRedis{

protected static $_instance = null;

/**

* 获取单例redis对象,一般用此方法实例化

* @return Redis|null

*/

public static function getInstance()

{

if(!is_null(self::$_instance)){

return self::$_instance;

}

self::$_instance = new self();

return self::$_instance;

}

/**

* 架构函数

* Redis constructor.

*/

public function __construct()

{

$options = config('cache.redis');

$options['prefix'] = CacheKeyMap::$prefix;

parent::__construct($options);

}

/**

* 覆写,实际的缓存标识以CacheKeyMap来管理

* @access protected

* @param string $name 缓存名

* @return string

*/

protected function getCacheKey($name)

{

return $name;

}

/**

* redis排重锁

* @param $key

* @param $expires

* @param int $value

* @return mixed

*/

public function redisLock($key, $expires, $value = 1)

{

//在key不存在时,添加key并$expires秒过期

return $this->handler()->set($key, $value, ['nx', 'ex' => $expires]);

}

/**

* 调用缓存类型自己的高级方法

* @param $method

* @param $args

* @return mixed|void

* @throws \Exception

*/

public function __call($method,$args){

if(method_exists($this->handler, $method)){

return call_user_func_array(array($this->handler,$method), $args);

}else{

exception(__CLASS__.':'.$method.'不存在');

return;

}

}

}

服务提供者配置

app/provider.php

// 应用容器绑定定义

return [

'redis' => 'libs\Redis'

];

使用

$redis = $this->app['redis'];

$redis->hMSet(CacheKeyMap::memberUidHash($uid), ['name' => 'Joe', 'salary' => 2000]);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值