0

我的用例:我使用 Redis 来存储大量数据。在 1 秒内,我在 redis 中写了大约 24k 个密钥,ttl 为 30 分钟,我希望在 ttl 过期后删除这些密钥。当前 redis 驱逐密钥的实现是在任务中工作,每个任务选择 20 个随机密钥并查看密钥是否已过期 ttl 然后删除这些密钥,redis 建议使用不超过 100 个此类任务。因此,如果我设置 hz(没有任务到 100),那么 Redis 将能够清除 tke 键 max @ 2000 个键/秒,这对我来说太少了,因为我的插入率非常高,最终导致内存不足时出现内存异常变满。

我的替代方案是: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 上编写自己的密钥驱逐服务?

4

2 回答 2

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 中使用散列的一些优点,我希望散列方法在您的用例兼容的情况下表现最佳。

在决定之前可能值得测试。

于 2017-06-01T22:19:22.447 回答
0

你在使用 Azure Redis 缓存吗?如果是,您可以考虑使用集群。集群中最多可以有 10 个分片,这将帮助您分担所有不同编号的负载。用于不同操作的键。

于 2017-06-01T10:47:56.180 回答