#python #redis #pipeline #bulkinsert #redis-py
Вопрос:
Я использую redis-py для обработки массовых вставок в хранилище Redis.
Я написал следующий очень простой метод:
import redis
def push_metadata_to_redis(list_of_nested_dictionaries):
redis_client = redis.Redis(host='localhost', port=6379, db=0)
redis_pipeline = redis_client.pipeline(transaction=False)
for dictionary in list_of_nested_dictionaries:
for k, inner_dict in dictionary.items()
redis_pipeline.hset(k, mapping=inner_dict)
result = redis_pipeline.execute(raise_on_error=True)
print(result)
В основном это:
- принимает на вход список из нескольких тысяч словарей
- для каждого из этих словарей вставьте в Redis каждый элемент ключа/значения (значения также являются словарями, поэтому я использую
hset
)
Каждый dictionary
содержит ~10 тыс. элементов, так redis_pipeline.execute(raise_on_error=True)
происходит раз в ~10 hset
тыс.
Я заметил, что через несколько минут result
значение переходит от массивов 0
s к массивам 4
s, и это меня беспокоит.
С одной стороны, я ожидаю, что любая ошибка должна быть вызвана как исключение ( raise_on_error=True
), но с другой стороны, я не могу найти никаких ссылок на это поведение в документации, и я не понимаю, что это значит.
Поэтому мои вопросы таковы:
- Означает ли значение
result
равно массиву4
s, что в операции что-то пошло не такredis_pipeline.execute(raise_on_error=True)
? - Если да, то как я могу понять, что пошло не так?
- Если нет, то что это значит вместо этого?
Заранее спасибо.
Ответ №1:
Поэтому при использовании команды HSET возвращаемое значение-это количество полей, которые были добавлены
# check if key exists
127.0.0.1:6379> EXISTS key1
(integer) 0
# add a hash with 4 k/v pairs
127.0.0.1:6379> HSET key1 a 1 b 1 c 1 d 1
(integer) 4
# Set same fields for an existing hash
127.0.0.1:6379> HSET key1 a 1 b 1 c 1 d 1
(integer) 0
# Add an additional k/v pair
127.0.0.1:6379> HSET key1 a 1 b 1 c 1 d 1 e 1
(integer) 1
127.0.0.1:6379> HSET key1 f 1
(integer) 1
таким образом, возможно, что эти записи с 0 уже существовали в кэше, и новые поля не были добавлены.
Комментарии:
1. Это окончательно ответило на мой вопрос, спасибо. 🙂