最近在使用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上觸發上面兩個條件,在從中就永遠會被取到。。。
這真是個很容易踩到的坑啊。。。
推薦閱讀:
Ubuntu 12.10下安裝Redis(圖文詳解)+ Jedis串連Redis
Redis系列-安裝部署維護篇
CentOS 6.3安裝Redis
分場合可以對關聯式資料庫起到很好的補充作用。它提供了Python,Ruby,Erlang,PHP用戶端,使用很方便。
Redis 的詳細介紹:請點這裡
Redis 的:請點這裡