Redis缓存穿透、击穿、雪崩

a89c30a3b93a4d0c81081a64b5ab0a09.jpg一、Redis的缓存穿透

 

1.什么是缓存穿透?

缓存穿透是指:客户端请求的数据在缓存中和数据库中都不存在,这时缓存就永远不会生效,这些请求都打到数据库从而导致数据库压力过大。

 

2.出现缓存穿透的解决方案,以下是常用的两种:

(1)做缓存空对象:

如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟。

缓存空对象的优缺点:

优点:实现简单,维护方便

缺点:额外的内存消耗,以及可能造成短期的数据不一致。(如果在做了空缓存之后,我们向数据库中插入了新的数据,而插入的数据正好是之前做了空缓存的数据,此时就会出现短期数据不一致的问题)

(2)使用布隆过滤器:

布隆过滤器(Bloom Filter),它实际上是一个很长的二进制向量(位图)和一系列的随机映射函数(哈希函数),它可以用于检索一个元素是否存在一个集合中,他的优点是空间的查询效率和查询时间都远远超过一般算法,缺点是有一定的误识别率和删除比较困难。

如下是加入布隆过滤器的一个实现流程:

使用布隆过滤器的优缺点:

优点:内存占用少,没有多余的key

缺点:实现的过程比较复杂,并且存在误判的可能

 

二、缓存击穿

1.什么是缓存击穿

** 缓存击穿也叫热点key问题,就是一个被高并发访问并且缓存业务重构复杂的key突然失效了,无数的请求会在瞬间给数据库带来巨大的冲击。**

当缓存的热点key过期后,一个线程来请求数据,查询缓存未命中,然后从数据库中查询然后重新构建缓存数据(需要一定的时间),在缓存数据还没构建完成此时又有大量请求进来去查询数据,缓存中未命中数据,于是后面进来的请求也同步之前请求从数据库中查询数据并构建缓存的这一过程,此时这些请求全部打到数据库中,导致数据库压力变大。

2.出现缓存击穿的结局方案:

(1)利用互斥锁:

即一个线程得到锁去更新数据的时候,其他线程进来去查询数据的时候需要先去获取锁才能去查询数据库来更新缓存。此时因为已经有线程去更新缓存了,故在多次查询后就可命中缓存中的数据。

(2)设置逻辑过期:

对比以上两种方案优缺点如下:

互斥锁

优点

没有额外的内存开销

保证了一致性

实现简单

缺点

 

线程需要等待

可能会有死锁的风险

逻辑过期:

优点:

 

线程无需等待,性能较好

缺点:

 

不保证一致性

有额外的内存消耗

实现比较复杂

三、缓存雪崩

1.什么是缓存雪崩:

缓存雪崩是指:在同一时间段大量的缓存key失效或者Redis宕机,这时候大量的请求向数据库请求信息,此时可能就会把数据库压垮。

过程大致如

出现缓存雪崩的解决方案常用的有如下:

(1)给不同的key的TTL设置随机值

(2)利用Redis集群提高服务的可用性

(3) 给缓存业务添加限流降级的策略

(4)给业务添加多级缓存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/145540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis运维(五)再探redis

一 redis概述 ① redis简介 redis三大特性: 缓存、分布式内存数据库、持久化说明:非必须不建议在redis终端操作 ② redis亮点 ③ 初露锋芒 redis-benchmark redis-benchmark并发压力测试的问题解析 备注:多次测试取平均值,最好在物理机…

JVM内存模型:理解Java程序的内存管理

JVM内存模型:理解Java程序的内存管理 在Java编程中,JVM(Java虚拟机)是程序的运行环境,它负责管理程序的内存。JVM内存模型是Java语言规范中定义的一套规则,用于描述在JVM中程序如何通过内存来交互和操作。…

如何通过数据治理来提升业务价值——业务场景治理

数据治理,一方面是为了对数据的规范管理和控制,还有一方面是让数据能够为业务提供服务和创造价值。近些年来,随着数据治理技术发生着日新月异的变化,行业对数据治理的需求和指导也被逐步推进和实践,从宏观上看&#xf…

Django模版层

解析: forloop内置对象:运行结果解析 counter0: 从0开始计数 counter : 从1开始计数 first: True,判断循环的开始 last : Tues,判断循环的结束模版变量的书写 我们可以在html中编写python代码。 演示: {{ 填写变量 }}{% 填写类的 %}{{ d.0 }} {{ d.1 }…

CentOS挂载:解锁文件系统的力量

目录 引言1 挂载简介2 挂载本地分区3 挂载网络共享文件系统4 使用CIFS挂载结论 引言 在CentOS(一种基于Linux的操作系统)上挂载文件系统是一项常见而重要的任务,无论是将新的磁盘驱动器添加到系统,还是挂载网络共享资源&#xff…

Amazon Bedrock | 大语言模型CLAUDE 2体验

这场生成式AI与大语言模型的饥饿游戏,亚马逊云科技也参与了进来。2023年,亚马逊云科技正式发布了 Amazon Bedrock,是客户使用基础模型构建和扩展生成式AI应用程序的最简单方法,为所有开发者降低使用门槛。在 Bedrock 上&#xff0…

面试经典(6/150)轮转数组

面试经典(6/150)轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 以下为自己的思路,我不明白最终的返回值为什么有误,好像是题目里要求原地解决问题,而我创…

K8S篇之k8s containerd模式fail to pull image certificate signed by unknown authority

一、前言 解决"k8s containerd模式fail to pull image certificate signed by unknown authority"的问题 二、操作步骤 您有两个选择:配置证书或禁用证书验证。 具体步骤如下: 方法一:配置证书 找到未知机构签名的证书文件&#x…

TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…

YOLOv5 分类模型 Top 1和Top 5 指标实现

YOLOv5 分类模型 Top 1和Top 5 指标实现 flyfish import time from models.common import DetectMultiBackend import os import os.path from typing import Any, Callable, cast, Dict, List, Optional, Tuple, Union import cv2 import numpy as npimport torch from util…

集合对象的几种初始化方式

最简单的方式是通过new构建一个对象&#xff0c;构建对象后再进行赋值&#xff1a; // 通过new创建并赋值 List<Integer> list new ArrayList<>(); list.add(1); list.add(2); list.add(3);Set<Integer> set new HashSet<>(); set.add(1); set.add(…

小米路由器4A千兆版刷入OpenWRT并远程访问

小米路由器4A千兆版刷入OpenWRT并远程访问 文章目录 小米路由器4A千兆版刷入OpenWRT并远程访问前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理…

SpringBoot-配置文件properties/yml分析+tomcat最大连接数及最大并发数

SpringBoot配置文件 yaml 中的数据是有序的&#xff0c;properties 中的数据是无序的&#xff0c;在一些需要路径匹配的配置中&#xff0c;顺序就显得尤为重要&#xff08;例如在 Spring Cloud Zuul 中的配置&#xff09;&#xff0c;此时一般采用 yaml。 Properties ①、位…

0基础如何学习软件测试?10分钟给你安排明白

先上一张学习路线&#xff1a; 在测试行业已经呆了5年多了&#xff0c;也算得上行业经验资深了吧&#xff0c;基本上也是摸清了这个行业的发展。 所以今天也想对有转行想法的朋友分享一下经验&#xff0c;能够让你对这个行业有个大致的了解和对以后的发展有所规划&#xff0c;…

基础工具类

IDate import java.text.SimpleDateFormat import java.util.{Calendar, Date}trait IDate extends Serializable {def onDate(dt: String): Unitdef invoke(dt: String, dt1: String) {if (dt1 < dt) {throw new IllegalArgumentException(s"dt1:${dt1}小于dt:${dt}…

Java设计模式-创建型模式-原型模式

原型模式 原型模式浅拷贝深拷贝 原型模式 要求&#xff1a;以一个已经创建的对象为原型&#xff0c;复制一个新的对象 使用场景&#xff1a; 创建对象的成本比较大的时候&#xff08;如从耗时较长的计算或者从查询耗时长的RPC接口获取数据&#xff09;&#xff0c;直接拷贝已…

双向链表的知识点+例题

1.链表的种类 题中常考查以下两种&#xff1a; 上一讲我们学了无头单向非循环链表&#xff0c;这节&#xff0c;让我们看一下双向链表的操作吧~ 2基本操作 1&#xff0c;定义双向链表 2&#xff0c;创建一个节点 3&#xff0c;初始化双链表 4&#xff0c;尾插一个节点 5打印…

全球温度数据下载

1.全球年平均温度下载https://www.ncei.noaa.gov/data/global-summary-of-the-year/archive/ 2.全球月平均气温下载https://www.ncei.noaa.gov/data/global-summary-of-the-month/archive/ 3.全球日平均气温下载https://www.ncei.noaa.gov/data/global-summary-of-the-day/ar…

一、认识STM32

目录 一、初识STM32 1.1 STM32的命名规则介绍 1.2 STM32F103ZET6资源配置介绍 二、如何识别芯片管脚 2.1 如何寻找 IO 的功能说明 三、构成最小系统的要素 一、初识STM32 1.1 STM32的命名规则介绍 以 STM32F103ZET6 来讲解下 STM32 的命名方法&#xff1a; &…