还有一种情况,例如某个时间点内,系统预加载的缓存周期性集中失效了,也可能会导致雪崩 。为了避免这种周期性失效,可以通过设置不同的过期时间,来错开缓存过期,从而避免缓存集中失效 。
从应用架构角度,我们可以通过限流、降级、熔断等手段来降低影响,也可以通过多级缓存来避免这种灾难 。
此外,从整个研发体系流程的角度,应该加强压力测试,尽量模拟真实场景,尽早的暴露问题从而防范 。
文章插图
缓存无底洞现象该问题由 facebook 的工作人员提出的, facebook 在 2010 年左右,memcached 节点就已经达3000 个,缓存数千 G 内容 。
他们发现了一个问题---memcached 连接频率,效率下降了,于是加 memcached 节点,添加了后,发现因为连接频率导致的问题,仍然存在,并没有好转,称之为”无底洞现象” 。
文章插图
目前主流的数据库、缓存、Nosql、搜索中间件等技术栈中,都支持“分片”技术,来满足“高性能、高并发、高可用、可扩展”等要求 。
有些是在client端通过Hash取模(或一致性Hash)将值映射到不同的实例上,有些是在client端通过范围取值的方式映射的 。当然,也有些是在服务端进行的 。
但是,每一次操作都可能需要和不同节点进行网络通信来完成,实例节点越多,则开销会越大,对性能影响就越大 。
主要可以从如下几个方面避免和优化:
1、数据分布方式
有些业务数据可能适合Hash分布,而有些业务适合采用范围分布,这样能够从一定程度避免网络IO的开销 。
2、IO优化
可以充分利用连接池,NIO等技术来尽可能降低连接开销,增强并发连接能力 。
3、数据访问方式
一次性获取大的数据集,会比分多次去获取小数据集的网络IO开销更小 。
当然,缓存无底洞现象并不常见 。在绝大多数的公司里可能根本不会遇到 。
推荐阅读
- linux后台执行命令:&和nohup的用法
- nginx常见典型故障
- 光纤是怎么到你家的?一文了解清楚
- 白头叶猴的传说 白头叶猴有多少只
- 梦见火山喷发的岩浆 梦见火山岩浆是什么征兆
- 音视频跳线的使用方法
- 流浪地球相似的电影 比战狼还牛的国产电影
- 抖音,头条这类自媒体的推荐机制是什么?大数据如何给你贴标签?
- HTTP2.0中的Server Push
- php过滤只保留中文,英文以及数字的方法