.NET中使用Redis总结——2.项目实战
接上篇.NET中使用Redis总结 —— 1.Redis搭建
看一些Redis相关资料,.NET 方面ServiceStack.Redis 用的比较多,就直接拿来用了。
在使用过程中经常过出现假死状态,Redis服务没有挂,只是客户端连不上。
错误信息如下(这里)
ServiceStack.Redis.RedisResponseException: Unexpected reply: +OK, sPort: 8223, LastCommand:
重启redis就正常了,初步怀疑是连接数超过最大值。
改为使用链接池
1 public class RedisCaching
2 {
3 /// <summary>
4 /// redis配置文件信息
5 /// </summary>
6 private static readonly string RedisPath = ConfigurationManager.AppSettings["RedisPath"];
7
8 /// <summary>
9 ///
10 /// </summary>
11 public static RedisClient Redis;
12
13 /// <summary>
14 /// 构造方法
15 /// </summary>
16 static RedisCaching()
17 {
18 var prcm = CreateManager(new string[] { RedisPath }, new string[] { RedisPath });
19 Redis = prcm.GetClient() as RedisClient;
20 }
21
22 /// <summary>
23 /// 创建链接池
24 /// </summary>
25 /// <param name="readWriteHosts"></param>
26 /// <param name="readOnlyHosts"></param>
27 /// <returns></returns>
28 public static PooledRedisClientManager CreateManager(string[] readWriteHosts, string[] readOnlyHosts)
29 {
30 //支持读写分离,均衡负载
31 return new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig
32 {
33 MaxWritePoolSize = 300,//“写”链接池链接数
34 MaxReadPoolSize = 300,//“读”链接池链接数
35 AutoStart = true,
36 });
37 }
38
39 //static readonly RedisClient redis = new RedisClient("localhost",6379);
40 //private static readonly RedisClient redis = new RedisClient(RedisPath);//长链接
41
42 public static T Get<T>(string key)
43 {
44 return Redis.Get<T>(key);
45 }
46
47 public static void Set( string key, string value)
48 {
49 Redis.Set(key, value);
50 }
51 }
随着业务发展,发现还会出现上面出现的错误。
使用了lock锁,之后没这种问题发生了。
这个问题比较严重,每次访问量上去就出现这种错。
目前在做项目的性能优化,这次每次都lock严重影响效率,得找个方法解决。
首先分析下Redis 服务有时候是假死,重启下就好了,是不是windows下安装的Redis 不稳定(windows 这锅我不背)?
或者是RedisClient有问题?
更换RedisClient成本比较低,可以优先考虑下。
目前使用的是ServiceStack.Redis 换成 StackExchange.Redis
如果使用StackExchange.Redis 项目必须使用.NET 4.5. 要不然会编译会报错。
StackExchange.Redis 的使用
引用StackExchange.Redis.dll
经过一些修改测试后,发现没有之前那种错误,心里窃喜,终于搞定这个问题了。
最后发现还是 too young too naive
遇到了新的问
Timeout performing GET test, inst: 4, mgr: ExecuteSelect, err: never, queue: 12, qu: 0, qs: 12, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, clientName: , IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=11,Free=32756,Min=4,Max=32767) (Please take a look at this article for some common client-side issues that can cause timeouts: http://stackexchange.github.io/StackExchange.Redis/Timeouts)
No connection is available to service this operation: SETEX test; SocketFailure on Interactive, origin: CheckForStaleConnection, input-buffer: 0, outstanding: 2, last-read: 1s ago, last-write: 0s ago, unanswered-write: 1s ago, keep-alive: 60s, pending: 0, state: ConnectedEstablished, in: 0, ar: 0, last-heartbeat: 0s ago, last-mbeat: 0s ago, global: 0s ago, mgr: RecordConnectionFailed_ReportFailure, err: never; IOCP: (Busy=0,Free=1000,Min=24,Max=1000), WORKER: (Busy=3,Free=32764,Min=24,Max=32767), Local-CPU: n/a at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor`1 processor, ServerEndPoint server)
找了一些解决方案,像下面这些方案都没有解决这个问题
使用StackExchange.Redis客户端进行Redis访问出现的Timeout异常排查
Redis 详解 (一) StackExchange.Redis Client
最后看了这个文章下面的评论有所启发15天玩转redis —— 第七篇 同事的一次缓存操作引起对慢查询的认识
是因为可能某些查询超过了链接超时时间,Redis是单线程的,阻塞了后面的请求,所以报超时。
有了这个方向可以着手解决问题。
- 拆分大的文件存储
- 连接操作超时时间延长
- 同步操作时间延长
- 增加重试连接次数
1 private static ConnectionMultiplexer GetManager(string connectionString = null)
2 {
3 if (string.IsNullOrEmpty(connectionString))
4 {
5 connectionString = Connstr;
6 }
7
8 var options = ConfigurationOptions.Parse(connectionString);
9 options.ConnectTimeout = 1000;//连接操作超时(ms)
10 options.KeepAlive = 180;//发送消息以帮助保持套接字活动的时间(秒)(默认为60秒)
11 options.SyncTimeout = 2000;//时间(ms)允许进行同步操作
12 options.ConnectRetry = 3;//重试连接的次数
13
14 return ConnectionMultiplexer.Connect(options);
15 }
经过测试上面的问题出现的概率小了很多,但是还是会出现。
现在只能定时去监控redis,如果发现异常进行重启进行解决。
小伙伴们有没有好得解决方案,求分享~
参考:
.NET中使用Redis总结——2.项目实战的更多相关文章
- python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改、删除操作
python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改.删除操作 项目目录: ├── flask_redis_news.py ├── forms.py ├ ...
- python操作三大主流数据库(13)python操作redis之新闻项目实战①新闻数据的导入
1.新闻处理页面redis_news.py #coding:utf-8 import math import redis class RedisNews(object): def __init__(s ...
- 在express项目中使用redis
在express项目中使用redis 准备工作 安装redis 安装redis桌面管理工具:Redis Desktop Manager 项目中安装redis:npm install redis 开始使 ...
- MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式
MVC的验证(模型注解和非侵入式脚本的结合使用) @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...
- .Net中初探Redis
一.简介 Redis是著名的NOSQL数据库,本质就是存储键值对结构的数据,为存储键值对数据做了优化,在大型网站中应用很多.Redis提供了数据的自动过期处理,因此适合存储临时数据. 和Redis类似 ...
- 【无私分享:ASP.NET CORE 项目实战(第十一章)】Asp.net Core 缓存 MemoryCache 和 Redis
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 经过 N 久反复的尝试,翻阅了网上无数的资料,GitHub上下载了十几个源码参考, Memory 和 Redis 终于写出一个 ...
- 15套java架构师、集群、高可用、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程
* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...
- java架构师负载均衡、高并发、nginx优化、tomcat集群、异步性能优化、Dubbo分布式、Redis持久化、ActiveMQ中间件、Netty互联网、spring大型分布式项目实战视频教程百度网盘
15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; ...
- 项目实战11—企业级nosql数据库应用与实战-redis的主从和集群
企业级nosql数据库应用与实战-redis 环境背景:随着互联网2.0时代的发展,越来越多的公司更加注重用户体验和互动,这些公司的平台上会出现越来越多方便用户操作和选择的新功能,如优惠券发放.抢红包 ...
- Asp.Net Core 2.0 项目实战(6)Redis配置、封装帮助类RedisHelper及使用实例
本文目录 1. 摘要 2. Redis配置 3. RedisHelper 4.使用实例 5. 总结 1. 摘要 由于內存存取速度远高于磁盘读取的特性,为了程序效率提高性能,通常会把常用的不常变动的数 ...
随机推荐
- 微信小程序 css overflow :hidden 子元素不生效
原css .item .right { width: 70%; } .item .right .name { font-size: 32rpx; font-family ...
- vscode 远程服务器同步
1.下载 sftp 2. 在项目目录下新建sftp.json文件 3. 编辑sftp.json文件 { "name": "My Server", "h ...
- java调用c++的几种方式
jni 类似c#调用c++的方式,定义java端的c++代码接口. package crayon.jni; public class JNITest { public native static vo ...
- visio任意图形填充
开发工具->操作->修剪->按住Shift键点击填充图形所有边 同时选中后->组合->开发工具->操作->连接 回到开始选项卡选择填充颜色 中途不要点击其他, ...
- java 将Excel数据读取到ListMap
将Excel数据读取到ListMap /** * 将Excel数据读取到ListMap * @param file */ public static List<Map<String, Ob ...
- VUE-使用touchstart、touchmove、touchend实现拖拽卡片列表,实现更新排序功能
感谢本文参考地址,原文解析更加清晰如有需要请移步:https://blog.csdn.net/weixin_40400844/article/details/114849253 怕原链接失效,将代码拷 ...
- 小白开始成长了+洛谷1488与CF629A Far Relative’s Birthday Cake题解
终于开始我的博客生活了,希望博客可以让我记住学了什么,错了什么,接下来会有什么将出现. 记录写ACM生涯中的一些经验和网工经验吧,如果有人看我博客的话,希望可以留言给我提提意见,指导指导我啦~~~ 正 ...
- X射线随笔
2023-02-27 千里马与伯乐 如果把X射线(X光)比做千里马的话,那这匹千里马的发掘,离不开伯乐的贡献.说起X射线的伯乐,就得从一个简短的故事说起: 1895年11月8日的夜晚,德国物理学家伦琴 ...
- sqlserver数据备份
sqlserver数据库 导入方法 第一种方法 1.打开SQL Server,写好登录名和密码点击连接. 2.打开数据库,右键某一个数据库,选择"新建查询(Q)". 3.再代码界面 ...
- 装了google浏览器不代表就能使用google搜索
第一步:装google浏览器 第二步:连接外网(FQ的本质就是连接一个服务器) 第三步:输入网址google.com 跳转到此页面即成功 现在的想法是