Redis中的复合键/二级索引策略

时间:2017-07-25 23:21:53

标签: data-structures redis

假设我有一些我想要存储在Redis中的数据:

* UUID
* State (e.g. PROCESSED, WAITING_FOR_RESPONSE)
* […] other vals

UUIDState是我需要查询的唯一两个变量

  • Redis中最适合的数据结构是什么?
  • 我如何构建密钥?

2 个答案:

答案 0 :(得分:2)

好吧,不确定我完全理解,但试着去尝试。

假设您需要查找状态为PROCESSED的所有实体,您可以使用这些设置:

SADD PROCESSED 123-abcd-4567-0000

然后,您可以轻松找到PROCESSED状态的所有实体。你会为你想要的每个州做同样的事情。

SMEMBERS PROCESSED

现在,您还希望为所有实体及其值设置哈希值:

HSET 123-abcd-4567-0000 state PROCESSED
HSET 123-abcd-4567-0000 otherproperty valuedata

这将设置"状态"在要处理的UUID的哈希值中(您需要弄清楚如何保持这些UUID同步,您可以使用脚本或只是处理您的代码)

总而言之,你有两个主要结构:

  1. 设置将状态存储为UUID信息
    • 因此,每个州有1套
  2. 用于将UUID存储到属性信息的哈希值
    • 因此,您有1个哈希PER实体
  3. 示例哈希

    123-abcd-4567-0000 => { state: PROCESSED, active: true }
    987-zxy-1234-0000 => { state: PROCESSED, active: false }
    

    但如果这似乎不合适,请澄清一下。

    如果你想减少你的密钥空间,因为每个实体的哈希可以很多,你可以改为为每个属性创建一个哈希:

    HSET states 123-abcd-4567-0000 PROCESSED
    

    因此,每个属性都有一个哈希,你的密钥是UUID,value是属性的值,它是哈希密钥。

    示例哈希

    state => { 123-abcd-4567-0000: PROCESSED, 987-zxy-1234-0000: PROCESSED }
    active => { 123-abcd-4567-0000: true, 987-zxy-1234-0000: false }
    

答案 1 :(得分:0)

RediSearch (a Redis module) 支持向 Redis 中的现有数据添加二级索引,如 Hash。

为要索引的字段设置架构后,您可以根据这些字段值轻松搜索。

例如

127.0.0.1:6379> FT.CREATE myIdx ON HASH PREFIX 1 doc: SCHEMA title TEXT

127.0.0.1:6379> hset doc:1 title "mytitle" body "lorem ipsum" url "http://redis.io" 
(integer) 3

127.0.0.1:6379> FT.SEARCH myIdx "@title:mytitle" LIMIT 0 10
1) (integer) 1
2) "doc:1"
3) 1) "title"
   2) "mytitle"
   3) "body"
   4) "lorem ipsum"
   5) "url"
   6) "http://redis.io"