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

缓存问题

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

缓存雪崩

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

解决方案

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

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

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

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

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

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

  1. 给业务添加多级缓存

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

缓存击穿

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

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

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

在这里插入图片描述

互斥锁

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

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

逻辑时间

在这里插入图片描述

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

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

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

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

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

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

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

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

用来删除这个锁

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

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

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.hqwc.cn/news/651865.html

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

相关文章

06_Scala流程控制

文章目录 [toc] 1.流程控制**小结:** **2. Scala中流程控制没有三元运算符****2.1 Scala中如果逻辑代码只有一行可以省略花括号****小结:** **3. 循环控制****3.1 for控制****3.2循环守卫 --> 循环表达式添加逻辑判断****3.3 循环步长 --> 表示循环…

Unreal Engine子类化系统UButton

UE系统Button点击事件无法传递参数,通过子类化系统Button添加自定义参数扩展实现Button点击事件参数传递点击C类文件夹,在右边的区域点击鼠标右键,在弹出的菜单中选择“新建C类”在弹出的菜单中选中“显示所有类”,选择Button作为…

架构师系统-Docker(四)-网络优化

网络优化 Docker网络原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关,…

数之寻软件怎么样?

数之寻软件是一款功能强大的数据恢复和备份软件,以下是对其特点和功能的详细评价: 一、数据恢复方面: 高效的数据恢复能力:数之寻软件采用了先进的算法和数据恢复技术,能够快速有效地恢复丢失或损坏的数据。无论是文…

RGB灯珠的控制-单片机通用模板

RGB灯珠的控制-单片机通用模板 一、RGB控制的原理二、RGB.c的实现三、RGB.h的实现四、color色彩空间变换以及控制渐变一、RGB控制的原理 ①通过IO发送脉冲识别0/1编码,组合24Bit的RGB数据,从而控制RGB;②每个RGB灯珠通过DIN、DOU进行级联起来;③通过HSV色彩转换成RGB从而控…

8点法估计基础矩阵

估计基础矩阵 文章目录 估计基础矩阵8点法归一化 8点法 8点法 根据两幅图像中8个对应点对之间的关系,采用SVD求 解最小二乘方 约束:det(F) 0 假设已知N对点的对应关系: { x i , x i ′ } i 1 N \{x_i,x^{\prime}_i\}_{i1}^N {xi​,xi′​…

go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件

前言 在上一篇文章中,我们实现了通过etcd来同时指定多个不同的有关分区与日志文件的路径,但是锁着一次读取配置的增多,不可避免的出现了一个问题:我们如何来监控多个日志文件,这样原来的tailFile模块相对于当下场景就…

EasyRecovery数据恢复软件2025激活码及下载使用步骤教程

EasyRecovery数据恢复软件是一款功能强大且用户友好的数据恢复工具,专为帮助用户找回因各种原因丢失的数据而设计。该软件由全球知名的数据恢复技术公司开发,经过多年的技术积累和更新迭代,已经成为行业内备受推崇的数据恢复解决方案。 EasyR…

WildCard开通GitHub Copilot

更多AI内容请关注我的专栏:《体验AI》 期待您的点赞👍收藏⭐评论✍ WildCard开通GitHub Copilot GitHub Copilot 简介主要功能工作原理 开通过程1、注册Github账号2、准备一张信用卡或虚拟卡3、进入github copilot页4、选择试用5、选择支付方式6、填写卡…

AM解调 FPGA(寻找复刻电赛电赛D题的)

设计平台 Quartus II10.3mif产生工具modelsimSE (仿真用) DDS(直接数字式频率合成器) 从前面的内容可知,我们需要产生一个载波,并且在仿真时,我们还需要一个较低频率的正弦波信号来充当我们的…

中电金信:深度解析|数字化营销运营体系搭建

如何更好更快地梳理好体系搭建思路,稳步实现落地?下文将为大家明确搭建的推进步骤、执行要点,帮助商业银行理顺数字化营销运营体系的“点”“线”“面”~ 与所有转型的曲折、阵痛等特征一样,商业银行构建数字化营销运营体系过程中…

泛微E9开发 如何自定义流程标题

1、功能背景 主表中有“选择类别”下拉框字段,用户可以根据需求来选择申请类别,一般多个相似流程的申请可以合并成一个,但是为了区分,我们可以通过将标题修改的方式来使整个显示页面更明确。 2、展示效果 3、实现方法 注意&…