【发布时间】:2015-01-14 23:19:02
【问题描述】:
使用Python和redis api;
我想存储一个字典,例如
Value -> List of Words(L.O.W)
Each word in L.O.W -> Value
基本上我希望所有东西都可以来回搜索(以最好的方式),但是由于 redis 不支持多个表/记录,我们将如何在 redis 中处理这个问题?
PS:我认为 redis 是最好的选择,而且我也是 python 新手
【问题讨论】:
使用Python和redis api;
我想存储一个字典,例如
Value -> List of Words(L.O.W)
Each word in L.O.W -> Value
基本上我希望所有东西都可以来回搜索(以最好的方式),但是由于 redis 不支持多个表/记录,我们将如何在 redis 中处理这个问题?
PS:我认为 redis 是最好的选择,而且我也是 python 新手
【问题讨论】:
直接的方法是使用两种类型的 Set:一种用于存储 value->LOW,另一种用于相反方向,来自 LOW->values 的单词。
SADD val1 low1 low2
SADD val2 low2 low3
SADD low1 val1
SADD low2 val1 val2
SADD low3 val2
【讨论】:
对于价值->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.查找作为散列,其键/值对分别是您的“值”和“序列化”单词列表。顶级哈希将被赋予一个键名以确保其功能显而易见(在下面的示例中,我选择了value_low_lookup:
db.hset(`value_low_lookup`, value, ';'.join(listOfWords))
#Recovering the LOW
listOfWords = db.hget('value_low_lookup', value).split(';')
选项 #2 在 Redis 中的存储方面内存效率更高,但需要在客户端进行更多处理(拉出分号连接的字符串并将其分隔到单词列表中)。在插入 Redis 之前,您还必须在客户端执行唯一性保证(如果需要)。
对于 L.O.W.-> 值,我认为哈希可能是在 Redis 中表示该值的最有效方式,类似于上面的选项 #2。此散列中的键/值对可以是一个单词和与该单词所来自的 LOW 相关联的值。
【讨论】: