redis主從遇到的兩個坑


最近在使用redis主從的時候做了下面兩件事情:

1 希望redis主從從操作上分析,所有寫操作都在master上寫,所有讀操作都在從上讀。

2 由於redis的從是放在本地的,所以有的key的讀寫操作就直接放在從上操作了。

但是出現了下面的幾個問題:

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是否已經過期

查了下,也有人吐槽這個問題: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上觸發上面兩個條件,在從中就永遠會被取到。。。

這真是個很容易踩到的坑啊。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM