【问题标题】:fetch data from redis (async, serial version vs multiprocessing)从 redis 获取数据(异步、串行版本与多处理)
【发布时间】: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 秒内获取数据

  1. 使用 async await 和 aioredis,然后收集,我得到相同的时间,这是有道理的,因为瓶颈是 redis,redis 一次处理 1 个请求。

  2. 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}")

【问题讨论】:

    标签: python redis


    【解决方案1】:

    异步和线程术语不同,使用异步您不必等待接收请求,但是所有请求将仅由一个队列和一个线程处理

    Elastic Cache 与开源 Redis 不同,因为它是多线程的

    可用性 – 与开源 Redis 不同,ElastiCache 集群大小调整旨在在源分片上运行多线程操作,允许插槽迁移在与主 I/O 线程不同的线程上运行。这使 ElastiCache 能够提供完全在线的体验,并使集群能够在调整大小的同时处理传入的 I/O 请求。

    https://aws.amazon.com/about-aws/whats-new/2017/11/amazon-elasticache-for-redis-introduces-dynamic-addition-and-removal-of-shards-while-continuing-to-serve-workloads/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多