如何在Redis中反向查找?

时间:2014-02-13 23:41:06

标签: nosql redis

是否可以使用Redis按键OR值进行查找?我需要存储电子邮件地址的主列表,为每个地址分配UUID,但能够通过使用其他数据来查找ID或ADDRESS。我找不到明确的“是”或“否”。任何例子都将不胜感激。

3 个答案:

答案 0 :(得分:3)

您需要创建2个哈希图:

  1. 从UUID到电子邮件(uuid_to_email)
  2. 的Hashmap
  3. 从电子邮件到UUID的Hashmap(email_to_uuid)
  4. 例如:

    > hset uuid_to_email 39315120-9581-11e3-9c4e-0002a5d5c51b foo@bar.com
    > hset email_to_uuid foo@bar.com 39315120-9581-11e3-9c4e-0002a5d5c51b
    

    然后要检索该值,请使用从您拥有的值映射的hashmap。如果您有UUID,请使用uuid_to_email:

    > hget uuid_to_email 39315120-9581-11e3-9c4e-0002a5d5c51b
    "foo@bar.com"
    

    如果您有电子邮件,请使用email_to_uuid:

    > hget email_to_uuid foo@bar.com
    "39315120-9581-11e3-9c4e-0002a5d5c51b"
    

答案 1 :(得分:2)

您可以将键和值存储为两者的组合

redis 127.0.0.1:6379> SET XXX:abc@yahoo.com XXX:abc@yahoo.com
OK
redis 127.0.0.1:6379> SET YYY:xyz@gmail.com YYY:xyz@gmail.com
OK
redis 127.0.0.1:6379> keys YYY:*
1) "YYY:xyz@gmail.com"
redis 127.0.0.1:6379> keys *:xyz@gmail.com
1) "YYY:xyz@gmail.com"
redis 127.0.0.1:6379> keys XXX:*
1) "XXX:abc@yahoo.com"
redis 127.0.0.1:6379> keys *:abc@yahoo.com
1) "XXX:abc@yahoo.com"

DRAWBACK::即使它非常快但它会在那段时间内阻止服务器,而且你还必须在申请时拆分它。

更好的方法: - :以这种方式存储两个密钥,您的查找速度非常快O(1),您不必在应用程序级别进行拆分

redis 127.0.0.1:6379> SET XXX abc@gmail.com
OK
redis 127.0.0.1:6379> SET abc@gmail.com XXX
OK
redis 127.0.0.1:6379> SET YYY xyz@gmail.com
OK
redis 127.0.0.1:6379> SET xyz@gmail.com YYY
OK
redis 127.0.0.1:6379> GET XXX 
"abc@gmail.com"
redis 127.0.0.1:6379> GET abc@gmail.com
"XXX"
redis 127.0.0.1:6379> GET YYY
"xyz@gmail.com"
redis 127.0.0.1:6379> GET xyz@gmail.com
"YYY"

抽奖:更多空间

答案 2 :(得分:0)

这样做的方法是使用redis集的强大功能。由于您希望能够保留空间,因此将散列键与其值结合使用作为保存索引的反向查找集是有意义的。

在以下示例中,我想存储有关用户姓名,喜欢和居住地的信息。然后我希望能够进行诸如此类的搜索 '谁住在英国,喜欢威士忌?':

  

incr key:用户   (整数)1

     

hmset用户:1名劳埃德喜欢威士忌生活英国   行

     

伤心的用户:姓名:劳埃德1   (整数)1

     悲伤的用户:喜欢:威士忌1   (整数)1

     悲伤的用户:生活:英国1   (整数)1

     

incr key:用户   (整数)2

     

hmset用户:2名伊万喜欢威士忌生活英国   行

     

悲伤的用户:姓名:伊万2   (整数)1

     悲伤的用户:喜欢:威士忌2   (整数)1

     悲伤的用户:喜欢:威士忌2   (整数)1

     悲伤的用户:生活:纽约2   (整数)1

     

hmset用户:2名伊万喜欢威士忌生活纽约   行

     

hget user:2名   "伊凡"

     sunion用户:喜欢:威士忌用户:生活:英国   1)" 1"   2)" 2"

     

烧结用户:喜欢:威士忌用户:生活:英国   1)" 1"

      sdiff用户:喜欢:威士忌用户:生活:英国   1)" 2"

     

排序用户:喜欢:重量级威士忌 - *获取用户:* - >名称   1)"劳埃德"   2)" ivan"

     

排序用户:喜欢:重量级威士忌 - *获取用户: - >名称获取用户: - >生活   1)"劳埃德"   2)" uk"   3)" ivan"   4)&​​#34; nyc"