假设redis实例中的所有键都具有过期集,则volatile-lru和allkeys-lru是相似的。但是,移除 key 后,两者之间在性能上有显着差异吗?
奖励问题:
在两个使用allkeys-lru策略配置的不同实例之间,它们具有相同的内容和相同的配置,除了:
除了实例A中由于过期位导致的内存开销外,通过allkeys-lru算法删除 key 时,两者之间是否存在性能差异?
在这两种情况下,我都在谈论在达到最大内存时(最大键为散列),Linux 64位上的redis 2.4.x实例,其中maxmemory = 3Gb,具有4-5000个键。
谢谢
最佳答案
redis.c, line 2311, unstable branch:
/* volatile-lru and allkeys-lru policy */
else if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU ||
server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU)
{
for (k = 0; k < server.maxmemory_samples; k++) {
sds thiskey;
long thisval;
robj *o;
de = dictGetRandomKey(dict);
thiskey = dictGetKey(de);
/* When policy is volatile-lru we need an additonal lookup
* to locate the real key, as dict is set to db->expires. */
if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU)
de = dictFind(db->dict, thiskey);
o = dictGetVal(de);
thisval = estimateObjectIdleTime(o);
/* Higher idle time is better candidate for deletion */
if (bestkey == NULL || thisval > bestval) {
bestkey = thiskey;
bestval = thisval;
}
}
}
似乎所有事物都相等严格地说
allkeys-lru
会更快,但是并不是很大。很有可能我们谈论的速度不超过一微秒的几分之一。第二个问题已经回答了很多,但是以防万一:看来
allkeys-lru
设置多少个 key 到期,或者是否有 key ,这没有什么区别。您的示例中的实例A和实例B在通过lru算法清除 key 时都将看到相同的性能。关于performance - Redis maxmemory-policy : performances of volatile-lru vs allkeys-lru,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12892396/