凡科网做的网站,2021年php凉透了,宜昌百度网站建设,网站建设需要购买什么异常场景springWeb应用一直运行正常#xff0c;同事最近反应#xff0c;每次版本更新完毕#xff0c;刷新缓存#xff0c;就会导致应用挂死。只有重启redis应用才恢复正常。项目概况springWeb项目#xff0c;常用配置表做了redis缓存#xff0c;配置表中只有少量数据同事最近反应每次版本更新完毕刷新缓存就会导致应用挂死。只有重启redis应用才恢复正常。项目概况springWeb项目常用配置表做了redis缓存配置表中只有少量数据多也就是1~2K条记录。用redission做分布式锁与缓存用的同一个reids服务。分析过程由于系统之前一直稳定运行只是最近才有问题先从异常日志查起吧。通过查看tomcat日志发现大量redis time out异常。起初怀疑是不是网络原因但是通过几次更新有下午有晚上而且如果有网络问题其他应用也会有问题。所以排除了网络原因。tomcat日志怀疑redis连接池配置是否有问题通过查看redission配置dnsMonitoring参数在低版本的redission中可能导致超时异常。但是通过设置该参数并未解决问题。镜头再回到刚开始询问同事每次都是一操作web端的缓存管理--清除缓存系统就挂死。从web端重新开始分析但是貌似也看不出什么问题。ICacheManager cacheManager getCacheManager();ICache cache cacheManager.getICache(cacheName);cache.clear();再统计一下redis中存放的key确实不少分类统计了下发现缓存数量与实际表中的配置数量差异比较大。于是有这样的假设清空全部缓存会先读出缓存列表逐个清除如果缓存比较大就有可能把系统搞死。然后找证据。通过redisDesktopManager查看数量最多的key和value发现缓存的key怎么是对象value为空的listxACxEDx00x05tx00x7FCustomSimpleKey_getSecondTypesCache(class xxx.Param)[{[object Object]null, timestamp1589501938332}]再查看缓存接口发现缓存失效策略为永久生效。原来spring缓存接口自动会把接口方法名参数当作keydb查询结果当作value缓存。ICacheable(cacheSeconds Constant.FOREVER)public List getxxxById(String id){return dao.select(conf1, id);}至此就可以解释了。缓存的key随着入参的不同会越来越多而且不会失效。前台操作清除缓存时缓存管理器会把所有key读入内存逐个清除。由于redis是单线程运行的在清除缓存的过程中redis不能对外提供服务所有用到缓存的地方请求不到redis连接就报timeout异常了。其实这和web端列表展示要分页是一个道理如果不分页直接从db读取一个大list本身就是欠考虑的操作。解决方案redis缓存一定要设置失效时间不要设置成永久生效web端清除缓存操作优化reids监控还是得加上尤其是这种数量比较大的key应该增加告警机制此处可以使用ELKStack中的metricbeat之redis模块配合kibana仪表盘展示一目了然还可以告警妥妥的。