redis主從不同步問題處理
阿新 • • 發佈:2019-02-14
近期遇到的問題如下:
1 在主上setex的key即使過期後在從上也始終get的到。
重現:
主: setex abc 20 test
從:
get abc >> test
ttl abc >> 18
...
ttl abc >> -1
get abc >> test (這裡竟然還有~!)
主:get abc >> nil
從:get abc >> nil
所以如果只在從上獲取一個key,需要根據get+ttl來判斷一個key是否已經過期。
因redis會出現主從不同步問題,故先判斷ttl,若ttl>0,直接取redis;若是ttl<=0,則再根據業務處理。
查了下,也有人吐槽這個問題:http://code.google.com/p/redis/issues/detail?id=519
2 在從上進行讀寫操作,過期時間不生效
重現:
redis 127.0.0.1:6379> get abctest
(nil)
redis 127.0.0.1:6379> setex abctest 20 test
OK
redis 127.0.0.1:6379> get abctest
"test"
redis 127.0.0.1:6379> ttl abctest
(integer) 10
redis 127.0.0.1:6379> ttl abctest
(integer) -1
redis 127.0.0.1:6379> get abctest
"test" (這裡竟然還取得出來。。)
分析
這個現象就是像說從從來不負責刪除key,刪除key只是主負責的。而由於redis自身刪除key的機制是
1 隨機選取一定比例的過期key
2 get觸發過期刪除。
所以導致在master上設定了過期的key如果不在master上觸發上面兩個條件,在從中就永遠會被取到。。。