Можете ли вы обновить набор в хэш-карте redis, не вытягивая всю хеш-карту для обновления?

1

Скажем, у меня есть 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'])
Теги:
redis

1 ответ

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]'}

Используйте то, что проще в управлении.

  • 0
    Я принял подход Cats#A

Ещё вопросы

Сообщество Overcoder
Наверх
Меню