【发布时间】:2019-12-29 22:25:43
【问题描述】:
根据 Redis 文档,redis 是单线程的。但是我遇到了一种奇怪的情况,通过不同的方法获取数据。 我的 redis 存储 4 个哈希,每个哈希有 50,000 个键,每个值 300xfloat32 大小。 我尝试以 3 种方式获取数据,并得到不同的计时结果。 1.串行方式: def fetch_data(): 对于范围内的 i (4): r.hgetall(hash[i])
使用 hgetall 以串行方式获取数据,我在 ~4 秒内获取数据
使用 async await 和 aioredis,然后收集,我得到相同的时间,这是有道理的,因为瓶颈是 redis,redis 一次处理 1 个请求。
1234563 1.5秒内
我的问题是,这与异步有何不同?在客户端使用线程如何提高获取时间? 请注意,我在主从架构中使用 AWS redis 弹性缓存。
这是案例 2 和案例 3 的代码: 案例2:
async def get_data_v7(intents_group):
try:
responses = list()
buckets = [bucket_1, bucket_2, bucket_3, bucket_4]
for i in range(len(buckets)):
responses.append(r.hgetall(buckets[i]))
await asyncio.gather(*responses)
except Exception as e:
print(f"Failed to get data from redis {e}")
案例3:
def fetch_data_from_redis(bucket_key):
bucket = r.hgetall(bucket_key)
try:
process_num = 4
processes = []
buckets = [bucket_1, bucket_2, bucket_3, bucket_4]
for i in range(process_num):
p = mp.Process(target=fetch_data_from_redis,
args=(buckets[i]))
processes.append(p)
p.start()
for p in processes:
p.join()
except Exception as e:
print(f"Failed to get data from redis {e}")
【问题讨论】: