1

我有一个 Redis 数据库,里面有数百万个键。随着时间的推移,我写入和读取的密钥发生了变化,因此有许多密钥我根本不再使用。大多数也没有任何类型的TTL。

我想了解 Redis 数据库中有多少百分比的键不再使用。我在想我可以使用 hyperloglog 来估计正在写入的键数量的基数,但似乎需要PFADD为每个被写入和读取的键做很多工作。

需要明确的是,我还不想删除任何内容,我只想对数据库中使用的键的数量进行一些分析。

4

2 回答 2

4

我将从scan遍历键的命令开始,并object idletime在每个键上使用该命令来收集自上次使用键以来的秒数。从那里你可以生成你喜欢的指标。

使用 Redis 的一种方法是使用排序集,其中键的空闲时间作为其分数。zrange这与 HLL 相比的优势在于,您可以使用and/or说“给我在 x 和 y 秒前空闲的密钥” zrevrange。然后,您可以将其结果用于删除、存档或设置 TTL 等操作。使用 HLL,您无法做到这一点。

另一个优点是,除非您将结果存储在 Redis 中,否则运行时只有 Redis 成本。例如,在访问密钥时,您不必修改代码来执行其他操作。

如果我记得的话,物体空闲时间的准确度大约是十秒左右。但是为了了解在给定的时间范围内有多少和哪些键没有被访问,它应该可以正常工作。

于 2016-08-27T11:31:17.143 回答
0

您可以使用时间窗口分析数据,并使用 ahyperloglog来估计每个时间窗口的基数。

例如,您可以使用 ahyperloglog进行每天的分析:

// for each key that has been read or written in day1
// add it to the corresponding hyperloglog
pfadd key-count-day1 a b
pfadd key-count-day1 c d e

// for each key that has been read or written in day2
// add it to the corresponding hyperloglog
pfadd key-count-day2 a
pfadd key-count-day2 c

在这种情况下,您可以获得在第 N 天活动的密钥的估计数量其密钥为。hyperloglogkey-count-dayN

使用pfcount,您可以获得每天或几天的活动密钥数。

// number of active keys in day2: count2
pfcount key-count-day2

// number of active keys in day1 and day2: count-total
pfcount key-count-day1 key-count-day2

通过这 2 个计数,您可以计算自第 2 天以来未使用的密钥的百分比:(count-total - count2) / count-total

于 2016-08-27T01:06:10.287 回答