如何判断 redis 连接是否有效
4个回答
展开全部
首先,去看一下
Redis
官方推荐的
Go Redis driver
。官方
Star
的项目有两
个:
Radix.v2
和
Redigo
。
经过简单的比较后,
选择了更加轻量级和实现更加优
雅的
Radix.v2
。
Radix.v2
包是根据功能划分成一个个的
sub
package
,每一个
sub
package
在
一个独立的子目录中,结构非常清晰。我的项目中会用到的
sub package
有
redis
和
pool
。
由于我想让这种被
fork
的进程最吵迅好简单点,
做的事情单一一些,
所以,
在没有升改此
深入去看
Radix.v2
的
pool
的实现之前,
我选择了自己实现一个
Redis
pool
。
(
这里,就不贴代码了。后来发现自己实现的
Redis pool
与
Radix.v2
实现的
Redis
pool
的原理是一样的,
都是基于
channel
实现的
,
遇到的问题也是一样
的。
)
不过在测试过程中,
发现了一个诡异的问题。
在请求过程中经常会报
EOF
错误。
而且是概率性出现,一会有问题,一会又好了。通过反复的测试,发现
bug
是
有规律的,当程序空闲一会后,再进行连续请求,会发生
3
次失败,然后之后的
请求都能成功,而我的连接池大小设置的是
3
。再进一步分析,程序空闲
300
秒
后,再请求就会失败,发现我的
Redis
server
配置了
timeout
300
,至此,问
题就清楚了。是连接超时
Redis
server
主动断开了连接。客户端这歼绝边从一个超
时的连接请求就会得到
EOF
错误。
然后我看了一下
Radix.v2
的
pool
包的源码,
发现这个库本身并没有检测坏的
连接,并替换为新的连接的机制。也就是说我每次从连接池里面
Get
的连接有
可能是坏的连接。
所以,
我当时临时的解决方案是通过增加失败后自动重试来解
决了。不过,这样的处理方案,连接池的作用好像就没有了。技术债能早点
还
的还是早点还上。
三、使用连接池的正确姿势
想到我们的
ngx_lua
项目里面也大量使用
redis
连接池,
他们怎么没有遇到这
个问题呢。只能去看看源码了。
经过抽象分离,
ngx_lua
里面使用
redis
连接池部分的代码大致是这样的:
1.
server {
2.
location /pool {
3.
content_by_lua_block {
4.
local redis = require
"resty.redis"
5.
local red = redis:
new
()
6.
7.
local ok, err = red:connect(
"127.0.0.1"
,
6379
)
8.
if
not ok then
9.
ngx.say(
"failed to connect: "
, err)
Redis
官方推荐的
Go Redis driver
。官方
Star
的项目有两
个:
Radix.v2
和
Redigo
。
经过简单的比较后,
选择了更加轻量级和实现更加优
雅的
Radix.v2
。
Radix.v2
包是根据功能划分成一个个的
sub
package
,每一个
sub
package
在
一个独立的子目录中,结构非常清晰。我的项目中会用到的
sub package
有
redis
和
pool
。
由于我想让这种被
fork
的进程最吵迅好简单点,
做的事情单一一些,
所以,
在没有升改此
深入去看
Radix.v2
的
pool
的实现之前,
我选择了自己实现一个
Redis
pool
。
(
这里,就不贴代码了。后来发现自己实现的
Redis pool
与
Radix.v2
实现的
Redis
pool
的原理是一样的,
都是基于
channel
实现的
,
遇到的问题也是一样
的。
)
不过在测试过程中,
发现了一个诡异的问题。
在请求过程中经常会报
EOF
错误。
而且是概率性出现,一会有问题,一会又好了。通过反复的测试,发现
bug
是
有规律的,当程序空闲一会后,再进行连续请求,会发生
3
次失败,然后之后的
请求都能成功,而我的连接池大小设置的是
3
。再进一步分析,程序空闲
300
秒
后,再请求就会失败,发现我的
Redis
server
配置了
timeout
300
,至此,问
题就清楚了。是连接超时
Redis
server
主动断开了连接。客户端这歼绝边从一个超
时的连接请求就会得到
EOF
错误。
然后我看了一下
Radix.v2
的
pool
包的源码,
发现这个库本身并没有检测坏的
连接,并替换为新的连接的机制。也就是说我每次从连接池里面
Get
的连接有
可能是坏的连接。
所以,
我当时临时的解决方案是通过增加失败后自动重试来解
决了。不过,这样的处理方案,连接池的作用好像就没有了。技术债能早点
还
的还是早点还上。
三、使用连接池的正确姿势
想到我们的
ngx_lua
项目里面也大量使用
redis
连接池,
他们怎么没有遇到这
个问题呢。只能去看看源码了。
经过抽象分离,
ngx_lua
里面使用
redis
连接池部分的代码大致是这样的:
1.
server {
2.
location /pool {
3.
content_by_lua_block {
4.
local redis = require
"resty.redis"
5.
local red = redis:
new
()
6.
7.
local ok, err = red:connect(
"127.0.0.1"
,
6379
)
8.
if
not ok then
9.
ngx.say(
"failed to connect: "
, err)
2015-05-30 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517184
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
>渗盯闷>丛弯> conn = redis.StrictRedis('1.2.3.4', 1234, socket_timeout=3)
>>>则衫 conn.get('xxxxxxxxxxxxx')
......
redis.exceptions.ConnectionError: Error connecting to 1.2.3.4:1234. timed out.
>>>则衫 conn.get('xxxxxxxxxxxxx')
......
redis.exceptions.ConnectionError: Error connecting to 1.2.3.4:1234. timed out.
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
>渗盯闷>丛弯> conn = redis.StrictRedis('1.2.3.4', 1234, socket_timeout=3)
>>>则衫 conn.get('xxxxxxxxxxxxx')
......
redis.exceptions.ConnectionError: Error connecting to 1.2.3.4:1234. timed out.
>>>则衫 conn.get('xxxxxxxxxxxxx')
......
redis.exceptions.ConnectionError: Error connecting to 1.2.3.4:1234. timed out.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
命令行内直接连接试试就知道了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询