文章前言分布式缓存1、缓存平衡器2、缓存直通3、缓存预热4、缓存更新5、缓存停机
前言
如果你觉得有用的话,请给我博主点个赞,评论,收藏一键三连啊。 很难写啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,如果真的是白妓女的话,请经常来。
分布式缓存序列号缓存问题1缓存平衡器2缓存穿透3缓存预热4缓存更新5缓存停机1缓存平衡器【缓存雪崩】表示原始缓存已过期(过期) 所有请求都联系数据库,但会给数据库的CPU和内存带来很大压力,严重时会导致数据库停机。 从而形成一系列连锁反应,整个系统崩溃。
解决思路:
达到降低各缓存过期重复率的目的,或者制造延迟过期行为,防止最终导致群体失效的事件。
解决方案:
第一个解决方案:
为key设置不同的缓存过期时间会降低每个缓存过期时间的重复率,从而避免发生集体禁用事件。
第二个解决方案:
将相应的缓存标志添加到每个缓存数据,记录缓存禁用,如果缓存标志被禁用,则更新数据缓存。 实例伪代码如下:
//伪代码公共对象获取产品列表new () { int cacheTime=30; String cacheKey='test_list '; //缓存标志_ signstringcachesign=cachekey ' _ sign '; 字符串sign=cache helper.get (cachesign ); //缓存值stringcachevalue=cache helper.get (cachekey ); if(sign!=null (返回缓存值; //过期,返回原样(else ) cachehelper.add ) cachesign,'1',cacheTime ); thread pool.queueuserworkitem ((arg )-)//此处一般为sql查询数据cache value=getproductlistfromdb ); //日期是缓存时间的两倍,用于脏读cachehelper.add(cachekey,cacheValue,cacheTime * 2)。 ); 返回缓存值; } 说明:
缓存标记:记录缓存数据是否过期,如果过期,通知另一个线程在后台更新实际密钥的缓存;缓存数据:其过期时间比缓存令牌的时间长一倍。 示例:缓存令牌的时间为30分钟,数据缓存设置为60分钟。 这样,在缓存标志key过期后,实际缓存可以将旧数据返回给调用方,新缓存2、缓存透明缓存穿透,直到另一个线程在后台更新这意味着用户查询时,在缓存中找不到它,每次都要去数据库再次查询并返回空值(等于进行了两次无用的查询)。 这样的请求会绕过缓存直接查询数据库,这也是经常出现的“缓存命中率”问题。
解决方案:
如果查询返回的数据为空,无论数据不存在还是系统故障,都会缓存空结果,但过期时间较短,最多不超过5分钟。 由于使用此直接设置的默认值存储在缓存中,因此第二次缓冲区检索将保留该值,并且不会继续访问数据库。
3、缓存预热缓存预热是指系统上线后,将【相关的缓存数据】直接加载到缓存系统中,用户请求时查询数据库后再进行数据
解决方案:
数据量小时,项目启动后自动加载; 数据量大的情况下,可以定时加载; 人工设计缓存加载web功能; 4、更新缓存更新缓存除了缓存服务器拥有的缓存吊销策略外,Redis默认情况下还有6个策略可供选择。 此外,还可以根据特定业务需求定制缓存处置。
定期清理过期缓存的用户请求时,判断用于该请求的缓存是否过期,过期后到下级系统获取新数据,更新缓存。 两者各有优劣,第一个缺点是维护大量缓存的密钥很麻烦,第二个缺点是每次用户请求时都必须判断缓存无效,逻辑比较复杂,具体使用哪个方案,大家都知道
5、缓存关闭需要确保服务在访问量激增、服务出现问题(响应时间慢、不响应等)或非核心服务影响核心进程性能时仍然可用。 即使服务受损。 系统可以根据一些重要数据自动降级,也可以配置交换机并手动降级。
降级的目的:
保证即使核心服务损坏也可以使用。 此外,某些服务不能降级(加入购物车、结算等)。
降级前要整理系统,看系统是否能失去保帅; 从而,整理出哪些是必须冒着生命危险保护的,哪些是可以降级的; 例如,可以参照日志级别来设定预案。
一般:(例如,一些服务可以偶尔因网络抖动或服务在线而超时并自动降级;警告:部分服务在一定时期内成功率有变动,例如95~100%之间可以自动降级或人工降级,发送警告;错误:例如,可用性低于90%,数据库连接池破裂,突然访问数量激增到系统能够承受的最大阈值,在这种情况下,根据情况自动降级或严重错误:例如,由于特殊原因数据错误,需要紧急人工降级。参考:
3359 blog.csdn.net/xlg en 157387/article/details/79530877