需求: 对数据库中的不断抓取的文章进行缓存,因此需要定时访问数据,写入缓存中
在捕获到的异常日志发现错误:unable to connect: sport: 0
使用的访问方式是线程池的方式:pooledredisclientmanager
经过测试发现在并发访问redis服务的情况下出现该异常的概率比较高,
解决方法
第一点:要使用using(据说访问效率在高并发的时候会有影响,简单的测试过了确实是这样,不过现在的业务达不到高并发量,速度还是很快滴)
using (iredisclient redisclient = instance.getclient()){t t = redisclient.get
(key);if (t == null && func != null){t = func();redisclient.set(key, t, datetime.now.addseconds(seconds));}return t;} 第二点:设置connecttimeout属性(猜测单位应该是毫秒),要设置一个比较大的值,我设置为:1000 * 60 * 20 ,没错是20分钟,我发现设置小了还是不管用
做好这两点,经测试发现每秒钟200个并发量 毫无压力
附上封装的一个帮助类:
/// /// 数据缓存/// public class redishelper{public static pooledredisclientmanager instance;static redishelper(){}public static pooledredisclientmanager instance{get{return instance;}}public static void initclient(string redis_ip, int redis_port, string redis_pass){instance = new pooledredisclientmanager(10000,10,new string[] { string.format("{0}@{1}:{2}", redis_pass, redis_ip, redis_port) }){connecttimeout = 1000 * 60 * 20};}public static t get(string key, int seconds, func func){using (iredisclient redisclient = instance.getclient()){t t = redisclient.get(key);if (t == null && func != null){t = func();redisclient.set(key, t, datetime.now.addseconds(seconds));}return t;}}public static t get(string key){using (iredisclient redisclient = instance.getreadonlyclient()){t t = redisclient.get(key);return t;}}public static boolean set(string key, int seconds, t t){using (iredisclient redisclient = instance.getclient()){return redisclient.set(key, t, datetime.now.addseconds(seconds));}}public static void clearkey(string key){using (iredisclient redisclient = instance.getclient()){ienumerable<string> keys = redisclient.getallkeys(); ;foreach (var item in keys){if (item.contains(key)){redisclient.remove(item);}}}}}
转载于:https://www.cnblogs.com/kongkonglonglong/p/7449175.html
总结
以上是凯发k8官方网为你收集整理的unable to connect: sport: 0 c# servicestack.redis 访问 redis的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。