如何在redis中搜索哈希键?

Hee*_*era 32 redis

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

 hmset user:1 user_name lee  age 21
 hmset user:2 user_name david  age 25
 hmset user:3 user_name chris  age 25
Run Code Online (Sandbox Code Playgroud)

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

Did*_*zia 56

你不能.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
Run Code Online (Sandbox Code Playgroud)

  • 如果要执行单个往返,服务器端Lua脚本将执行您想要的操作(即烧结,然后每个选定项目一个hgetall). (5认同)

cod*_*ori 6

Acually 你可以通过将值放入键来做到这一点

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
Run Code Online (Sandbox Code Playgroud)

现在您可以使用“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"
Run Code Online (Sandbox Code Playgroud)

最后找到特定的哈希值

127.0.0.1:6379> HGETALL lee:24
1) "user_name"
2) "lee"
3) "age"
4) "24"
Run Code Online (Sandbox Code Playgroud)

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

  • 虽然这可能有效,但我真的建议不要使用它来构建任何严肃的东西。在 Redis 文档中,有一个针对在生产环境中使用 KEYS 命令的特定警告,因为它会降低大型数据库中的性能:https://redis.io/commands/keys。 (8认同)