列表与密钥扫描

时间:2014-05-28 10:02:26

标签: java redis key-value

我正在使用Redis来存储Java对象。例如,我有一个User(FirstName,LastName)类,每个用户有多个地址Address(Street,City)。

用户以Redis Hashes存储在数据库中:

HMSET user:0 firstname qwert lastname zuiop

由于地址在逻辑上与特定用户绑定,因此其密钥包括用户密钥:

HMSET user:0:addresses:0 street Teststreet city Exampletown

但是,我不确定如何提供以下功能:

  • 访问数据库中的所有用户
  • 访问属于特定用户的所有地址

基本上,我看到两个选项:

  1. 使用集合:

    SADD user user:0
    SADD user user:1
    ...
    SMEMBERS user (to access list of users)
    ...
    SADD user:0:addresses user:0:addresses:0
    SADD user:0:addresses user:0:addresses:1
    SMEMBERS user:0:addresses (to access list)
    
  2. 使用KEYS

    KEYS user:* (to access list of users)
    KEYS user:0:addresses:* (to access list of addresses)
    
  3. 这些方法有其他替代方案吗? 哪种方式更“Redis”?

1 个答案:

答案 0 :(得分:2)

重要提示:请勿在生产中使用KEYS - 它可以在Redis遍历密钥空间时阻止应用程序的请求。

list方法当然是一种方法,但我会考虑列表最终需要的空间量。或者,我将研究使用v2.8的新SCAN命令以非阻塞方式迭代键名模式。