大家在使用redis的時候,經常會用expire來設定key的過期時間,以為某個key到期就會馬上清除。如果只是在單個redis(即乙個主redis)下是沒有問題的。但是如果為了實現讀寫分離,搭建了主從伺服器,那麼就會遇上從庫key不失效的問題了。(使用redis3.2以後版本的同學請忽略,3.2之後的版本已不存在以下問題)
場景重現:
主: setex name 20 johny
從:get name >> johny
ttl name >> 18
// 過了一分鐘...
// 發現name這個key已經失效了
ttl name >> -1
get name >> johny // 仍然能獲取到key的值
主:get name >> nil // 主redis伺服器上獲取不到
從:get name >> nil // 此時,從redis伺服器上也獲取不到了
redis key的三種過期策略
惰性刪除:當讀/寫乙個已經過期的key時,會觸發惰性刪除策略,直接刪除掉這個過期key,很明顯,這是被動的!
定期刪除:由於惰性刪除策略無法保證冷資料被及時刪掉,所以 redis 會定期主動淘汰一批已過期的key。(在第二節中會具體說明)
主動刪除:當前已用記憶體超過maxmemory限定時,觸發主動清理策略。主動設定的前提是設定了maxmemory的值
redis刪除過期key的原始碼
int expireifneeded(redisdb *db, robj *key)
/* return when this key has not expired */
if (time(null) <= when) return 0;
/* delete the key */
server.stat_expiredkeys++;
propagateexpire(db,key);
return dbdelete(db,key);
}
通過以上原始碼發現,4行:沒有設定超時時間,則不刪;7行:在"loading"時不刪;16行:非主庫不刪;21行未到期不刪。25行同步從庫和檔案。
所以說,在從庫執行主動刪除操作,或者通過惰性刪除的方式觸發刪除key的操作,最終都不會執行成功。原因就在上面的第16行**。
參考:
Redis 主從模式
1 主從沒有選舉的說法,從伺服器指定主伺服器即可 2 主從同步可以分以下2大類 主從全量同步 1 rdb同步過去 2 增量命令同步過去 增量複製,主機具備乙個快取積壓區 固定fifo的佇列。主從增量同步 注意下結構 從機器傳送同步命令 主機id,offset 先看主機的id和之前的主機id是否一致,...
Redis主從同步
redis分布式模型,在cap定理中,使用了ap的模型,即保證了可用性與分割槽容錯。redis採用了base最終一致性原理,來保證最終資料的一致,即可以允許出現資料不一致的狀態。redis使用指令流的方式 類似aof指令 進行同步資訊,主節點一邊傳送指令至從節點,從節點一遍執行該指令,一邊將自己的同...
Redis主從配置
redis主從配置 進入正題,這篇會將redis以 windows10服務形式提供服務 搭建乙個簡單的主從複製 m 6379 s 6380 6381 redis 我這裡使用的是 redis3.2.100.zip 解壓後如下圖 直接雙擊redis server.exe即啟動乙個 redis 服務例項,...