背景
项目在运行中,有redis 数据,但是部署的环境 从低版本升级到 7+,发现很多问题,比如session 的锁,比如
redis 的很多方法都被php-redis弃用了,然后在考虑整体升级 ci 框架和升级驱动的考虑下,选择了谨慎 的只是
升级redis 的驱动 还有session 的驱动(因为session 也是用了redis 作为存储)
问题
发现接口中的redis 缓存不起作用了,对比了源码才发现 升级后 redis save 的使用方法发生了改变,存储在redis
的数据类型从 key=>value 类型转为 hash 类型
低版本
public function save($id, $data, $ttl = 60, $raw = FALSE)
{
if (is_array($data) OR is_object($data))
{
if ( ! $this->_redis->sIsMember('_ci_redis_serialized', $id) && ! $this->_redis->sAdd('_ci_redis_serialized', $id))
{
return FALSE;
}
isset($this->_serialized[$id]) OR $this->_serialized[$id] = TRUE;
$data = serialize($data);
}
elseif (isset($this->_serialized[$id]))
{
$this->_serialized[$id] = NULL;
$this->_redis->sRemove('_ci_redis_serialized', $id);
}
//@todo 保存方法
if ($ttl == 0) {
return $this->_redis->set($id, $data);
}
return $this->_redis->set($id, $data, $ttl);
}
新版本
public function save($id, $data, $ttl = 60, $raw = FALSE)
{
switch ($data_type = gettype($data))
{
case 'array':
case 'object':
$data = serialize($data);
break;
case 'boolean':
case 'integer':
case 'double': // Yes, 'double' is returned and NOT 'float'
case 'string':
case 'NULL':
break;
case 'resource':
default:
return FALSE;
}
//@todo 这里是 hash 保存
if ( ! $this->_redis->hMSet($id, array('__ci_type' => $data_type, '__ci_value' => $data)))
{
return FALSE;
}
else
{
$this->_redis->{static::$_sRemove_name}('_ci_redis_serialized', $id);
}
return TRUE;
}
解决方法
redis-cli keys "key*" | xargs redis-cli del
删除对应所有的 redis 缓存,问题 解决
疑问
version_compare(phpversion('phpredis'), '5', '>=')
新版本中对比的扩展是phpredis
但是我发现 只有用redis 的时候才能获取值
所以我修改成
version_compare(phpversion('redis'), '5', '>=')