Redis 利用返回值 進(jìn)行原子性緩存(php)

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 [];
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容