我的第一个redis应用的方法代码如下:

public List<QuestionsLibrary> GetRedisQuestionsLibraryList()  {  var qlist = RedisHelper.ListRange<QuestionsLibrary>(RedisKey.RedisQuestionsLibraryList);  if (qlist == null || qlist.Count() <= 0)  {  List<QuestionsLibrary> list = new QuestionsLibraryService().GetNolock(m => true).ToList();  RedisHelper.ListRightPush(RedisKey.RedisQuestionsLibraryList, list);  return list;  }  else  {  return RedisHelper.ListRange<QuestionsLibrary>(RedisKey.RedisQuestionsLibraryList);  }  }  

此方法在使用中通过对服务器的监察,发现cpu从原来的1%左右飙升到40-50%。而且在错误日志出现了大量有关redis超时提示。错误提示代码如下:

Timeout performing LRANGE Redis:QuestionsLibraryList, inst: 7, queue: 8, qu: 0, qs: 8, qc: 0, wr: 0, wq: 0, in: 2944, ar: 0, clientName: iZ25f3l6awvZ, serverEndpoint: 127.0.0.1:8383, keyHashSlot: 3349, IOCP: (Busy=1,Free=799,Min=8,Max=800), WORKER: (Busy=9,Free=791,Min=8,Max=800) (Please take a look at this article for some common client-side issues that can cause timeouts: http://stackexchange.github.io/StackExchange.Redis/Timeouts)

可以确认这个都是页面调用RedisHelper.ListRange这个方法引起的。从网上扒的资料来看,redis是单进程,单线程的。也就是说,短时间内网站向redis服务发出了大量的ListRange指令。由于指令是在队列中一条一条处理的。导致后面的指令得不到处理。

我又到服务器上打开cmd窗口,然后进入redis命令后输入:

SLOWLOG GET

然后发觉最近的超时命令都是LRANGE,而且每条都超过了10几秒。但我很疑惑,因为我的RedisHelper类是单例连接,使用的都是静态方法和静态属性,静态变量。难道是我使用的GetRedisQuestionsLibraryList() 不是静态方法的缘故?这不科学啊,虽然我这个方法是实例方法。可是这个方法中自redis服务中获取值的方法确实实实在在的静态方法啊。这令我很凌乱,在网上扒资料,并没有找到这块有用的东西。但问题还是要解决。因为没有理论佐证,只好进行尝试。于是我把此方法改为静态属性的形式代码:

protected static List<QuestionsLibrary> RedisQuestionsLibraryList{get{var qlist = RedisHelper.ListRange<QuestionsLibrary>(LMSoft.WebCommon.RedisKey.RedisQuestionsLibraryList);if (qlist == null || qlist.Count() <= 0){List<QuestionsLibrary> list = new QuestionsLibraryService().GetNolock(m => true).ToList();RedisHelper.ListRightPush(LMSoft.WebCommon.RedisKey.RedisQuestionsLibraryList, list);return list;}else{return qlist;}}}

然后修改相关调用代码,编译,上传到服务器上进行测试。结果出现了大量的redis的Timeout performing LRANGE Redis超时提示。和原来的错误一样。果断修改为静态方法形式进行测试,代码如下:

 protected static List<QuestionsLibrary> GetRedisQuestionsLibraryList(){var qlist = RedisHelper.ListRange<QuestionsLibrary>(LMSoft.WebCommon.RedisKey.RedisQuestionsLibraryList);if (qlist == null || qlist.Count() <= 0){List<QuestionsLibrary> list = new QuestionsLibraryService().GetNolock(m => true).ToList();RedisHelper.ListRightPush(LMSoft.WebCommon.RedisKey.RedisQuestionsLibraryList, list);return list;}else{return qlist;}}

修改相关调用代码,编译,上传服务器测试,仍然是哪个错误提示。我表示很无语。马上再换,这次换为静态变量的形式,代码如下:

protected static List<QuestionsLibrary> RedisQuestionsLibraryList = getRedisQuestionsLibraryList();private static List<QuestionsLibrary> getRedisQuestionsLibraryList(){var qlist = RedisHelper.ListRange<QuestionsLibrary>(LMSoft.WebCommon.RedisKey.RedisQuestionsLibraryList);if (qlist == null || qlist.Count() <= 0){List<QuestionsLibrary> list = new QuestionsLibraryService().GetNolock(m => true).ToList();RedisHelper.ListRightPush(LMSoft.WebCommon.RedisKey.RedisQuestionsLibraryList, list);return list;}else{return qlist;}}

上传上去后,观察网站cpu的使用。又观察错误日志代码。经过一个多小时的跟踪,这次没发现cpu使用大幅上扬的情况,也没发现超时错误。这算是解决了。可是我很无语,你说实例方法调用,会出现大量排队现象,怎么静态方法及静态属性这两种获取方法也出现大量redis排队现象。概念理解的不透么,也只能这样说了。

扒了扒资料也就找到一个似乎能解释通的。提到了静态变量的初始化及赋值。

1、任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项

2、如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数

3、类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数

这意味着我上面所写的静态变量的赋值方法,其实在C#的编译器中是自动创建的静态构造函数中完成的赋值操作,并且只执行了一次。。

静态方法及静态属性按我以前的理解,它是所有该类的实例方法都可以使用的,并且在这里的话这个静态方法或者静态属性只调用一次Redis中的LRANGE命令。然而从测试的情况来看,它和实例方法一样,每次使用都要调用一次Redis中的LRANGE命令。我又对静态方法及静态属性的理论解释深入挖掘,发现了一个有意思的解释,就是它是一系列行为的组合。是一个action,也就是动作。那这也意味着每次调用的时候,它里面的一系列操作都要执行一遍。这样就解释通了。由于每次调用静态属性和静态方法,里面的操作都要执行,那自然对Redis的LRANGE命令进行了多次调用操作。然后导致了redis报超时错误。而静态变量由于赋值就进行了一次,也就是Redis的LRANGE命令只调用了一次,所以不会遇到由于大量调用造成超时的问题

第一个redis应用方法导致的提示redis LRANGE命令超时问题的解决相关推荐

  1. ubuntu安装redis的方法以及PHP安装redis扩展、CI框架sess使用redis的方法

    为什么80%的码农都做不了架构师?>>>    再一次被网上那些教程误导后决定自己写一个.真心被那些奇怪的教程误导了好几次,之前研究其它东西的时候也是.蛋疼啊. 安装redis 直接 ...

  2. centos 中使用sqlplus 登陆oracle提示bash.sqlplus命令未找到的解决方法

    出现这个问题是因为环境变量失效: 解决方法: 首先需确认当前用户是否是oracle 若不是请执行  su oracle 然后执行下面两步 1)   $ cd ~ 2)$ source .bash_pr ...

  3. 微软服务器连接失败,Win10更新导致TLS连接失败或连接超时 微软已解决

    11月7日消息  微软在win10仪表盘日志中确认最新累积更新可能导致某些不支持扩展主密钥的客户端出现安全连接超时.这个问题实际上是微软修复CVE-2019-1318安全漏洞导致的,攻击者利用这个漏洞 ...

  4. java 网页提示被阻止怎么办_win7系统网页提示应用程序被JAVA安全阻止_win7系统网页提示应用程序被JAVA安全阻止解决方法-系统屋...

    在电脑通过玩意打开应用程序的时候突然被JAVA安全阻止,那么你知道win7系统打开网页提示应用程序已被JAVA安全阻止怎么办?为此系统屋为你带来一个详细的win7系统网页提示应用程序被JAVA安全阻止 ...

  5. 系统更新链接服务器超时,win10系统更新导致Dr.com连接认证服务器超时的解决方法...

    很多小伙伴都遇到过win10系统更新导致Dr.com连接认证服务器超时的困惑吧,一些朋友看过网上零散的win10系统更新导致Dr.com连接认证服务器超时的处理方法,并没有完完全全明白win10系统更 ...

  6. win10出现一个mysql账户密码错误_Windows 10 访问网络共享 总是提示用户名或密码不正确的解决方法...

    今天同事在Windows10上共享了一些文件,其他使用Windows 7的同事都可以正常使用,唯独我是使用Windows 10操作系统的,和别人输入一样的用户名和密码,却总是告诉我:用户名或密码不正确 ...

  7. Redis攻击方法总结

    Redis是什么? Redis是数据库的意思.Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日 ...

  8. redis mysql 原子计数器_使用redis的increment()方法实现计数器功能案例

    一直知道redis可以用来实现计数器功能,但是之前没有实际使用过,昨天碰到一个需求:用户扫码当天达到20次即提示:当日扫码次数达到上限! 当时就想到使用redis的递增方法increment()来实现 ...

  9. Linux执行可执行文件提示No such file or directory的解决方法

    Linux执行可执行文件提示No such file or directory的解决方法 查阅资料后,原因是系统位数与该可执行文件需要的lib库位数不匹配. 用uname命令打印系统信息,发现系统是6 ...

最新文章

  1. 开发日记-20190621 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  2. python代码壁纸-python设置windows桌面壁纸的实现代码
  3. 什么时候用抽象?什么时候用接口?
  4. 【android】窗口管理
  5. router vue 多个路径_多个vue子路由文件自动化合并的方法,
  6. 用STS创建Maven的Web项目转
  7. 2018全球大学AI排名发布,中国高校表现强势!
  8. 数学图形之SineSurface与粽子曲面
  9. MySQL(8)存储过程和函数
  10. Emlog明月浩空主题模板V2.7分享
  11. dm8148 videoM3 link源代码解析
  12. Java学习路线,Java SE,EE,ME的区别,SSM框架基本概念
  13. HTTP协议详解 (转)
  14. Officescan防毒墙安装部署
  15. 浅谈CVPR2022的几个研究热点
  16. 无人驾驶公司实力排名---自动驾驶初创企业排名(roadstar.ai、pony.ai、momenta、景驰和驭势科技等)
  17. 计算机基础课程高质量公开课程整理(长期整理)
  18. 【OpenCV入门到精通之九】OpenCV之视频截取、图片与视频互转
  19. 博客园博客Wiz测试
  20. (亲测有效)在SecureCRT终端挂载Ubuntu时遇到的问题

热门文章

  1. 35.JAVA编程思想——JAVA IO StreamTokenizer
  2. 【十日谈】编程上的追求卓越和圈子论
  3. 推荐3款实用软件,每款都精挑细选,用一次就会爱上
  4. 京微齐力:基于P1P060的OLED动态显示(温湿度实时数据)
  5. C语言如何引用别的文件中的static函数
  6. 计算机毕业设计Java办公自动化管理系统(源码+系统+mysql数据库+lw文档)
  7. 韩松手机摄影笔记第十一课--静物美食及生活随拍
  8. 关于NIOS中Avalon总线的问题分析
  9. C++ 那些被遗漏的细节2 map emplace emplace_hint
  10. rsyslog采集audit日志