【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));
   //写入Redis
   StringRedisTemplate.opsForValue().set(id,JSONUtil.toJsonStr(redisd ata));
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

游戏发行困境及OgGame云游戏解决方案简述

随着全球化浪潮的持续推进,中国游戏开发者们不再满足于国内市场的发展,而是开始将目光投向更为广阔的海外市场。这一趋势的崛起背后,是中国企业意识到国际化是其发展的必由之路,也是游戏行业突破国内困境的体现。本文将简要阐述游…

【1731】jsp 房租跟踪监控管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 房租跟踪监控管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysq…

为什么常用氢化物

知识星球(星球名:芯片制造与封测社区)里的学员问:diffusion工序,所需要的气体种类有哪些? Diffusion是什么工序? "Diffusion"工序是通过热能将掺杂剂原子扩散到硅片中,以形…

C++系列-输入输出

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” C输入和输出 我们都知道C语言的输出是用printf函数来实现的&#xff0c;那么C呢&#xff0c;它的实现逻辑是什么呢&#xff0c;让我们一起来看一下&#xff0c; #include<i…

【代码随想录刷题记录】LeetCode27移除元素

题目地址 1. 思路 1.1 基本思路及代码的初步实现 基本思路大体上和卡尔老师的想法是一致的&#xff0c;详见代码随想录&#xff1a;数组&#xff1a;移除元素&#xff0c;暴力法大家都能想到&#xff0c;我这里写一下算法时间复杂度为 O ( n ) O(n) O(n)时候的思路&#xff…

【深度学习】YOLOv5,烟雾和火焰,目标检测,防火检测,森林火焰检测

文章目录 数据收集和数据标注查看标注好的数据的脚本下载yolov5创建 dataset.yaml训练参数开始训练yolov5n训练训练后的权重下载gradio部署 数据收集和数据标注 搜集数据集2w张。 pip install labelme labelme 然后标注矩形框和类别。 下载数据请看这里&#xff1a; https:…

2023年江西省电子专题赛——解析一

由于网上对这个竞赛资料甚少&#xff0c;为了方便省内学子交流学习&#xff0c;可加Q群聊&#xff1a;778772385 电源部分&#xff1a;比赛中只给了3个IN4007整流管&#xff0c;无法构成传统整流桥的形式&#xff0c;并且题目又要求全波整流。 我这边用两个二极管构成全波整流…

Web3解密:理解去中心化应用的核心原理

引言 在当前数字化时代&#xff0c;去中心化技术和应用正在逐渐引起人们的关注和兴趣。Web3技术作为去中心化应用&#xff08;DApps&#xff09;的基础&#xff0c;为我们提供了一个全新的互联网体验。但是&#xff0c;对于许多人来说&#xff0c;这个复杂的概念仍然充满了神秘…

【数据结构与算法】:手搓顺序表(Python篇)

文章目录 一、顺序表的概念二、顺序表的实现1. 顺序表的创建1.1 扩容1.2 整体建立顺序表 2. 顺序表的基本运算算法2.1 顺序表的添加&#xff08;尾插&#xff09;2.2 指定位置插入2.3 指定位置删除2.4 顺序表的查找2.5 顺序表元素的索引访问2.6 顺序表元素的修改2.7 顺序表长度…

Mouse without Borders(无界鼠标)使用教程 多台电脑(最多4)共用鼠标键盘,换言之一套键鼠操作多台电脑,跨电脑文件拖动传输

Mouse without Borders&#xff08;无界鼠标&#xff09;使用教程 目的&#xff1a;多台电脑&#xff08;最多4&#xff09;共用鼠标键盘&#xff0c;换言之一套键鼠操作多台电脑。 优势&#xff1a;微软官方软件&#xff0c;对于windows系统友好&#xff0c;轻量实用。 劣势…

【Diffusion实战】训练一个diffusion模型生成蝴蝶图像(Pytorch代码详解)

上一篇Diffusion实战是确确实实一步一步走的公式&#xff0c;这回采用一个更方便的库&#xff1a;diffusers&#xff0c;来实现Diffusion模型训练。 Diffusion实战篇&#xff1a;   【Diffusion实战】训练一个diffusion模型生成S曲线&#xff08;Pytorch代码详解&#xff09;…

锁,数据同步

目录 原子操作中断控制自旋锁信号量小结 经常遇到数据同步的问题&#xff0c;具体有哪些情况呢&#xff1f;来聊一聊。我知道的&#xff0c;应该有以下四种&#xff0c;原子操作&#xff0c;中断控制&#xff0c;自旋锁和信号量。 原子操作 适用情况和场景 原子操作经常用在单…

vue实现录音并转文字功能,包括PC端web,手机端web

vue实现录音并转文字功能&#xff0c;包括PC端&#xff0c;手机端和企业微信自建应用端 不止vue&#xff0c;不限技术栈&#xff0c;vue2、vue3、react、.net以及原生js均可实现。 原理 浏览器实现录音并转文字最快捷的方法是通过Web Speech API来实现&#xff0c;这是浏览器…

【Linux系统编程】第八弹---权限管理操作(中)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、修改文件权限的做法(二) 2、文件类型 3、可执行权限 4、创建文件/目录的默认权限 4.1、权限掩码 总结 前面一弹我们学…

CH4INRULZ-v1靶机练习实践报告

CH4INRULZ-v1靶机练习实践报告 1 安装靶机 靶机是.ova文件&#xff0c;需要用VirtualBox打开&#xff0c;但我习惯于使用VMWare,因此修改靶机文件&#xff0c;使其适用于VMWare打开。 解压ova文件&#xff0c;得到.ovf文件和.vmdk文件。直接用VMWare打开.ovf文件即可。 2 夺…

社区新零售:重构邻里生活圈,赋能美好未来

新时代的邻里脉动 在城市的肌理中&#xff0c;社区作为生活的基本单元&#xff0c;正经历一场由新零售引领的深刻变革。社区新零售&#xff0c;以其独特的商业模式、创新的技术手段和以人为本的服务理念&#xff0c;重新定义了社区商业的边界&#xff0c;重构了邻里生活的形态…

[C++ QT项目实战]----C++ QT系统实现多线程通信

前言 在C QT中&#xff0c;多线程通信原理主要涉及到信号与槽机制和事件循环机制。 1、信号与槽机制&#xff1a; 在QT中&#xff0c;信号与槽是一种用于对象间通信的机制。对象可以通过发送信号来通知其他对象&#xff0c;其他对象通过连接槽来接收信号并进行相应的处…

软件物料清单(SBOM)生成指南 .pdf

如今软件安全攻击技术手段不断升级&#xff0c;攻击数量显著增长。尤其是针对软件供应链的安全攻击&#xff0c;具有高隐秘性、追溯难的特点&#xff0c;对企业软件安全威胁极大。 同时&#xff0c;软件本身也在不断地更新迭代&#xff0c;软件内部成分安全性在持续变化浮动。…

web题目实操 5(备份文件和关于MD5($pass,true)注入的学习)

1.[ACTF2020 新生赛]BackupFile &#xff08;1&#xff09;打开页面后根据提示是备份文件 &#xff08;2&#xff09;查看源码发现啥都没有 &#xff08;3&#xff09;这里啊直接用工具扫描&#xff0c;可以扫描到一个文件名为&#xff1a;/index.php.bak的文件 &#xff08;…

json解析大全

JSON解析案例1 将String转为JSONObject JSONObject res JSONObject.parseObject(result);获取documents JSONArray array res.getJSONObject("result").getJSONArray("documents");遍历JSONArray for (int i 0; i < array.size(); i) {JSONObject…