线程安全的Redis客户端
我正在使用goredis,根据我的观察,当客户端连接到redis服务器时,会有一个连接池。我不太清楚如何查询redis服务器,并确保这个过程是线程安全的。
目前我这样做:
我创建了一个全局指针client
:client *goredis.Redis
。然后我执行了以下操作:
go func () {
http.HandleFunc("/send_data/", trackHandler)
http.HandleFunc("/init/", initHandler)
http.ListenAndServe(":8000", nil)
} ()
现在我想在trackHandler
和initHandler
中使用client
,但我担心在执行查询时没有任何同步措施。这种做法会不会出问题?在golang中解决这个问题的标准方法是什么?
我还想知道在redis-py中是如何处理的。我看到过这个讨论:
一般来说,我建议你可以选择:
a. 创建一个全局的redis客户端实例,并让你的代码使用它。
b. 创建一个全局的连接池,并将其传递给代码中不同的redis实例。这两种方法都能达到相同的效果,并且都是线程安全的。
在第一种情况下是怎么做到的呢?
1 个回答
2
这个客户端有一个连接池,能够安全地处理多个线程。当你执行一个命令时,客户端会尝试从这个连接池中获取一个连接。因此,即使客户端没有使用锁,它仍然是线程安全的,所以你可以放心使用一个全局的客户端。
你可以看看这里 - Dial 函数是如何创建一个新的连接池的:https://github.com/xuyu/goredis/blob/master/redis.go#L432
还有这里是连接池内部如何进行锁定的示例:https://github.com/xuyu/goredis/blob/master/redis.go#L287
关于 redis-py - 如果你没有明确使用连接池,它会自动创建一个内部连接池,所以它也是线程安全的,因为在底层,连接是全局共享的。基本上是同样的道理。