Redis mget не работает должным образом с клиентом redis-py-cluster - PullRequest
0 голосов
/ 18 апреля 2020

Я использую "redis-py-cluster" для подключения к нашему кластеру Redis. У нас есть требование запросить 100 ключей из кластера redis за один вызов. Я использую хэштеги redis (с {}), чтобы получить sh все ключи к одному узлу (например: {feed} 1, {feed} 2, {feed} 3 - некоторые примеры ключей).

Я не замечаю большой разницы во времени между последовательным запросом 100 ключей и запросом 100 ключей с помощью mget. Пример кода здесь:

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 Ответ

0 голосов
/ 23 апреля 2020

Команды, работающие с мультислотом, не могут использовать обычную имплементацию из redis-py, поэтому необходимо выполнить другие методы или обходные пути, чтобы поддерживать команды mget так же, как работает обычный метод redis-py. Команда mget является одной из этих команд. Если вы посмотрите на текущую кластерную реализацию этого метода здесь https://github.com/Grokzen/redis-py-cluster/blob/master/rediscluster/client.py#L891, вы увидите, что он работает, имитируя ввод и вывод из предыдущей версии из redis-py, но он изменяет внутреннюю реализацию так, как для с каждым ключом вам может понадобиться поговорить с другим сервером. Таким образом, чтобы обеспечить возможность замены кода без изменений в вашем коде, кластерный mget будет последовательно повторять каждый ключ, получать значение и возвращать данные в том же формате для одного случая сервера. В этой текущей реализации не будет никакого прироста производительности, но нет другого способа заставить метод каким-либо иным способом, который дал бы некоторый прирост производительности, было более важно реализовать метод, чтобы работать так же, чтобы не иметь та же производительность.

...