【Redis 开发】缓存雪崩和缓存击穿

embedded/2024/10/19 9:38:17/

缓存问题

  • 缓存雪崩
    • 解决方案
  • 缓存击穿
    • 互斥锁
    • 逻辑时间
    • 基于互斥锁解决缓存击穿问题
    • 基于逻辑过期方式解决缓存击穿问题

缓存雪崩

缓存雪崩是指在同一时间段,大量的缓存key同时失效或者Redis服务器宕机,导致大量请求到达数据库,带来巨大压力

解决方案

  1. 给不同的Key的TTL添加随机值

使得不容易在同一个时间段大量的缓存失效

  1. 利用Redis集群提高服务的可用性

如果Redis宕机了我们可以通过微服务将其他从服务器中调用及时弥补

  1. 缓存业务添加降级限流策略

快要到达一个限制的时候进行降级,拒绝服务来保护缓存

  1. 给业务添加多级缓存

在其他层面也添加缓存,比如说nginx服务器中

缓存击穿

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

缓存重建业务复杂:从数据库操作写入缓存操作比较复杂,耗时可能会很多

解决方案:互斥锁逻辑过期

在这里插入图片描述

互斥锁

在这里插入图片描述
假若有很多线程进来,访问这个被击穿的数据,这是线程1先进来,拿到互斥锁,进行后面的数据库查询,写入缓存操作,其他线程在这个期间就不会拿到互斥锁,拿不到就会进行等待过一段时间重新在缓存中进行访问

缺点:性能低,线程需要进行不断地重复等待

逻辑时间

在这里插入图片描述

给一些及时地数据设置逻辑时间,不设置key的TTL时间

就是假如说我有一条数据,需要在一段时间内进行高并发的访问,那我们人工给他设置一个逻辑的过期时间,可以是永不过期,在使用完成后手动的将过期时间删除

在使用逻辑数据的时候同时也用到了互斥锁,但是处理不同,在线程获得互斥锁后,再创建一个新的线程来进行写入缓存的操作,这时候先返回过期的数据,其他没有拿到互斥锁的线程也是先返回过期数据

基于互斥锁解决缓存击穿问题

在服务层中创建互斥锁方法:

java">private boolean tryLock(String Key){Boolean flag = StringRedisTemplate.opsForValue().setIfAbsent(key,"1",10,TimeUnit.SECONDS);
return BooleanUtil.isTrue(flag);
}

这里是添加一个锁功能,其意思是使用setIfAbsent方法进行插入数据,这样其他的线程就不能够再次添加数据

java">private void unlock(String key){stringRedisTemplate.delete(key);
}

用来删除这个锁

基于逻辑过期方式解决缓存击穿问题

在这里插入图片描述
逻辑时间实例:(设置逻辑过期时间方法)

java">private void luoji(Long id,Long expireSeconds){//1.查询店铺信息Shop shop=getById(id);//2.封装逻辑过期时间RedisData redisdata=new RedisData();redisdata.setdata(shop);redisdata.setexpiretime(LocalDateTime.now().plusSeconds(expireSeconds));//写入RedisStringRedisTemplate.opsForValue().set(id,JSONUtil.toJsonStr(redisd ata));
}

http://www.ppmy.cn/embedded/19018.html

相关文章

pytest-xdist:远程多主机 - 分布式运行自动化测试

简介:pytest-xdist插件使用新的测试执行模式扩展了pytest,最常用的是在多个CPU之间分发测试以加快测试执行,即 pytest -n auto同时也是一个非常优秀的分布式测试插件,分别支持ssh和socket两种方式实现master和worker的远程通讯。…

JavaEE初阶——多线程(七)——定时器

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享多线程的第七篇文章——关于定时器 如果有不足的或者错误的请您指出! 目录 4.定时器4.1标准库提供的定时器4.2自己实现一个定时器4.2.1任务类4.2.2Timer类4.2.3 有一个线程来负…

[Spring Cloud] (5)gateway前后端公私钥与认证信息

文章目录 简述后端pom增加hutool工具类 nacos增加登录过期时间配置修改全局配置文件 安全通信认证接口控制层接口层实现层 工具类AES 对称加密工具类MD5工具类RSA非对称加密工具类加密盐工具类 前端引入jsencrypt工具类securityUtils.js 请求类系统通信密钥接口 登录接口增加认…

架构师系列- JVM(三)- 类加载

通过字节码,我们了解了class文件的结构 通过运行数据区,我们了解了jvm内部的内存划分及结构 接下来,让我们看看,字节码怎么进入jvm的内存空间,各自进入那个空间,以及怎么跑起来。 4.1 加载 4.1.1 概述 …

Qt tcp通信(客户端+服务器一对一)

学习自《Qt5.9 C开发指南》 服务器端: QTcpServer *tcpServer; //TCP服务器 tcpServernew QTcpServer(this); connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection())); 当有新的客户端接入时,QTcpServer内部的incomingConnectio…

Day41 HTTP编程

Day41 HTTP编程 文章目录 Day41 HTTP编程HTTP概念应用场景主要方面 HTTP案例案例一:获取淘宝商品周边类别案例二:下载图片 HTTP 概念 HTTP编程指的是使用HTTP协议进行网络编程的过程。HTTP是一种用于传输超文本的应用层协议,通常用于在客户…

QML与C++交互

Qt 你好 | 专注于Qt的技术分享平台 QML写界面,业务逻辑使用C,既能快速的开发界面也能利用C的强大生态,这是目前比较被认可的方式,那就涉及到QML与C对象的交互。 我们以登录例子来说明,页面点击登录,将信息…

区块链技术:NFG元宇宙电商模式

大家好,我是微三云周丽 随着互联网技术的迅猛发展,电子商务行业逐渐崛起为现代经济的重要支柱。而在这一浪潮中,元宇宙电商以其独特的商业模式和巨大的发展潜力,成为行业的新宠。其中,NFG作为元宇宙电商模式的代表&am…