【问题标题】:How to be more efficient using redis-py in multithreading program?如何在多线程程序中使用 redis-py 更高效?
【发布时间】:2020-06-24 22:41:12
【问题描述】:

我对此有两个问题。

  1. 创建一个全局实例并在每个线程中重用还是在每个线程中创建一个新实例?

  2. 使用

    pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
    r = redis.Redis(connection_pool=pool)

    r = redis.StrictRedis(host='localhost', port=6379, db=0)

    关于 ConnectionPool 的文档说:You may choose to do this in order to implement client side sharding or have finer grain control of how connections are managed。但我不明白 client side sharing 指的是什么。

更新
如果使用 ConnectionPool,下面哪种方式是正确的?
答:

pool = redis.ConnectionPool(host='localhost', port=6379, db=0)

class DownloadThread(threading.Thread):
    def __init__(self,pool):
        threading.Thread.__init__(self)
        self.r = redis.Redis(connection_pool=pool)
    def run(self):
        while True:
            self.r .....

乙:

pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
r = redis.Redis(connection_pool=pool)

class DownloadThread(threading.Thread):
    def __init__(self,r):
        threading.Thread.__init__(self)
        self.r = r
    def run(self):
        while True:
            self.r .....

【问题讨论】:

    标签: python multithreading redis


    【解决方案1】:

    好吧,这里有几个问题,所以我将尝试分别回答每个问题。

    1. 如果您要使用线程,那么您当然需要单独的连接。如果共享,Redis 连接将不是线程安全的,因为您可以在一个线程上发送请求并可能在另一个线程上读取(除非您使用互斥锁/锁)。在我看来,连接池实现是线程安全的,因此您应该选择它,或者使用类似 queue.Queue 之类的东西创建自己的连接池,其中放置各个连接,线程获取并放入队列。

    2. 客户端分片是在多个 redis 实例上分片数据的“穷人”方式。一个典型的策略涉及对目标键应用某种散列,如 crc32,并获取该值的模数和分片数。示例如下所示:

    --

    >>> binascii.crc32("foo") % 3
    1
    >>> binascii.crc32("bar") % 3
    2
    >>> binascii.crc32("baz") % 3
    0
    

    这是假设我们有 3 个分片(或单独的 redis 服务器实例)。密钥 foo 位于第二个分片(索引 1)中。键 bar 位于第三个分片(索引 2),baz 位于第一个分片。

    Redis Cluster(Redis 3.0.0 的 beta 版)旨在做分片服务器端与客户端。

    【讨论】:

    • 感谢您的回答!请查看我关于如何使用 ConnectionPool 的更新问题。
    【解决方案2】:

    Redis 现在是线程安全的:https://github.com/andymccurdy/redis-py

    Redis 客户端实例可以安全地在线程之间共享。在内部,连接实例仅在命令执行期间从连接池中检索,之后直接返回池中。命令执行永远不会修改客户端实例上的状态。

    连接池由Redis()的每个实例自动创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      相关资源
      最近更新 更多