96SEO 2026-02-20 07:50 0
学习材料https://xiaolincoding.com/redis/cluster/cache_problem.html

在面对业务量较大的查询场景时会把数据库中的数据缓存至redis中避免大量的读写请求同时访问mysql客户端导致系统崩溃。
这种情况下客户端进来的请求会先经过redis缓存查询如果redis缓存过期则进而去查询mysql而后再将返回的结果返回给客户端并再redis中进行缓存。
于是就出现了一个问题如果此时redis中大量的缓存数据过期或者redis宕机那么客户端发起的请求还是会直接访问到数据库中会使得数据库的压力剧增导致数据库奔溃进而导致系统崩溃这就是缓存雪崩问题。
均匀设置过期时间应该尽量避免将大量数据设置同一个过期时间比如可以过期时间加上一个随机数这样就可以保证数据不会在同一个时间过期。
互斥锁当业务线程处理用户请求时发现请求的数据不在redis中则加入一个互斥锁保证这个时间内只有一个请求来进行缓存构建。
拿不到锁的请求要么就返回空值或者默认值要么就等构建完成之后再来获取缓存。
需要设置超时时间避免拿到锁的请求崩溃后导致系统阻塞崩溃后台更新缓存把更新缓存的工作交由后台线程定时更新。
服务熔断服务熔断就是一旦redis发生宕机那么所有对缓存服务的访问全部返回错误这样的话业务线会全部无法正常工作但是系统不会崩溃。
请求限流机制限流机制就是一旦redis发生宕机只允许少量的请求访问数据库再多的请求则在入口直接拒绝访问这种可以减少对业务的影响。
构建redis缓存高可用集群通过主从节点的方式构建redis缓存的高可用集群。
一般在秒杀活动这种大量访问某几个数据的情况下会出现此问题。
也就是某几个热点数据同时过期也会导致大量的请求击垮数据库这种情况就叫做缓存击穿。
缓存击穿其实可以认为是缓存雪崩中缓存过期的一种情况所以可以采用互斥锁或者后台更新缓存的方式来解决。
在缓存和数据库中都没有相关的业务数据此时就没办法构建缓存来服务后续的请求。
当有大量这样的请求进入时业务缓存中查询不到数据且无法构建缓存就会不停的查询数据库导致数据库压力过大甚至系统崩溃这就叫缓存穿透。
业务误操作将查询的数据进行了删除。
黑客攻击故意大量访问某些读取不存在数据的业务
限制非法请求在API入口处进行判断请求是否合理不合理的直接拦截避免进一步访问缓存或者数据库。
缓存空值或默认值如果发现线上业务出现缓存穿透的现象可以给这些值设置一个空值或者默认值返回避免访问数据库。
使用布隆过滤器快速判断数据是否存在避免通过查询数据库来判断数据是否存在
在面对并发请求时如何通过加互斥锁来避免缓存雪崩或者缓存击穿的问题
在客户端请求进来之后如果缓存中没有查询到数据则使用setNX的方式来设置一个状态位表示一种锁定状态。
如果返回结果是0说明锁已经被占领此时进行等待状态。
如果返回结果是1则去请求数据库将数据库中的数据读取到了之后再将此查询的key设置缓存共其他请求进行查询。
这样就可以保证在并发请求中只会有一个请求查询数据库其他请求只能等待重新发起查询从而解决缓存并发问题。
那么缓存策略的总体思路就是通过判断数据最新访问时间来做排名并过滤掉不常访问的数据只留下经常访问的数据具体细节如下。
个商品系统会根据商品的访问时间更新队列信息越是最近访问的商品排名越靠前。
同时系统会定期过滤掉队列中排名最后的
个商品加入队列中。
这样当请求每次到达的时候会先从队列中获取商品
等待过期等待redis中的key过期之后再重新去数据库读取数据进行更新。
完全依赖过期时间时间太短容易导致缓存失效频繁太长如果导致数据不一致。
尝试删除在更新数据库数据时尝试删除redis中的key如果删除成功下次查询该缓存时就会查询到数据库层然后再去更新缓存
如果数据库更新成功但是redis删除失败就会出现方案一的问题在高并发场景容易出现连接数过多的问题
主动更新另外搭建一个消费服务订阅消息队列再数据库数据更新时异步更新redis中的数据
实现成本高需要另外增加消费服务有时序性问题如果因为网络延迟导致同一条数据的两次更新推送没有按照更新的顺序来也会出现数据不一致问题依然有客户端连接数过多问题
订阅日志搭建一个消费服务去订阅数据库的binlog日志解析日志内的内容再去更新redis实现与业务完全解耦
在服务器压力不大的情况下延迟最低与业务解耦解决了时序性问题可靠性强
需要单独搭建一个同步服务成本高如果同步服务崩溃会导致数据长时间不更新
通常来说使用方案一就够了如果要增加更新的即时性就用方案二如果对于延时要求高就用方案三或四四能解决时序性问题。
具体需要结合业务场景调整。
使用主从复制搭建的Redis集群可以实现读写分离的效果一般使用一主多从主写从读。
但是这种模式有个问题就是一旦主从机有宕机的情况就需要人工介入进行IP切换。
哨兵模式则是在主从复制的基础上进行了升级加入了哨兵也就是当主机宕机时会通过哨兵的检测判定是否下线判定下线后会在其他的从机中选出一台主机然后调整其他从机的主机IP。
Cluster模式不仅有以上两种模式的优点且其会将数据分节点存储充分利用内存。
Redis
Cluster划分了16384个槽每个key通过CRC16校验后对16384进行取模来决定放置哪个槽集群的每个节点负责一部分的hash槽。
这样就避免了不同节点中的内存数据冗余。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback