【问题标题】:How can I get all keys for a user in redis如何在redis中获取用户的所有密钥
【发布时间】:2020-12-30 16:30:51
【问题描述】:

我目前正在研究使用 redis 来管理星号的黑白名单来管理垃圾邮件呼叫。由于 redis 是一个键值存储,因此检查电话号码是否在数据库中非常好。我可以在商店的价值部分存储一些额外的信息,并使用电话号码作为密钥。我有2个问题是 A)一个电话号码可以在密钥中多次出现,因为它会针对不同的用户。因此,由于密钥在 db 中必须是唯一的,因此我认为最好的方法是使用用户:电话号码之类的密钥。有没有一种方法可以获取给定用户的所有记录:在密钥中,或者如果我有完整的密钥,我只能获取数据

B)当我将电话号码存储为密钥时,我可以使用 user:+2135551212 之类的东西还是 + 键会导致问题?

【问题讨论】:

  • 获取给定用户的所有记录是您唯一需要的查询吗?
  • 在我的情况下,我将存储要阻止的 nbrs 黑名单。该块可以用于系统或单个用户或两者。因此,电话 nbr 可以在数据库中不止一次。在传统的数据库中,我将拥有一个 join 或多个记录,这些记录类似于 owner 的 id。但是由于 redis 是基于密钥的,我不确定如何使这项工作不失去速度的好处。如果我将其存储在哈希中,我将无法查询所有者。
  • 如果适合您,您可以使用 Redis SET 来存储唯一的电话号码。如果您需要将电话号码映射到用户,请尝试使用哈希映射。

标签: redis


【解决方案1】:

回答您的第一个问题:不,您不需要完整的密钥来获取给定用户的所有记录。 Redis 提供了通配符匹配项,您可以在自己的情况下使用这些匹配项。例如:

127.0.0.1:6379> set john:1234567890 johnOne
OK
127.0.0.1:6379> set john:0987654321 johnTwo
OK
127.0.0.1:6379> keys john*
1) "john:1234567890"
2) "john:0987654321"
127.0.0.1:6379> 

我设置了两个键,用户 'john' 后跟不同的电话号码,所以当我需要所有以 john 开头的键时,我们可以使用 'keys john*' 来获取所有以 'john' 开头的键'。

要回答您的第二部分,是的,您可以在键中使用“+”而没有任何问题。再举个例子:

127.0.0.1:6379> set user:+1234567890 helloagain
OK

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多