我使用goredis并且据我所知 - 当客户端连接到redis服务器时,有一个连接池。我不知道如何查询redis服务器并确保它是以线程安全的方式。
目前我这样做:
我正在创建全局指针client
:client *goredis.Redis
然后我这样做:
go func () {
http.HandleFunc("/send_data/", trackHandler)
http.HandleFunc("/init/", initHandler)
http.ListenAndServe(":8000", nil)
} ()
所以现在我想在client
和trackHandler
中使用initHandler
,但我担心在执行查询时不会以任何方式进行同步。是否有可能以这种方式搞乱事情。在golang中解决这个问题的规范方法是什么?
我也想知道这在redis-py中是如何运作的。 我已经看到了thread:
一般来说,我建议你:
一个。创建一个全局redis客户端实例并让您的代码使用它。 湾创建一个全局连接池,并将其传递给整个代码中的各种redis实例。
这两个都完成了同样的事情。两者都是线程安全的。
第一种情况是如何完成的?
答案 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 - 如果你没有明确地使用它,它会创建自己的内部连接池,所以它是线程安全的,因为在引擎盖下连接是全局池。基本相同。