2014-07-03 145 views
3

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

目前,我这样做:

我创建全局指针clientclient *goredis.Redis 那么我这样做:

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

所以现在我想在trackHandlerinitHandler使用client,但我很担心,执行查询时不会有任何同步。是否有可能以这种方式混淆事物。在golang中解决这个问题的标准方法是什么?

另外我想知道这是如何工作在redis-py。 我已经看到了这个thread

在一般情况下,我建议您:

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

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

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

+0

您使用哪个redis客户端? https://github.com/xuyu/goredis? – OneOfOne

+0

是的,确切地说。 :) – Marii

回答

2

客户端有一个线程安全的连接池,并且无论何时执行命令,客户端都会尝试从池中获取连接。因此,即使客户端没有锁定,它仍然是线程安全的,所以你应该对全局客户端很好。

看到这里 - 如何拨号功能创建一个新的连接池:在connectino池本身锁定的例子 https://github.com/xuyu/goredis/blob/master/redis.go#L432

这里。 https://github.com/xuyu/goredis/blob/master/redis.go#L287

重新Redis的-PY - 它会创建自己的内部连接池,如果你不使用一个明确的,所以它是因为发动机罩下的连接是全球汇集是线程安全的。基本一样的东西。

+0

谢谢你的回答。我的误解是关于何时被认为是线程安全的。如果你从不同的线程/ goroutines调用相同的函数,可以吗?只有写入数据时才会出现问题。我真的很感谢关于线程安全的更详细的答案,或者与适当材料的链接。 :) – Marii

+0

@cldy通常 - 函数和堆栈上创建的所有东西(临时在函数运行期间)都被认为是线程安全的,并且不会在线程之间共享。一旦你有数据被一次访问并被不同的线程改变,事情变得更加复杂。我建议你只是谷歌“线程安全”,你会发现无尽的资源:) –