【发布时间】:2013-12-29 16:13:05
【问题描述】:
我在 Java 应用程序中使用 Redis,我在其中读取日志文件,在 Redis 中为每个日志存储/检索一些信息。密钥是我日志文件中的 IP 地址,这意味着它们总是即将到来的新闻密钥,即使它们经常出现。
在某个时候,Redis 达到了它的最大内存大小(在我的例子中是 3gb),并开始驱逐一些键。我使用“allkeys-lru”设置,因为我想保留最年轻的键。
然后整个应用程序变慢了很多,比开始时花费了 5 倍。 所以我有三个问题:
- 出现如此剧烈的减速(5 倍以上)是否正常?有没有人经历过这样的减速?如果没有,我的代码中可能还有另一个问题(不太可能,因为减速恰好在 Redis 达到其限制时出现)
- 我可以改进我的配置吗?我尝试更改 maxmemory-samples 设置但没有取得多大成功
- 我应该为我的特定问题考虑替代方案吗?是否有一个内存数据库可以处理具有更好性能的驱逐键?我可能会考虑一个纯 Java 对象(HashMap...),即使它看起来不是一个好的设计。
编辑 1: 我们在 Redis 中使用了 2 个数据库
编辑 2: 我们使用 redis 2.2.12 (ubuntu 12.04 LTS)。进一步的调查解释了这个问题:我们在 redis 中使用 db0 和 db1。 db1 的使用比 db0 少得多,而且 key 完全不同。当 Redis 达到最大内存(并且 LRU 算法开始驱逐键)时,redis 确实删除了几乎所有 db1 键,这大大减慢了所有调用。这是一种奇怪的行为,可能不寻常,并且可能与我们的应用程序有关。我们通过为 db1 中加载的键移至另一种(更好的)内存机制来解决此问题。
谢谢!
【问题讨论】: