乐趣区

关于java:分布式缓存

缓存雪崩
缓存雪崩咱们能够简略的了解为: 因为原有缓存生效, 新缓存未到期间所有本来应该拜访缓存的申请都去查询数据库了, 而对数据库 CPU 和内存造成微小压力, 重大的会造成数据库宕机。从而造成一系列连锁反应, 造成整个零碎解体。个别有三种解决方法:

个别并发量不是特地多的时候, 应用最多的解决方案是加锁排队。
给每一个缓存数据减少相应的缓存标记, 记录缓存的是否生效, 如果缓存标记生效, 则更新数据缓存。
为 key 设置不同的缓存生效工夫。
缓存穿透
缓存穿透是指用户查问数据, 在数据库没有, 天然在缓存中也不会有。这样就导致用户查问的时候, 在缓存中找不到, 每次都要去数据库再查问一遍, 而后返回空 (相当于进行了两次无用的查问)。这样申请就绕过缓存间接查数据库, 这也是常常提的缓存命中率问题。
有很多种办法能够无效地解决缓存穿透问题, 最常见的则是采纳布隆过滤器, 将所有可能存在的数据哈希到一个足够大的 bitmap 中, 一个肯定不存在的数据会被这个 bitmap 拦挡掉, 从而防止了对底层存储系统的查问压力。另外也有一个更为简略粗犷的办法, 如果一个查问返回的数据为空(不论是数据不存在, 还是系统故障), 咱们依然把这个空后果进行缓存, 但它的过期工夫会很短, 最长不超过五分钟。通过这个间接设置的默认值寄存到缓存, 这样第二次到缓冲中获取就有值了, 而不会持续拜访数据库。

缓存预热
缓存预热就是零碎上线后, 将相干的缓存数据间接加载到缓存零碎。这样就能够防止在用户申请的时候, 先查询数据库, 而后再将数据缓存的问题! 用户间接查问当时被预热的缓存数据!

缓存更新
缓存更新除了缓存服务器自带的缓存生效策略之外(Redis 默认的有 6 中策略可供选择), 咱们还能够依据具体的业务需要进行自定义的缓存淘汰, 常见的策略有两种:

(1)定时去清理过期的缓存;
(2)当有用户申请过去时, 再判断这个申请所用到的缓存是否过期, 过期的话就去底层零碎失去新数据并更新缓存。

缓存降级
当访问量剧增、服务呈现问题 (如响应工夫慢或不响应) 或非核心服务影响到外围流程的性能时, 依然须要保障服务还是可用的, 即便是有损服务。零碎能够依据一些要害数据进行主动降级, 也能够配置开关实现人工降级。降级的最终目标是保障外围服务可用, 即便是有损的。而且有些服务是无奈降级的(如退出购物车、结算)。

本文由博客群发一文多发等经营工具平台 OpenWrite 公布

退出移动版