一 本文目的
总结在高并发情况下,使用分布式缓存时需要了解的知识点:缓存穿透,缓存雪崩,缓存热点,缓存预热,缓存监控等,本文
不涉及本地缓存,浏览器缓存等其他缓存概念
以下文章阅读约需10min
二 知识点梳理
引子: 缓存作为高频访问且对时效性要求不高的数据访问需求的一种解决方案,在生产中被大量使用,下面总结了一些常见的知识点
1 缓存常见更新策略
数据库和缓存的内容应尽量保持一致,常见的缓存更新策略如下:
- Lazy模式,只保存一份缓存,获取时优先取缓存,如果获取不到,则从数据库查询, 查询时为避免产生雪崩问题,负责从数据库更新的程序先获取一个分布式锁,并发的其他程序
获取不到锁,可以等待一段时间,或者直接返回空; 这种方式是最常见的使用方式,不过高并发的时候,等待或者返空毕竟不是好的体验,所以有了下面双缓存模式;
- 双缓存模式,用空间换时间,保留2份缓存,一份永不过期,一份正常的过期时间,当获取正常缓存为空时,则返回永久缓存,同时发起请求db(一样加锁请求),成功后
更新正常的和永久的缓存,这个和Lazy模式相比,在体验上会好一些,但增加了缓存空间的使用量;
- 定时更新模式, 在前端使用缓存的应用上,根据缓存的过期时间,提前定期更新缓存;这种模式由于定期更新,所以数据即时性上相对差点,为了提高即时性,有了通知模式的改进;
- 通知模式,当缓存数据发生变化时,同时通过消息中间件,发送通知,通知前端应用进行更新,稍微需要注意的是为保证分区容错性,通常会发送多条通知消息;
- 双写模式,数据库发生变化时,也同步更新缓存,但由于缓存可能过期(包括cache服务器宕机)所以依然需要配合Lazy模式或者其他缓存丢失时策略一起使用;
2 分布式事务
如果缓存采用双写方式更新,则涉及分布式事务,通常做法是更新数据库时先删除缓存,等更新db成功后,再同步更新新的缓存,这样
不会因为先更新缓存,后更新db失败,导致一致性问题;虽然缓存先被删除,但是因为有其他策略,在访问数据时进行缓存恢复,所以也不用担心影响应用访问;
3 穿透问题
穿透问题指 大量的请求透过缓存,直接访问db,导致db压力变大; 产生的原因和应对策略如下:
a) 由于缓存同时过期导致(生产场景更多的是cache服务器宕机)
可以考虑,对同类的缓存在过期时间上设计为不同的固定过期时间 + 随机时间(一定范围内);
b) 由于缓存未命中导致
应对方案:
- 缓存key的合法性检查; 比如在服务器被刷时,可能会被攻击而请求一些无效的key,这时候可以做一些key的合法性验证进行过滤;
- 枚举合法的key; 推荐使用布隆过滤器(Bloomfilter),枚举出常用的合法key,进行校验; 不过通常业务中很难把合理的缓存key都枚举出来;
- 缓存空值;由于从db中反馈是空值,这时候可以考虑在缓存中保存一些空值,比如空对象,或者空集合,但要根据实际的一致性需求控制好过期时间;
4 雪崩问题
缓存雪崩指当缓存过期时,由于高并发访问,大量的请求访问到后台数据库查询,导致db系统性能下降,进而导致雪崩的情况;
避免雪崩问题,其实更多的还是考量缓存的更新策略, 通过分布式锁的方式,来避免并发请求同时请求db生成缓存;
5 缓存预热
缓存预热通常指新系统刚上线,由于缓存中无值,可能导致大量的查询穿透到db,可根据实际业务,考虑是否预加载一部分内容到缓存中;
6 热点问题
比较常见的是热点key触发单点限流,具体指当某个缓存key访问量比较高时,很可能会触发单台或某几台缓存服务器网络流量限流(可监控缓存集群不同服务器的流量来观察),限流导致获取不到缓存
从而请求穿透到db,进而可能引起雪崩;
应对方案: 可考虑用空间换时间, 通过为热点key维护多份相同的缓存, 请求缓存时通过轮询,hash等路由算法,分散请求到不同的缓存服务器;
三 监控指标和告警
上面主要介绍了一些高性能情况下缓存的设计实践,除此之外,我们还需要关注一些缓存的监控指标;
1 缓存的命中率
命中率=命中数/(命中数+没有命中数), 是判断缓存效果好坏的重要指标之一;如命中率过低,则需要考虑 缩短命中率低的缓存的过期时间,减少空间浪费;
2 网络流量
流出流量 = Sum (key1的value值 * QPS + … + keyn的value值 * QPS) ;网络流出量考量的是机房网络环境,交换机上限,如发现流出流量达到瓶颈,应考虑进行
缓存扩容,或者拆分部分到该节点的缓存到其他节点;
3 缓存内存,Swap使用率
监控单台缓存服务器的内存使用量; 内存使用量达到一定告警阀值应提前扩容,同时review代码看是否有,对缓存使用不当的程序,造成了空间使用量激增;
4 QPS
连接数; 连接数和网络流量类似,考量的是单机瓶颈;
5 慢查询
由于Redis中慢查询是阻塞其他访问的,所以定期查看慢查询日志,避免突发的QPS下降; 由大key引起的慢查询,常见的解决方案是,拆分大key,或者为大Key
单独开独立缓存节点,主要思路还是隔离这种访问,避免影响到主业务;
总结,本文介绍了高并发场景下,缓存的常见知识点,希望能为大家在设计解决方案时提供参考;
相关推荐
1. 高并发网站架构:高并发网站指的是能够处理大量同时访问的网站,这种网站架构设计是为了应对大量用户同时请求数据或服务时的性能和稳定性需求。高并发网站通常采用多种技术手段,如负载均衡、分布式部署、缓存...
本项目实战教程涵盖了高并发、集群以及分布式系统架构等关键知识点,旨在帮助Java架构师提升技能,实现高性能、高可用和可扩展的电商系统。 1. **Java基础与高级特性** - Java的基础语法、面向对象编程、异常处理...
服务端高并发分布式架构演进之路的知识点可以从以下几个方面来详细说明: 1. 基本概念介绍 - 分布式架构:在不同的服务器上部署系统各个部分,以提升系统伸缩性和可用性。 - 高可用性:系统或服务在各种情况下都...
分布式缓存常见知识点(高并发、高可用、通信模型、主从架构、主备切换、哨兵、redis cluster集群、持久化、过期策略、缓存雪崩、穿透等等)
学习分布式缓存,你需要理解以下几个关键知识点: 1. **缓存穿透**:当请求的数据既不在缓存中也不在数据库中时,可能导致大量请求直接打到数据库,需要设计合理的缓存策略来避免,例如使用布隆过滤器。 2. **缓存...
在分析给定文件内容的基础上,以下是对"高并发高可用的分布式电商平台架构研究"这一主题的知识点的详细阐述。 分布式电商平台架构是为了应对传统软件架构在面对大规模并发请求时,性能下降、可拓展性不足等问题而...
在Java面试中,高并发、高可用和分布式是考察开发者技术深度和广度的...通过深入理解并掌握以上知识点,开发者能够更好地应对Java面试中关于高并发、高可用和分布式的问题,也能在实际项目中构建出高效、稳定的系统。
从给出的文件信息中,我们可以提炼出以下知识点: ### 标题和描述知识点 ...这些知识点对于理解当前云计算架构中的数据存储解决方案具有重要意义,并指导实际工作中如何有效利用分布式缓存技术。
在探讨《Java架构专题,高并发架构下性能提升千倍内幕揭秘》这一主题时,我们需要深入分析高并发场景下的Java架构优化策略和技术细节。虽然提供的部分内容似乎存在乱码问题,但我们可以根据标题、描述和标签来展开...
在亿级流量的电商详情页系统中,面对庞大的用户访问量和实时数据处理需求,构建一个大型、高并发、高可用的缓存架构是至关重要的。这种架构设计旨在提高系统的响应速度,降低数据库压力,保证服务的稳定性。下面将...
### 高性能高并发服务器架构的关键知识点 #### 1. 高性能高并发服务器架构概述 - **背景**: 在互联网迅速发展的背景下,越来越多的网站面临着大量用户访问带来的挑战。为了应对这种挑战,需要构建高性能、高并发的...
本资源摘要信息主要讲述了高并发支付系统架构设计与实践的相关知识点,包括数据分级、缓存机制、分布式数据库、O/R Mapping、xml格式、客户端实现分布式缓存、一致性哈希算法、zookeeper等技术。这些技术可以提高...
根据给定的信息,我们可以深入探讨以下几个关键知识点: ### 一、Redis与分布式缓存 #### 1.1 Redis概述 Redis是一种开源的键值数据库,它支持多种数据结构,如字符串、哈希、列表等,并且它将数据存储在内存中以...
总的来说,这本书全面覆盖了高并发编程中的关键知识点,包括多线程原理、线程池实现、并发控制、分布式系统架构以及面试技巧,适合有志于提升并发编程能力的后端开发者阅读,尤其是对分布式锁和Java并发编程感兴趣的...
通过以上知识点,我们可以了解到Redis分布式缓存的实现原理,以及如何通过分布式部署解决存储瓶颈、高并发问题和容灾问题。此外,一致性哈希算法和静态哈希算法是分布式缓存中的关键算法,它们在分布式系统中扮演着...
以下详细解析了大并发架构设计中涉及的关键知识点。 1. 高质量软件架构设计 高质量软件架构设计是系统设计的基石,它要求架构师具有前瞻性,能够预见到未来系统可能面临的挑战,并做出相应的设计。架构设计不仅包括...
Redis作为一款高性能的键值对内存数据库,常被用于实现分布式缓存,广泛应用于互联网架构中,以提高系统的响应速度和处理能力。本教程将深入探讨如何在Springboot和Mybatis框架下集成并利用Redis来构建高可用、高...
**知识点生成:高性能高并发服务器架构** 在探讨高性能高并发服务器架构时,我们不仅关注理论框架,更应着眼于实际应用,尤其是那些成功案例所展示的技术和策略。以下是从《高性能高并发服务器架构.pdf》中提炼出的...
在亿级流量电商详情页系统中,面对高并发与高可用的挑战,缓存架构扮演着至关重要的角色。本课程将深入探讨如何构建一个能够处理大量流量并保持高可用性的缓存系统。以下是对核心知识点的详细阐述: 1. **亿级流量...