TODO : 在此之上, 是需要了解redis 如何對空數(shù)據(jù)進(jìn)行緩存
Redis 是常用的緩存系統(tǒng), 但是不正確的使用, 會導(dǎo)致一些異常情況
下面是我之前寫的, 一個對列表進(jìn)行緩存的操作, 支持對空列表的緩存
$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 = []; //對空數(shù)據(jù)進(jìn)行緩存
}
以上的代碼, 大多數(shù)情況沒有問題, 但是某些極端情況下, 在執(zhí)行type的時候, 這個key 存在, 但是下面執(zhí)行到zRange的時候, 這個key過期了, 就會導(dǎo)致idList 是一個空列表.
解決方法
$idList = $redis->zRange($key, $start, $end); // 直接執(zhí)行zrange操作
// 根據(jù)zRange的返回類型, 來判斷數(shù)據(jù)是否被緩存
if(is_array($idList) && empty($idList)){
// 如果zRange返回的是空數(shù)據(jù), 則說明數(shù)據(jù)沒有被緩存
self::loadCache($params);
$idList = $redis->zRange($key, $start, $end);
}
if($idList === false){ // 這里必須使用===來判斷
//如果zRange返回的是false, 則說明緩存中存在的數(shù)據(jù)類型不是zset , 我們認(rèn)為此時緩存的結(jié)果為空列表
return [];
}