1. 程式人生 > >redis主從不同步問題處理

redis主從不同步問題處理

近期遇到的問題如下:

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上觸發上面兩個條件,在從中就永遠會被取到。。。