门户网站申请,seo网站自动推广,网站建设的主要工作内容,wordpress自己写页面前言
Redis 是一个高性能的键值数据库#xff0c;广泛应用于缓存、会话存储、实时数据分析等场景。然而#xff0c;在高并发的环境下#xff0c;Redis 缓存可能会遇到 缓存击穿、缓存穿透 和 缓存雪崩 这三大问题。这些问题不仅影响系统的稳定性和性能#xff0c;还经常出…前言
Redis 是一个高性能的键值数据库广泛应用于缓存、会话存储、实时数据分析等场景。然而在高并发的环境下Redis 缓存可能会遇到 缓存击穿、缓存穿透 和 缓存雪崩 这三大问题。这些问题不仅影响系统的稳定性和性能还经常出现在面试题中值得我们深入了解。 1. 缓存穿透
定义
缓存穿透指的是查询一个不存在的数据时缓存层和数据库层都会返回空结果导致每次请求都直接访问数据库从而失去缓存的加速作用增加数据库的负担。 “穿透”可以简单的理解为缓存和数据库都不存在要查询的数据请求直接“穿透”了缓存。 场景
例如用户请求一个不存在的商品ID由于缓存和数据库中都没有该商品的信息请求直接穿透到数据库增加数据库的压力。
解决方案 布隆过滤器 使用布隆过滤器缓存不存在的请求避免每次都查询数据库。布隆过滤器可以高效判断某个元素是否在集合中减少不必要的数据库查询。 缓存空值 当查询结果为空时可以将空值缓存一段时间如 1-5 分钟避免频繁穿透。这样即使请求再次到来也能从缓存中返回空值减少数据库查询。
流程图 #mermaid-svg-fpoDO02uHQtX5IU4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fpoDO02uHQtX5IU4 .error-icon{fill:#552222;}#mermaid-svg-fpoDO02uHQtX5IU4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fpoDO02uHQtX5IU4 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-fpoDO02uHQtX5IU4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fpoDO02uHQtX5IU4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fpoDO02uHQtX5IU4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fpoDO02uHQtX5IU4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fpoDO02uHQtX5IU4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fpoDO02uHQtX5IU4 .marker.cross{stroke:#333333;}#mermaid-svg-fpoDO02uHQtX5IU4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fpoDO02uHQtX5IU4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fpoDO02uHQtX5IU4 .cluster-label text{fill:#333;}#mermaid-svg-fpoDO02uHQtX5IU4 .cluster-label span{color:#333;}#mermaid-svg-fpoDO02uHQtX5IU4 .label text,#mermaid-svg-fpoDO02uHQtX5IU4 span{fill:#333;color:#333;}#mermaid-svg-fpoDO02uHQtX5IU4 .node rect,#mermaid-svg-fpoDO02uHQtX5IU4 .node circle,#mermaid-svg-fpoDO02uHQtX5IU4 .node ellipse,#mermaid-svg-fpoDO02uHQtX5IU4 .node polygon,#mermaid-svg-fpoDO02uHQtX5IU4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fpoDO02uHQtX5IU4 .node .label{text-align:center;}#mermaid-svg-fpoDO02uHQtX5IU4 .node.clickable{cursor:pointer;}#mermaid-svg-fpoDO02uHQtX5IU4 .arrowheadPath{fill:#333333;}#mermaid-svg-fpoDO02uHQtX5IU4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fpoDO02uHQtX5IU4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fpoDO02uHQtX5IU4 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-fpoDO02uHQtX5IU4 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-fpoDO02uHQtX5IU4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fpoDO02uHQtX5IU4 .cluster text{fill:#333;}#mermaid-svg-fpoDO02uHQtX5IU4 .cluster span{color:#333;}#mermaid-svg-fpoDO02uHQtX5IU4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fpoDO02uHQtX5IU4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户请求不存在的数据 检查缓存 缓存未命中 检查数据库 返回空结果 缓存空值 减少数据库负载 2. 缓存击穿
定义
缓存击穿是指缓存中的某些数据在失效后大量请求同时访问该数据导致所有请求直接穿透到数据库增加数据库压力甚至可能导致数据库崩溃。 “击穿”可以简单的理解为缓存不存在但是数据库存在要查询的数据请求直接“击穿”了缓存。 场景
例如某个商品详情数据在缓存中过期多个用户同时请求该商品数据由于缓存失效这些请求直接访问数据库造成数据库负载骤增。
解决方案 互斥锁 在缓存失效时使用分布式锁确保只有一个请求访问数据库并更新缓存其余请求等待缓存更新完毕后再从缓存中获取数据避免同时访问数据库。 缓存预热 在系统启动时提前将常用数据加载到缓存中减少缓存失效的概率确保热点数据一直在缓存中。 合理的缓存失效时间 根据数据访问频率和业务需求合理设定缓存过期时间避免过短的失效时间引起频繁的缓存更新和数据库访问。
流程图 #mermaid-svg-iFSLAbdmmS63HuLL {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-iFSLAbdmmS63HuLL .error-icon{fill:#552222;}#mermaid-svg-iFSLAbdmmS63HuLL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iFSLAbdmmS63HuLL .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-iFSLAbdmmS63HuLL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iFSLAbdmmS63HuLL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iFSLAbdmmS63HuLL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iFSLAbdmmS63HuLL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iFSLAbdmmS63HuLL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iFSLAbdmmS63HuLL .marker.cross{stroke:#333333;}#mermaid-svg-iFSLAbdmmS63HuLL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iFSLAbdmmS63HuLL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-iFSLAbdmmS63HuLL .cluster-label text{fill:#333;}#mermaid-svg-iFSLAbdmmS63HuLL .cluster-label span{color:#333;}#mermaid-svg-iFSLAbdmmS63HuLL .label text,#mermaid-svg-iFSLAbdmmS63HuLL span{fill:#333;color:#333;}#mermaid-svg-iFSLAbdmmS63HuLL .node rect,#mermaid-svg-iFSLAbdmmS63HuLL .node circle,#mermaid-svg-iFSLAbdmmS63HuLL .node ellipse,#mermaid-svg-iFSLAbdmmS63HuLL .node polygon,#mermaid-svg-iFSLAbdmmS63HuLL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iFSLAbdmmS63HuLL .node .label{text-align:center;}#mermaid-svg-iFSLAbdmmS63HuLL .node.clickable{cursor:pointer;}#mermaid-svg-iFSLAbdmmS63HuLL .arrowheadPath{fill:#333333;}#mermaid-svg-iFSLAbdmmS63HuLL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iFSLAbdmmS63HuLL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iFSLAbdmmS63HuLL .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-iFSLAbdmmS63HuLL .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-iFSLAbdmmS63HuLL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iFSLAbdmmS63HuLL .cluster text{fill:#333;}#mermaid-svg-iFSLAbdmmS63HuLL .cluster span{color:#333;}#mermaid-svg-iFSLAbdmmS63HuLL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iFSLAbdmmS63HuLL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户请求数据 检查缓存 缓存失效 检查数据库 返回数据 更新缓存 后续请求直接访问缓存 3. 缓存雪崩
定义
缓存雪崩是指大量缓存数据在同一时间失效导致大量请求同时访问数据库给数据库带来巨大压力甚至可能导致数据库崩溃。 “雪崩”可以简单的理解为大量缓存同一时间失效缓存“雪崩”了。 场景
例如大量缓存数据设置了相同的过期时间所有缓存数据在某一时刻失效导致大量请求同时访问数据库可能引发雪崩效应。
解决方案 错开缓存过期时间 在缓存过期时间上增加随机偏移量错开过期时间减少缓存同时过期的情况。 使用永久缓存 对于不经常变化的数据可以使用永久缓存避免频繁失效减少数据库访问。 降级处理 当缓存系统发生故障时启用降级机制将部分请求转发至备用缓存或返回默认值减轻数据库压力。
流程图 #mermaid-svg-BHdjst0ftTnqfqqI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BHdjst0ftTnqfqqI .error-icon{fill:#552222;}#mermaid-svg-BHdjst0ftTnqfqqI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BHdjst0ftTnqfqqI .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-BHdjst0ftTnqfqqI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BHdjst0ftTnqfqqI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BHdjst0ftTnqfqqI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BHdjst0ftTnqfqqI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BHdjst0ftTnqfqqI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BHdjst0ftTnqfqqI .marker.cross{stroke:#333333;}#mermaid-svg-BHdjst0ftTnqfqqI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BHdjst0ftTnqfqqI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BHdjst0ftTnqfqqI .cluster-label text{fill:#333;}#mermaid-svg-BHdjst0ftTnqfqqI .cluster-label span{color:#333;}#mermaid-svg-BHdjst0ftTnqfqqI .label text,#mermaid-svg-BHdjst0ftTnqfqqI span{fill:#333;color:#333;}#mermaid-svg-BHdjst0ftTnqfqqI .node rect,#mermaid-svg-BHdjst0ftTnqfqqI .node circle,#mermaid-svg-BHdjst0ftTnqfqqI .node ellipse,#mermaid-svg-BHdjst0ftTnqfqqI .node polygon,#mermaid-svg-BHdjst0ftTnqfqqI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BHdjst0ftTnqfqqI .node .label{text-align:center;}#mermaid-svg-BHdjst0ftTnqfqqI .node.clickable{cursor:pointer;}#mermaid-svg-BHdjst0ftTnqfqqI .arrowheadPath{fill:#333333;}#mermaid-svg-BHdjst0ftTnqfqqI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BHdjst0ftTnqfqqI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BHdjst0ftTnqfqqI .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-BHdjst0ftTnqfqqI .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-BHdjst0ftTnqfqqI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BHdjst0ftTnqfqqI .cluster text{fill:#333;}#mermaid-svg-BHdjst0ftTnqfqqI .cluster span{color:#333;}#mermaid-svg-BHdjst0ftTnqfqqI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BHdjst0ftTnqfqqI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 多个缓存项过期 多个用户请求同时访问数据库 访问数据库 数据库返回数据 更新缓存 后续请求直接访问缓存 总结
缓存穿透查询数据时 缓存和数据库都不存使用 布隆过滤器 和 缓存空值 避免每次都访问数据库。缓存击穿查询数据时 缓存不存在数据库存在使用 互斥锁、缓存预热 和 合理的过期时间 解决。缓存雪崩查询数据时 大量缓存同一时间失效通过 错开缓存过期时间、使用永久缓存 和 降级处理 应对。