1)缓存的收益和成本分析
下图左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构。
下面分析一下缓存加入后带来的收益和成本。
收益:
①加速读写:因为缓存通常都是全内存的,而存储层通常读写性能不够强悍(例如MySQL),通过缓存的使用可以有效地加速读写,优化用户体验。
②降低后端负载:帮助后端减少访问量和复杂计算(例如很复杂的SQL语句),在很大程度降低了后端的负载。
成本:
①数据不一致性:缓存层和存储层的数据存在着一定时间窗口的不一致性,时间窗口跟更新策略有关。
②代码维护成本:加入缓存后,需要同时处理缓存层和存储层的逻辑,增大了开发者维护代码的成本。
③运维成本:以Redis Cluster为例,加入后无形中增加了运维成本。
缓存的使用场景基本包含如下两种:
①开销大的复杂计算:以MySQL为例子,一些复杂的操作或者计算(例如大量联表操作、一些分组计算),如果不加缓存,不但无法满足高并发量,同时也会给MySQL带来巨大的负担。
②加速请求响应:即使查询单条后端数据足够快(例如select*from table where id=
),那么依然可以使用缓存,以Redis为例子,每秒可以完成数万次读写,并且提供的批量操作可以优化整个IO链的响应时间。
2)缓存更新策略
有两个建议:
①低一致性业务建议配置最大内存和淘汰策略的方式使用。
②高一致性业务可以结合使用超时剔除和主动更新,这样即使主动更新出了问题,也能保证数据过期时间后删除脏数据。
3)缓存粒度控制
4)穿透优化
②布隆过滤器拦截
缓存空对象和布隆过滤器方案对比
5)无底洞优化
无底洞问题分析:
①客户端一次批量操作会涉及多次网络操作,也就意味着批量操作会随着节点的增多,耗时会不断增大。
相关阅读:2T架构师学习资料干货分享
②网络连接数变多,对节点的性能也有一定影响。
如何在分布式条件下优化批量操作?我们来看一下常见的IO优化思路:
O(1)
,这种方案会增加编程的复杂度。6)雪崩优化
7)热点key重建优化
当前key是一个热点key(例如一个热门的娱乐新闻),并发量非常大。 重建缓存不能在短时间完成,可能是一个复杂计算,例如复杂的SQL、多次IO、多个依赖等。在缓存失效的瞬间,有大量线程来重建缓存,造成后端负载加大,甚至可能会让应用崩溃。
①互斥锁:此方法只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存获取数据即可,整个过程如图所示。
下面代码使用Redis的setnx命令实现上述功能:
②永远不过期
从缓存层面来看,确实没有设置过期时间,所以不会出现热点key过期后产生的问题,也就是“物理”不过期。 从功能层面来看,为每个value设置一个逻辑过期时间,当发现超过逻辑过期时间后,会使用单独的线程去构建缓存。
两种热点key的解决方法
全栈架构社区交流群「全栈架构社区」建立了读者架构师交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起交流学习。
扫描添加好友邀你进架构师群,加我时注明【姓名+公司+职位】
看完本文有收获?请转发分享给更多人
往期资源: