如何使用 Redis 在生产环境中访问多个不同的密钥?

How to access multiple, different keys in production using Redis?

我有一个应用程序,我在 Redis 中以以下格式存储数百万个密钥:

Type+#+Year+#+MachineType+#+City+#+State+#+Country+#+Size

Sample_Key                                   Value

Retail#2017#MachineA#SanFrancisco#CA#USA#500 1000
Bulk#2017#MachineB#NewYorkCity#NY#USA#1000   100000
Retail#2017#MachineA#NewYorkCity#NY#USA#1000 5000

我的客户会进来并想要一个特定的值或一组值的聚合,比如说,加利福尼亚州旧金山和纽约州纽约的所有内容,以便获得 1000 和 5000(然后我们执行一些聚合)。什么 Redis 函数最适合说 "Give me all values for keys that contain either San Francisco or New York",或 "Give me all keys for store sizes of 1000",或任何此类组合。

我需要获取所有这些值,聚合它们并以(理想情况下)毫秒级延迟提供服务。

我已经查找了 KEYS,他们说 NOT 不能在生产中使用(另外,我从来没有完全弄清楚如何获取两者的值(或者可能更多)cities/other 组合)。我查过 SCAN,但基于游标,它可能不是最佳解决方案。我看过的任何其他内容都完全涵盖了我以快速简便的方式描述的场景。帮忙?

你说的不使用 KEYS 是对的。在你的情况下 SCAN 也很糟糕,因为你必须迭代大量的键(数百万)。 SCAN不会阻塞其他命令太久,但总时间成本不会缩短。如果你经常运行SCAN命令,Redis的负载会很重。事实上我认为Redis不适合这种情况,RDBMS更好。

我有2条建议:

  1. 使用SCAN并注意潜在风险,做一些认真的测试。
  2. 在某个地方存储和维护一个键关系(例如City-Keys),首先找到你需要的键,然后从redis中获取这些键的值。在你的情况下,我建议将所有键放在 RDBMS table 中,并使用 LIKE 找到你需要的键(当然,使用搜索引擎如 solr 或 elasticsearch 在性能上要好得多)