如何在Redis中分析约500K个密钥的最佳方法?

我有一个处理针对逻辑对象的读操作的数据库系统,这些对象由OID(对象标识符)标识。例如,1.2.4.3.544。有由GUID标识的用户。API从数据库中获取结果并将它们放入Redis中。密钥示例为

SomePrefix_<oid>1.2.4.3.544</oid>_somedetails_<user>1f0c6cfe-ee9d-472c-b320-190df55f9527</user>

系统中大约有数百个唯一的OID和约一百个注册用户。还可以为匿名请求设置没有用户部分的密钥。密钥数量可以从80K到..我想是500K。 我需要向UI提供按OID和按用户的统计数据,并实现按OID删除的可能性(对于用户是相同的)。所以这项任务被分成两个部分。我最初实施的第一个版本失败了——我在c#应用程序中使用了.Keys("\ * ")方法,它会转换为Redis扫描*以获取所有键,以便将它们传递到应用程序中运行,收集和区分OID /用户,并在UI中显示它们。这个操作花费太多时间提取所有键到应用程序中,所以我换了一种方法——在每次保存/删除密钥时,我会增加/减少存储在Redis中的另一个DB中的计数器。计数器只是有键的整数。这几乎可以,但是我得到了设置每个缓存请求的TTL的要求,所以我面临着一个问题,如何存储/跟踪我的统计信息,以使其与实际存储的密钥保持最新?我认为的选项

A)运行LUA脚本来扫描所有密钥并获取所有唯一OIDS和唯一用户以及计数,并将它们返回给应用程序。对于删除选项-在LUA脚本内运行SCAN并删除与模式匹配的所有密钥。利弊-不需要单独的统计跟踪。缺点-需要每次调用都扫描所有键。我有一个用于通过我的应用程序请求的显示统计信息的Zabbix仪表板,可能每秒扫描键会非常痛苦。这些是缺点。

B)在单独的Redis DB中,使用键作为OID(或对于用户,键作为GUID)存储键和集合,集合内存储缓存请求的键。但是当缓存请求的键过期时,我该如何删除它们?我可以以某种方式将存储在集合中的值与另一个DB中的键关联起来,并在键过期时使该值从集合中消失吗?

点赞