2013-11-04 35 views
1

我在Redis有一个特定的缓存系统。如何使用redis保持密钥,如果不使用则过期?

该系统的内容非常不稳定,并且值始终被添加和删除。我想尽可能将“已用”键保留在内存中,同时让旧键过期。 每个请求可能需要缓存中的数百个密钥。

我知道我可以设置一个“足够长”的过期时间,并且只处理Cache未命中,但是我希望尽可能少地错过。

目前我正在做这样的事情,当我写入/读取到缓存中(伪代码)

# write 
write(key, value) 
expire(key, ttl) 

# read 
read(key) 
expire(key, ttl) 

我可以优化通过流水线的读取。

现在看起来这还不是最好的方法。 有人可以给我一个更好的策略吗?

+0

我认为你目前的做法是最好的。从http://redis.io/commands/expire - >刷新到期,*可以使用作为已有过期集合的键的参数调用EXPIRE。在这种情况下,密钥的生存时间更新为新值。* – fedorqui

+0

正是您应该这样做(但一定要使用流水线)。 –

回答

1

如果你能(当前)分辨率10秒住那么OBJECT IDLETIME命令将让你得到的东西还没有被使用了一段美好的感觉(在10秒块)

> SET X 10 
OK 
> OBJECT IDLETIME X 
10 
0

如果你正在努力实现是一个完美的LRU缓存(最近最少使用),你可以调整的Redis到这样的表现在全球,这里是关于Redis的作为LRU链接: http://oldblog.antirez.com/post/redis-as-LRU-cache.html

注意,它使用maxmemory redis上的属性和驱逐规则是全局的,除非你看看volatile volatile LRU:How to make Redis choose LRU eviction policy for only some of the keys?

您正在使用自定义过期/ TTL驱逐的手动解决方案,这是最强大的解决方案,但也许您可以简化配置并使用此解决方案在内存大小上具有更好的可预测高速缓存。