Скажем, у меня есть hashmap, который выглядит так:
{'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'])
В настоящее время нет команды добавлять/удалять из хэш-полей, вам нужно будет прочитать значение и обновить его до нового значения и снова установить его
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]'}
Используйте то, что проще в управлении.
Cats#A