Threadsafe redis客户端

时间:2014-07-03 11:41:30

标签: python go redis

我使用goredis并且据我所知 - 当客户端连接到redis服务器时,有一个连接池。我不知道如何查询redis服务器并确保它是以线程安全的方式。

目前我这样做:

我正在创建全局指针clientclient *goredis.Redis 然后我这样做:

go func () {
    http.HandleFunc("/send_data/", trackHandler)
    http.HandleFunc("/init/", initHandler)
    http.ListenAndServe(":8000", nil)
} ()

所以现在我想在clienttrackHandler中使用initHandler,但我担心在执行查询时不会以任何方式进行同步。是否有可能以这种方式搞乱事情。在golang中解决这个问题的规范方法是什么?

我也想知道这在redis-py中是如何运作的。 我已经看到了thread

  

一般来说,我建议你:

     

一个。创建一个全局redis客户端实例并让您的代码使用它。   湾创建一个全局连接池,并将其传递给整个代码中的各种redis实例。

     

这两个都完成了同样的事情。两者都是线程安全的。

第一种情况是如何完成的?

1 个答案:

答案 0 :(得分:2)

客户端有一个线程安全的连接池,每当执行命令时,客户端都会尝试从池中获取连接。因此,即使客户端没有锁定,它仍然是线程安全的,所以你应该可以使用全局客户端。

请参阅此处 - 拨号功能如何创建新的连接池: https://github.com/xuyu/goredis/blob/master/redis.go#L432

这里是一个锁定connectino池本身的例子。 https://github.com/xuyu/goredis/blob/master/redis.go#L287

Re redis-py - 如果你没有明确地使用它,它会创建自己的内部连接池,所以它是线程安全的,因为在引擎盖下连接是全局池。基本相同。