TODO : 在此之上, 是需要了解redis 如何对空数据进行缓存
Redis 是常用的缓存系统, 但是不正确的使用, 会导致一些异常情况
下面是我之前写的, 一个对列表进行缓存的操作, 支持对空列表的缓存
$cacheType = $redis->type($key);
if (empty($cacheType)) {
self::loadCache($params); // 如果是空列表, 则将一个string 存入key 中,否则使用zAdd 存入列表
$cacheType = $redis->type($key);
}
if ($cacheType == Redis::REDIS_ZSET) {
$idList = $redis->zRange($key, $start, $end);
}elseif($cacheType == Redis::REDIS_STRING){
$idList = []; //对空数据进行缓存
}
以上的代码, 大多数情况没有问题, 但是某些极端情况下, 在执行type的时候, 这个key 存在, 但是下面执行到zRange的时候, 这个key过期了, 就会导致idList 是一个空列表.
解决方法
$idList = $redis->zRange($key, $start, $end); // 直接执行zrange操作
// 根据zRange的返回类型, 来判断数据是否被缓存
if(is_array($idList) && empty($idList)){
// 如果zRange返回的是空数据, 则说明数据没有被缓存
self::loadCache($params);
$idList = $redis->zRange($key, $start, $end);
}
if($idList === false){ // 这里必须使用===来判断
//如果zRange返回的是false, 则说明缓存中存在的数据类型不是zset , 我们认为此时缓存的结果为空列表
return [];
}
网友评论