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

Пожалуйста, помогите, спасибо!


person umm    schedule 18.04.2020    source источник


Ответы (1)


Команды, которые работают с мультислотом, невозможно использовать обычную реализацию из redis-py, поэтому необходимо использовать другие методы или обходные пути для поддержки команд mget так же, как работает обычный метод redis-py.

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

Таким образом, чтобы код мог быть заменой без изменений в вашем коде, кластер mget будет последовательно перебирать каждый ключ, получать значение и возвращать данные в том же формате для одного случая сервера. С этой текущей реализацией не будет никакого прироста производительности, но нет другого способа реализовать метод каким-либо другим способом, который дал бы некоторый прирост производительности, было более важно реализовать метод, чтобы он работал так же, а не чтобы такая же производительность.

person Grokzen    schedule 23.04.2020