【问题标题】:How to search in redis for hash keys?如何在redis中搜索哈希键?
【发布时间】:2017-07-12 12:15:07
【问题描述】:

我正在使用哈希键来存储用户详细信息,例如:

 hmset user:1 user_name lee  age 21
 hmset user:2 user_name david  age 25
 hmset user:3 user_name chris  age 25

我需要搜索具有age = 25name = lee 的用户。如何在给定字段中搜索指定值?

【问题讨论】:

标签: redis


【解决方案1】:

你不能。 Redis 是键值对存储,而不是关系数据库。

为了搜索特定的数据,您需要建立一个访问该数据的路径。例如,要获取年龄 = 25 的用户,您需要构建一个索引来将年龄值映射到用户。可以用一组来完成。名称也是如此。

一旦您有了年龄和姓名的集合,您就可以通过相交集合来搜索用户。例如:

# Add 3 users
hmset user:1 user_name lee age 21
hmset user:2 user_name david age 25
hmset user:3 user_name chris age 25

# Maintain age index
sadd age:21 1
sadd age:25 2 3

# Maintain name index
sadd name:lee 1
sadd name:david 2
sadd name:chris 3

# Get the ID of users having age = 25 and name = lee
sinter age:25 name:lee
  -> will return an empty set

【讨论】:

  • 我面临同样的设计问题,但我的问题是在命令“sinter age:25 name:lee”之后,结果应该是 id 列表。所以我需要第二次查询才能得到真实的用户数据。这是唯一的方法吗?
  • 如果您想执行单次往返,服务器端 Lua 脚本将执行您想要的操作(即烧结,然后每个选定项目一个 hgetall)。
  • 维护 HASH 本身没有意义,因为您已经存储了所有 HASH 字段的反向索引。
  • 那么在 Redis 中使用散列而不只是将编组的对象(如 JSON)保存为字符串的唯一优点是您可以获取单个字段?
【解决方案2】:

实际上,您可以通过将值放入键中来做到这一点

HMSET lee:25 user_name lee age 25
HMSET massi:43 user_name massi age 43
HMSET lee:24 user_name lee age 24
HMSET lee:28 user_name lee age 28 city Berlin

现在您可以使用“keys”命令找到它们

127.0.0.1:6379> keys *:25
1) "lee:25"
127.0.0.1:6379> keys lee*
1) "lee:25"
2) "lee:24"
3) "lee:28"
127.0.0.1:6379> keys massi:43
1) "massi:43"

终于找到具体的哈希了

127.0.0.1:6379> HGETALL lee:24
1) "user_name"
2) "lee"
3) "age"
4) "24"

我所说的是,您可以分两步完成,将所需的任意数量的值放入键中,然后找到它们。但是请考虑将所有值放入 key 中并不是一个好主意,只需放入您需要进行过滤的值即可。干杯:)

【讨论】:

  • 虽然这可能有效,但我真的建议不要这样做,以构建任何严肃的东西。在 Redis 文档中,有一个针对在生产环境中使用 KEYS 命令的特定警告,因为它会降低大型数据库的性能:redis.io/commands/keys
猜你喜欢
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 2016-06-27
  • 2013-02-08
  • 2017-02-15
  • 1970-01-01
相关资源
最近更新 更多