Created
April 13, 2014 01:21
-
-
Save huangzworks/10564625 to your computer and use it in GitHub Desktop.
在复制模式下,如果主服务器不向从服务器显式地发送 DEL 命令以删除过期键,那么这个过期键会一直滞留在从服务器里面,尽管它已经过期了。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
127.0.0.1:12345> TTL key # 尚未过期 | |
(integer) 3 | |
127.0.0.1:12345> TTL key | |
(integer) 1 | |
127.0.0.1:12345> TTL key # 虽然键已经过期,但因为我阻塞住了主服务器, | |
(integer) 0 # 而主服务器没办法向从服务器发送 DEL 命令,所以值会一直滞留在从服务器里面。 | |
127.0.0.1:12345> GET key | |
"value" | |
127.0.0.1:12345> TTL key | |
(integer) 0 | |
127.0.0.1:12345> GET key | |
"value" | |
127.0.0.1:12345> TTL key | |
(integer) 0 | |
127.0.0.1:12345> GET key | |
"value" |
这样的话,尽管过期键还是会滞留在数据库里面,但对于用户来说是不可见的。
不过这种“将某些状况隐藏起来”的做法很容易带来其他隐藏的麻烦。
比如说,如果这种过期键有很多的话,用户看不见这些键,但是却发现 Redis 占用了很多额外的内存,那么用户可能会认为 Redis 发生了内存泄漏。
赞个!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
问一个问题,get从库时,会判断是否过期,如果过期直接miss就可以,而不是依然会去dict查找一遍,会有什么问题。
如: if(expireIfNeeded(db, key) > 0) return NULL;