如何判断 redis 连接是否有效

 我来答
江西新华电脑校
2016-03-06 · TA获得超过365个赞
知道小有建树答主
回答量:1093
采纳率:0%
帮助的人:257万
展开全部
首先,去看一下
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)
huanglenzhi
2015-05-30 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数: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.
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ZHYing_Smart
2016-04-19
知道答主
回答量:64
采纳率:0%
帮助的人:6.8万
展开全部
>渗盯闷>丛弯> 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.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友9d64202c
2016-02-26 · TA获得超过478个赞
知道小有建树答主
回答量:279
采纳率:0%
帮助的人:195万
展开全部
命令行内直接连接试试就知道了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式