【Redis】应用问题解决

news2024/11/25 22:25:36

一、缓存击穿

1、什么叫缓存击穿
系统中某个查询次数很多的热点key,在某个时刻过期,而此时又正好有大量并发请求查询这个key,但是缓存的重建还没有完成,这样,就会有大量请求涌向后端数据库,使得其压力骤增甚至崩溃

2、如何解决缓存击穿

  • 使用分布式互斥锁:只允许一个线程获取到锁,由它去查询数据库,然后将查询到的数据设置到缓存中,其他线程必须等待重建缓存的线程执行完,然后去缓存中获取数据
  • 设置永不过期
    • 在设置热点key的时候,不给key设置过期时间
    • 或者正常给key设置过期时间,不过在后台同时启一个定时任务去定时地更新这个缓存

二、缓存穿透

1、什么叫缓存穿透
缓存穿透的意思就是,应用查询一个不存在的数据,在缓存中查不到,去数据库查也查不到,这样就无法写入缓存。如果出现大量此类请求,每次查询都访问数据库,就会导致后端数据库压力骤增,缓存失去了对数据库的保护作用

2、为什么会发生缓存穿透

  • 自身的业务代码出了问题,如set和get的key不一致,导致查不到数据
  • 遭到恶意的网络攻击

3、如何解决缓存穿透

  • 缓存空对象:将数据库返回的null缓存起来,设置一个较短的过期时间
  • 使用布隆过滤器,可以结合博主之前写的bitmap理解
    • 简单来说就是在初始化布隆过滤器时,会先将所有key进行n次hash运算,这样就可以得到n个位置,然后将这n个位置上的元素改为1
    • 然后请求过来后,我们对要查询的key做hash运算得到某个位置,然后看布隆过滤器中对应位置元素的值是否为1
      • 如果对应位置元素的值为1,就证明key在库中存在,则继续向下查询
      • 如果对应位置元素的值不为1,那么就证明key在库中不存在,直接返回客户端空即可
  • 使用黑白名单:如果是恶意攻击,我们可以通过只允许某些IP访问我们的服务或者禁止某些IP访问我们的服务

三、缓存雪崩

1、什么叫缓存雪崩
缓存中有大量的key在同一时刻过期,或者Redis直接宕机了,导致大量的查询请求全部到达数据库,造成数据库查询压力骤增,甚至直接挂掉

2、如何解决缓存雪崩

  • 将每个key的过期时间打散,使它们的失效点尽可能均匀分布
  • 针对一些常用的数据设置成为永久有效
  • 使用高可用集群,防止redis宕机造成缓存不可用

四、分布式锁

1、什么是分布式锁
所有服务中的所有线程都去获取同一把锁,但只有一个线程可以成功的获得锁,其他没有获得锁的线程必须全部等待,直到持有锁的线程释放锁。在集群场景下,使用分布式锁,有助于保证数据的一致性

2、实现分布式锁的方案

  • 基于数据库实现
  • 基于缓存(Redis等,基于redis实现性能最高)
  • 基于zookeeper(可靠性最高)

3、使用setnx设置分布式锁

  • 使用setnx key value去设置数据,使用del key去删除数据
    这个命令的意思就是,如果key存在,就无法更改value
    所以不管是集群中哪个节点想修改这个key,在使用del之前都无法成功
  • 然后为了防止设置key之后,节点宕机无法执行del key操作导致这个key一直被锁定,我们还需要设置过期时间,所以我们执行完setnx key value之后使用expire key <time>命令给这个key设置过期时间
  • 还有一点需要考虑的是,如果在执行expire key <time>命令之前,节点宕机,那么这个key还是会被锁定,所以我们要考虑原子性操作,使用set key value nx ex <expireTime>命令来完成设置key和过期时间的操作(注意,此指令只能限制setnx命令,限制不了set命令)
127.0.0.1:6379> set k1 10 nx ex 60
OK
127.0.0.1:6379>
127.0.0.1:6379> setnx k1 20
(integer) 0
127.0.0.1:6379> ttl k1
(integer) 47
127.0.0.1:6379>
127.0.0.1:6379> set k1 20
OK
127.0.0.1:6379> get k1
"20"
127.0.0.1:6379>

4、通过uuid解决锁误删的情况

在多线程情况下,我们还可能会遇到锁被误删的问题
在这里插入图片描述
为了解决这种误删问题,我们在执行set key value nx ex <expireTime>命令时,value可以带上uuid作为区分其他线程的依据,业务代码在执行释放锁操作之前,先去判断获取到的value是否符合或包含自己的那个uuid,这样就避免了因为卡顿会误删别人的锁的情况

5、使用LUA保证删除操作原子性
在这里插入图片描述

由上图可知,在某些极端场景下,还是会出现误删他人锁的情况
所以我们的解决方法就是,将第三步中的判断和释放操作写在一段LUA脚本中,然后excute执行,以此来实现释放操作的原子性

五、redis6.0后的新特性

  • redis6.0之后新增了ACL,有兴趣可以自行百度
  • redis-cli支持cluster(5.0及以前想搭建集群还要安装ruby环境)
  • 另外支持网络数据读写以及协议解析的多线程(命令执行还是单线程)

如有错误,欢迎指正!!!

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

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

相关文章

爱了,阿里P9开源分享内部Java核心开发手册(2022版)覆盖P5到P8

这个世界唯一不变的就是变化&#xff0c; IT圈子不外如是。计算机领域一直在改变&#xff0c;从基础框架到计算设备&#xff0c;还有几乎每天都涌现出的新技术。因此&#xff0c;作为一名程序开发人员&#xff0c;我们要通过不断的学习来提高自己的技能。 所以持续学习的脚步自…

基于C++11实现的阻塞队列(BlockQueue)

思路&#xff1a; 生产者消费者模型如图&#xff0c;多个生产者线程和多个消费者线程共享同一固定大小的缓冲区&#xff0c;它们的生产和消费符合以下规则&#xff1a; 生产者不会在缓冲区满的时候继续向缓冲区放入数据&#xff0c;而消费者也不会在缓冲区空的时候&#xff0c…

AQS源码解读

retrantlock&#xff1a; A、B、C3个线程&#xff0c;假设A线程lock()时候拿到了锁&#xff0c;state被A设置成了1。 static final class NonfairSync extends Sync {private static final long serialVersionUID 7316153563782823691L;/*** Performs lock. Try immediate b…

喜欢写笔记的博主为什么要使用猿如意?

&#x1f525;&#x1f525;&#x1f525;猿如意&#x1f525;&#x1f525;&#x1f525; 喜欢写笔记的博主为什么要使用猿如意&#xff1f; markdown笔记 测 评 分 享 猿如意实战测评猿如意传送门什么是猿如意&#xff1f;猿如意使用感受markdown笔记实战测评总结猿如意传…

数据结构---红包分配算法

红包分配算法错误解法二倍均值法JAVA实现线段切割法确定每一条子线段的长度JAVA实现问题如下&#xff1a; 所有人抢到的金额之和要等于红包金额&#xff0c;不能多也不能少。每个人至少抢到1分钱。要保证红包拆分的金额尽可能分布均衡&#xff0c;不要出现两极分化太严重的情况…

【C函数】函数详解

函数前言一、函数是什么二、C语言中函数的分类&#xff08;一&#xff09;库函数1.printf类2.strcpy类3.math类4.概念5.小知识6.总结&#xff08;二&#xff09;自定义函数1.概念2.函数的组成3.例子1&#xff08;求出两个数中的最大值&#xff09;4.例子2&#xff08;交换两个整…

mac释放“其他”内存空间的解决方法

官方解释Mac设备储存空间中的“其他”数据包含这不可移除的移动资源&#xff0c;例如&#xff0c;Siri 语音、字体、词典、不可移除的日志和缓存、聚焦索引以及系统数据如钥匙串和 CloudKit 数据库、系统无法删除缓存的文件等之外&#xff0c;还包含了一些无法识别的文件。当“…

ROS2 基础概念 节点

ROS2 基础概念 节点1. Nodes2. 重映射3. 环境设置3.1. ROS_DOMAIN_ID3.2. ROS_LOCALHOST_ONLY1. Nodes 每个节点应负责单个模块用途&#xff08;例如&#xff0c;一个节点用于控制车轮电机&#xff0c;一个用于控制激光测距仪等&#xff09; 可以通过话题、服务、操作或参数向…

C++-----模板

举个例子&#xff0c;如果要你交换两个数值&#xff0c;你会怎么做呢&#xff1f; ————你肯定会说&#xff0c;那就写一个Swap交换函数吧&#xff01; 没错&#xff01;Swap函数确实可以实现交换&#xff0c;但如果我想让你同时进行不能类型的数值呢&#xff0c;比如floa…

F - Permutation Distance(去绝对值数据结构)[AtCoder Beginner Contest 283]

题目如下&#xff1a; 题目链接 题解 or 思路&#xff1a; 去掉绝对值后 有 2242 \times 2 4224 中情况 虚线括起来的是需要维护的&#xff0c;其他直接枚举就行! 对于 pi<pjp_i < p_jpi​<pj​ 的情况&#xff0c;设我们维护的式子为 xxx 那我们每次枚举查找的范围…

hadoop生产调优之HDFS—集群压测

在企业中非常关心每天从 Java 后台拉取过来的数据&#xff0c;需要多久能上传到集群&#xff1f;消费者关心多久能从 HDFS 上拉取需要的数据&#xff1f; 为了搞清楚 HDFS 的读写性能&#xff0c;生产环境上非常需要对集群进行压测。 HDFS 的读写性能主要受网络和磁盘影响比较大…

【matplotlib】3-绘制统计图形

文章目录绘制统计图形1.柱状图1.1 应用场景--定性数据的分布展示1.2 绘制原理2.条形图3.堆积图3.1 堆积柱状图3.2 堆积条形图4.分块图4.1 多数据并列柱状图4.2 多数据平行条形图5.参数探索6.堆积折线图、间断条形图和阶梯图6.1 用函数stackplot()绘制堆积折线图6.2 用函数broke…

Matlab 方位角计算

文章目录 一、简介二、实现代码三、实现效果一、简介 方位角是指从某点的正北方向起顺时针旋转到某目标点方向的水平夹角,角度范围(0~360)。如下所示: 令atn= a r c t a n ( Δ Y A B / Δ X

9. SpringMvc拦截器

1. 拦截器概念和作用 拦截器&#xff08;Interceptor&#xff09;是一种动态拦截方法调用的机制&#xff0c;在SpringMVC中动态拦截控制器方法的执行作用&#xff1a; 在指定的方法调用前后执行预先设定的代码阻止原始方法的执行总结&#xff1a;增强 核心原理&#xff1a;AOP…

[CG笔记]绘制图元:三角形

学习资料是Github的一个项目Tiny renderer or how OpenGL works: software rendering in 500 lines of code 本文对应原教程的第二课的部分内容 原教程重在思路&#xff0c;主要内容是以推导为主&#xff0c;所以这里还是记录思路和为代码做注释 知乎也有人给出了中译版&…

ARM uart stdio 的移植

一、uart stdio的移植1 1. 什么是 stdio (1) #include <stdio.h> (2) stdio&#xff1a;standard input output&#xff0c;标准输入输出 (3) 标准输入输出就是操作系统定义的默认的输入和输出通道。一般在 PC 机的情况下&#xff0c;标准输入指的是键盘&#xff0c;标…

C语言——操作符详解(下)

C语言——操作符详解&#xff08;下&#xff09;一、赋值操作符二、复合赋值符三、单目操作符单目操作符介绍四、 关系操作符五、逻辑操作符六、条件操作符七、逗号表达式八、下标引用、函数调用和结构成员8.1 [ ] 下标引用操作符8.2 ( ) 函数调用操作符8.3访问一个结构的成员一…

【Linux】Linux指令串讲

大家好&#xff0c;今天要开启一个新的专题&#xff1a;Linux 今天的内容是指令还有一些基本的Linux知识补充 由于Linux的知识很难明确写出分类&#xff0c;所以目录就不会做的特别详细完全 喜欢的小伙伴点赞收藏一下不迷路哦 目录 1.目录 2.文件 3.路径 1.目录 1.创建目录…

初识Docker:(3)Docker架构

初识Docker&#xff1a;&#xff08;3&#xff09;Docker架构镜像和容器Docker和DockerHubDocker架构总结镜像和容器 镜像&#xff08;Image&#xff09;&#xff1a;Docker将应用程序及其所需的以来、函数库、环境、配置等文件打包在一起&#xff0c;成为镜像。 容器&#x…

力扣27.移除元素(双指针算法)

题目描述&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考…