我的用例: 我使用Redis存储大量数据。 在1秒内,我用redt写24k键,ttl为30分钟,我希望在ttl过期后删除键。 驱逐密钥的当前redis实现是在任务中工作,每个任务挑选20个随机密钥并查看密钥是否已过期ttl然后删除这些密钥,redis建议不要使用超过100个这样的任务。所以,如果我把hz(没有任务到100)那么Redis将能够清除tke键max @ 2000 keys / sec,这对我来说太少了,因为我的插入速率非常高,最终导致内存中的内存不足异常满满的。
替代方案我有: 1 /命中随机密钥或我们知道已过期的密钥,这将在Redis中启动删除 2 /达到maxmemory时设置驱逐政策。当达到最大内存时,这将主动删除redis密钥。 3 /将hz(频率)设置为更高的值。这将启动更多任务,每秒清除过期的密钥。 1 /似乎不可行。 对于2 /& 3 / 基于30分钟的当前缓存计时器,并给出插入速率,我们可以使用 maxmemory 12 * 1024 * 1024 maxmemory-samples 10 maxmemory-policy volatile-ttl hz 100
但是使用2意味着redis将一直执行删除键然后插入,因为我假设在我的情况下内存总是等于12 GB
使用此策略是否合适,或者我们应该在Redis上编写自己的密钥驱逐服务?
答案 0 :(得分:0)
您使用的是Azure Redis缓存吗?如果是,您可以考虑使用群集。群集中最多可以有10个分片,这有助于您分享所有不同的分数。用于不同操作的键。
答案 1 :(得分:0)
我认为,对你的问题做出明确答案的唯一方法就是写一个测试。类似于您的实际工作负载的综合测试应该不难创建,并且会让您知道redis是否可以尽快插入密钥以及更改hz
值对性能的影响。
使用maxmemory也应该是一个可行的策略。将意味着分配的内存可能总是满的,但应该可以工作。
另一种方法是减少要写入的键数。如果要写入的键包含字符串值,则可以将它们写入redis哈希字段。
例如,如果您的插入内容如下所示:
redis.set "aaa", value_a
redis.set "bbb", value_b
您可以使用哈希:
# current_second is just a timestamp in seconds
redis.hset current_second, "aaa", value_a
redis.hset current_second, "bbb", value_b
通过在其键中写入当前时间戳的哈希并在整个哈希值上设置TTL redis只需每秒驱逐一个键。
鉴于在redis中使用哈希的一些优点,如果你的用例兼容,我希望哈希方法表现最佳。
在决定之前可能值得测试。