2881099 / csredis

.NET Core or .NET Framework 4.0+ client for Redis and Redis Sentinel (2.8) and Cluster. Includes both synchronous and asynchronous clients.
MIT License
2.01k stars 414 forks source link

有个问题,状态不可用,详细见内容 #439

Closed apgk closed 2 years ago

apgk commented 2 years ago

经常一段时间后就出现 状态不可用,实际原因是端口被占用满了(分配中的), 电脑已重启就好了。redis 自身打出来都是 状态不可用 netstat -ano 查看的话 端口基本没使用,6379 就开了5个,我只开5个连接

apgk commented 2 years ago

今天再次使用netstat 查看了端口,发现出现状态不可用后,会把上次的端口连接存在,服务器查看到还有链接连着,图片地址: https://github.com/apgk/test/blob/master/redis.png

2881099 commented 2 years ago

使用的是单例吗,怎么初始化 CSRedisClient 的

apgk commented 2 years ago

使用的是单例吗,怎么初始化 CSRedisClient 的


public class redishelper{
private CSRedis.CSRedisClient client;
public redishelper(){
client = new CSRedis.CSRedisClient($"{ip}:{port},defaultDatabase={dbId},poolsize=5,prefix={prefixKey}");
            RedisHelper.Initialization(client);

} public T Read(string cacheKey, long dbId = 0) where T : class { return RedisHelper.Get(cacheKey); } }


全局就new 了一个,静态 方式
public static redishelper helper=new redishelper();
2881099 commented 2 years ago

本地端口被占用完,最大的可能性是重复创建了 CSRedisClient 对象。

搜索项目内 CSRedisClient 代码,创建时加日志记录。

apgk commented 2 years ago

本地端口被占用完,最大的可能性是重复创建了 CSRedisClient 对象。

搜索项目内 CSRedisClient 代码,创建时加日志记录。

不存在的,因为是后台服务只有在 初始化地方new 了一个,所有代码再也没有地方new 了。但是服务那条专线感觉不是非常稳定,一段时间就会出现断线下,然后就会出现 连接不上,服务器就会多一个链接

2881099 commented 2 years ago

是否使用了订阅功能,或者统计一下总共用了哪些功能。

apgk commented 2 years ago

是否使用了订阅功能,或者统计一下总共用了哪些功能。

没有哦 ,全篇只有写入 ,少部分读取

apgk commented 2 years ago

是否使用了订阅功能,或者统计一下总共用了哪些功能。

我搞了一个单线程处理队列,一条条写入redis,这个时候发现连接不上服务器,就会抛错一直是状态不可用,持续一段时间后,再次联通,之前的5个链接就不可使用了,内部估计自动创建了新的连接,旧的5个连接服务器还是有保留。时间久了造成服务器端口耗尽。

2881099 commented 2 years ago

按你的描述像是 socket 没有及时被释放端口,其实内部已经执行了 socket.Close/Dispose。

问题看上去和以前 HttpClient 有点像,系统层面是间隔一段时间才回收端口。

apgk commented 2 years ago

按你的描述像是 socket 没有及时被释放端口,其实内部已经执行了 socket.Close/Dispose。

问题看上去和以前 HttpClient 有点像,系统层面是间隔一段时间才回收端口。

所以有点搞不懂。两台客户端各自开5个连接到服务器 ,经常各自死连接,服务器连接又占着,从不释放。。。。

有没有办法判断这个状态 状态不可用,等待后台检查程序恢复方可使用。Connect to server timeout ---> CSRedis.Internal.IO.RedisSocketException: Connect to server timeout

2881099 commented 2 years ago

你是说服务端不释放? 还是本地不释放?

2881099 commented 2 years ago

服务端是指 redis-server ?

apgk commented 2 years ago

服务端是指 redis-server ? 是的,再次贴上图,能很好说明问题(发生这个连接数不对等,网络估计波动了好几次了) https://github.com/apgk/test/blob/master/redis.png

服务端就是安装redis 服务的那台服务器, 客户端就是上图 10.116.182.174 那台 ,看到实际只有5个链接 服务端看到10来个 连接

2881099 commented 2 years ago

那说明 redis-server 未收到正确的断开通知。

你们用的专线,有可能是通过一个中转,真实连接 redis-server 是中间中转的服务器。

而其实只是你们本地与中转服务器断开了。

此时 redis-server 查询到的连接状态依然没有断开,是因为中转服务器并没有断开连接。

2881099 commented 2 years ago

连接串加 preheat=1,可以缓解症状,但不能彻底解决问题。

apgk commented 2 years ago

这样解释明白了,现在 已经=2 了,再试试看吧,感谢大佬回复。

tonyqus commented 2 years ago

话说这问题解决了? @apgk

apgk commented 2 years ago

话说这问题解决了? @apgk

没这么快出来,这个问题测试基本要看半个月才会出结果,所以还得等等

apgk commented 2 years ago

目前问题解决,突然想到 redis 服务器是否有配置,右面发现默认 tcp-keepalive 0 直接不检测了,网络断开情况下,服务器连接默认还存活着。。。。。。