您是否可以在Redis哈希图中更新集合,而无需拉动整个哈希图进行更新?

时间:2018-08-26 16:53:50

标签: python redis

假设我有一个看起来像这样的哈希图:

{'dog': {'A': set([1,2,3]), 'B': set([1,2,3])},
 'cat': {'A': set([1,2,3]), 'B': set([1,2,3])}
 ....
}

现在过了一段时间,我想将值[2,5,8]添加到dog->B,以使生成的哈希图变为

{'dog': {'A': set([1,2,3]), 'B': set([1,2,3,5,8])},
 'cat': {'A': set([1,2,3]), 'B': set([1,2,3])}
 ....
}

是否可以不拉动整个哈希图进行更新?

不幸的是,做这样的事情只会完全取代价值。

conn = redis.Redis('localhost')
dict = {'A': set([1,2,3]), 'B': set([4,5,6])}
conn.hmset('Cats', dict)
print(conn.hgetall('Cats'))
dict = {'A': set([4,3,5]), 'B': set([1,2,3])}
conn.hmset('Cats', dict)
print(conn.hgetall('Cats'))

output:
{b'A': b'{1, 2, 3}', b'B': b'{4, 5, 6}'}
{b'A': b'{3, 4, 5}', b'B': b'{1, 2, 3}'}

是否有一个conn.sadd可用于进入哈希图和集合?现在,我的解决方法是构造一个既包含动物又包含动物哈希图中的密钥的密钥。

conn.sadd('{}-{}'.format('Cat', 'A'), entry['Pet'])

1 个答案:

答案 0 :(得分:0)

当前没有命令从哈希字段中添加/删除,您将必须读取值并将其更新为新值并再次设置

conn = redis.Redis('localhost')
dict = {'A': set([1,2,3]), 'B': set([4,5,6])}
conn.hmset('Cats', dict)
print(conn.hgetall('Cats'))

现在,如果要将[7,8,9]添加到Cats> B,则

b = set(eval(hmget('Cats', 'B')))
b = b.union(set([7,8,9]))
conn.hset('Cats', {'B': b})
print(conn.hgetall('Cats'))

输出:

{b'A': b'{1, 2, 3}', b'B': b'{4, 5, 6}'}
{b'A': b'{1, 2, 3}', b'B': b'{4, 5, 6, 7, 8, 9}'}

另一种替代方法是通过使用带有redis键的哈希字段来使用redis集,如下所示

conn.sadd('Cats#A', *[1, 2, 3])
conn.sadd('Cats#B', *[4, 5, 6])
print(conn.smembers('Cats#A'))
print(conn.smembers('Cats#B'))
conn.sadd('Cats#B', *[7, 8, 9])
print(conn.smembers('Cats#B'))

输出:

{b'[1, 2, 3]'}
{b'[4, 5, 6]'}
{b'[4, 5, 6, 7, 8, 9]'}

使用更易于管理的方式。