ThinkPHP遇到的坑
在使用thinkphp 遇到的问题
thinkphp 6版本redis不支持 setnx , 切换为原生
提示
在使用thinkphp6 think\Cache这个类,缓存set方法无法支持setnx,需要切换原生连接
原生redis
- redis原生的set方法支持 “加锁 + 过期 + 标识”,原子操作,安全可靠
SET key "name" nx EX 10
set($lockKey, $mch_bollno, ['nx', 'ex' => $day])
$lockKey :锁的名称
$mch_bollno : 键值
nx : 保证该 key 只能被设置一次,避免覆盖已有值
ex : 过期时间 (秒)thinkphp 获取原生的案例
/**
* 获取redis原生的链接
*/
public function _initialize()
{
$this->redis = Cache::handler();;
}
$mch_bollno = get_order_id();
$lockKey = "mch_billno".$openid;
$locked = $this->redis->set($lockKey, $mch_bollno, ['nx', 'ex' => 84000]);
if (!$locked) {
$mch_bollno = $this->redis->get($lockKey);
}thinkphp 6 Cache类的坑
提示
在我进行获取第三方的缓存场景中,通过thinkphp 的门面类Cache获取的报错问题
$res = Cache::store("main")->get("printer_online_" . $printer["printer_id"]);
这个缓存 printer_online_" . $printer["printer_id"] 是来源于其他项目中,
未通过 Cache:set 方法进行存储,报错 [8]unserialize(): Error at offset 0 of 136 bytes
/**
* 切换为原生的redis连接
*/
$res = Cache::store("main")->handler()->get("printer_online_" . $printer["printer_id"]);原因:Thinkphp 6 缓存机制默认行为
用 Cache::store('main')->set($key, $value) 存一个 数组或对象 时:
框架会自动调用 serialize($value) 转成类似
a:5:{s:15:"topic_new_order";s:17:"NewOrderChannel_B";...} 的格式;
用 Cache::get($key) 读取时:
框架自动调用 unserialize($raw_string) 还原为 PHP 数组重要
数据是 纯 JSON 字符串(以 { 开头),不是 PHP 序列化格式(应以 a: 开头),所以导致这个错误,php有单独的序列化格式
版权所有
版权归属:念宇
