Skip to content

Instantly share code, notes, and snippets.

@huangzworks
Created April 13, 2014 01:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save huangzworks/10564625 to your computer and use it in GitHub Desktop.
Save huangzworks/10564625 to your computer and use it in GitHub Desktop.
在复制模式下,如果主服务器不向从服务器显式地发送 DEL 命令以删除过期键,那么这个过期键会一直滞留在从服务器里面,尽管它已经过期了。
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"
@git-hulk
Copy link

问一个问题,get从库时,会判断是否过期,如果过期直接miss就可以,而不是依然会去dict查找一遍,会有什么问题。
如: if(expireIfNeeded(db, key) > 0) return NULL;

@huangzworks
Copy link
Author

这样的话,尽管过期键还是会滞留在数据库里面,但对于用户来说是不可见的。

不过这种“将某些状况隐藏起来”的做法很容易带来其他隐藏的麻烦。

比如说,如果这种过期键有很多的话,用户看不见这些键,但是却发现 Redis 占用了很多额外的内存,那么用户可能会认为 Redis 发生了内存泄漏。

@git-hulk
Copy link

赞个!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment