在redis中存储两组表

Store two sets of tables in redis

使用Python和redis api;

我想存储一个字典,例如

Value -> List of Words(L.O.W)
Each word in L.O.W -> Value

基本上我希望所有内容都可以来回搜索(以尽可能最好的方式),但是由于 Redis 不支持多个 table/records,我们将如何在 Redis 中处理这个问题?

PS:我认为 Redis 是这样做的最佳选择,我也是 python 的新手

直接的方法是使用两种类型的集合:一种用于存储值->低,一种用于相反的方向,从低到>值的词。

SADD val1 low1 low2
SADD val2 low2 low3
SADD low1 val1
SADD low2 val1 val2
SADD low3 val2

对于value->L.O.W.,我认为有两个可行的方案:

1) 存储L.O.W。作为以值作为键名的集合。在 redis-py 中,这可能看起来像这样:

import redis
db = redis.StrictRedis() # Put connection info here
...
...
db.sadd(value, *listOfWords) # Assuming listOfWords is an iterable object (list, set, etc.)

#To recover the LOW for a given value:
listOfWords = db.smembers(value)

2) 存储所有值->L.O.W。查找作为散列,其 key/value 对分别是您的 "value" 和 "serialized" 单词列表。顶级哈希将被赋予一个键名以确保其功能显而易见(在下面的示例中我选择了 value_low_lookup:

db.hset(`value_low_lookup`, value, ';'.join(listOfWords))

#Recovering the LOW
listOfWords = db.hget('value_low_lookup', value).split(';')

就 Redis 的存储而言,选项 #2 的内存效率更高,但需要在客户端进行更多处理(拉出分号连接的字符串并将其分隔到单词列表中)。在插入 Redis 之前,您还必须在客户端执行唯一性保证(如果这是一项要求)。

对于 L.O.W.-> 值,我认为散列可能是在 Redis 中表示该值的最有效方式,类似于上面的选项 #2。此散列中的 key/value 对可以分别是一个词和与该词来自的 LOW 关联的值。