Redis mget не работает должным образом с клиентом redis-py-cluster
Я использую redis-py-cluster для подключения к нашему кластеру Redis. У нас есть требование запросить 100 ключей из кластера Redis за один вызов. Я использую хэштеги redis (с {}) для хеширования всех ключей к одному узлу (например: {feed}1,{feed}2,{feed}3 - это несколько примеров ключей).
Я не замечаю большой разницы во времени между запросом 100 ключей последовательно и запросом 100 ключей с помощью mget.Sample кода здесь:
rconn = RedisCluster(startup_nodes=self.startup_nodes, decode_responses=True)
flist=['{feed}1','{feed}2','{feed}3','{feed}4'....'{feed}100']
time1 = time.time()
for i in range(1,len(flist)):
feed_s = rconn.get(flist[i])
print("Feeds get one by one time:%f", time.time()-time1)
time2 = time.time()
feed_m = rconn.mget(flist)
print("Feeds mget time:%f", time.time()-time2)
Поддерживает ли "redis-py-cluster" mget? Это правильный способ запроса с помощью mget?
версии: redis-cluster версия: 5.0.7, python: 3.6, redis-py-cluster:2.0.0
Пожалуйста, помогите, спасибо!
1 ответ
Команды, которые работают с мультислотом, невозможно использовать обычную реализацию из redis-py, поэтому необходимо использовать другие методы или обходные пути для поддержки команд mget так же, как работает обычный метод redis-py.
Команда mget - одна из таких команд. Если вы посмотрите на текущую кластерную реализацию этого метода здесь https://github.com/Grokzen/redis-py-cluster/blob/master/rediscluster/client.py, вы увидите, что он работает, имитируя ввод и вывод из исходной версии из redis-py, но он меняет внутреннюю реализацию, так как для каждого ключа вам, возможно, придется разговаривать с другим сервером.
Таким образом, чтобы код мог быть заменой без изменений в вашем коде, кластер mget будет последовательно перебирать каждый ключ, получать значение и возвращать данные в том же формате для одного случая сервера. С этой текущей реализацией не будет никакого прироста производительности, но нет другого способа реализовать метод каким-либо другим способом, который дал бы некоторый прирост производительности, было более важно реализовать метод, чтобы он работал так же, а не чтобы такая же производительность.