分布式缓存的问题

news2025/2/24 0:04:56

1,Redis缓存穿透问题

Redis缓存穿透问题是指查询一个一定不存在的数据,由于这样的数据缓存一定不命中,所以这样的请求一定会打到数据库上。但是由于数据库里面也没有这样数据,且也没有将这样的null值缓存到数据库,从而造成这样的请求每次都打到数据库,进而造成缓存失去意义和数据库压力增大​。

/**
      * 缓存穿透
      */
     public Mixe cachePenetration(Long mixeId) {

         // 先从redis里面查询数据
         String mixeCP = redisTemplate.opsForValue().get(mixeId+"");

         // 如果redis里面没有数据那么从数据库里面查询,并将查询后数据存入redis
         if (StringUtils.isEmpty(mixeCP)) {
             Mixe mixe = this.baseMapper.selectById(mixeId);
             if (!StringUtils.isEmpty(mixe)) {
                 redisTemplate.opsForValue().set(mixe.getId()+"", JSON.toJSONString(mixe),1, TimeUnit.MINUTES);
             }

             return mixe;
         }

         // 查询到数据直接返回
         Mixe mixe = JSON.parseObject(mixeCP, new TypeReference<Mixe>() {
         });

         return mixe;
     }

案例演示

在这里插入图片描述
查询id为1的数据,第一次查询,会先去缓存里面查询,没有查到数据,再去数据库里面查询,若查询数据不为空,将数据存入缓存并响应给客户端
在这里插入图片描述

查询一个ID为-1的数据?

由于ID为-1,缓存无法命中,数据库查询也是为空,所以这样的请求会全部打到数据库从而造成数据库压力增大和缓存失去意义

解决Redis缓存穿透

对参数进行限制,和null值存入缓存设置一个短暂过期时间

/**
      * 缓存穿透
      */
     public Mixe cachePenetration(Long mixeId) {

         if (mixeId < 0) {return null;}

         // 先从redis里面查询数据
         String mixeCP = redisTemplate.opsForValue().get(mixeId+"");

         // 如果redis里面没有数据那么从数据库里面查询,并将查询后数据存入redis
         if (StringUtils.isEmpty(mixeCP)) {
             Mixe mixe = this.baseMapper.selectById(mixeId);
             if (!StringUtils.isEmpty(mixe)) {
                 redisTemplate.opsForValue().set(mixe.getId()+"", JSON.toJSONString(mixe),1, TimeUnit.DAYS);
             }
             // 数据数据为null设置一个短暂过期时间
             redisTemplate.opsForValue().set(mixe.getId()+"", JSON.toJSONString(mixe),1, TimeUnit.MINUTES);
             return mixe;
         }

         // 查询到数据直接返回
         Mixe mixe = JSON.parseObject(mixeCP, new TypeReference<Mixe>() {
         });

         return mixe;
     }

在这里插入图片描述
在这里插入图片描述
这样就可以避免了一个缓存穿透问题

2,Redis缓存雪崩

Redis缓存雪崩是指设置缓存时key采用了相同的过期时间,导致缓存在某一时刻同时失效,所有请求全部打到数据库,DB瞬时压力过重而雪崩​。

Reids缓存雪崩如何解决?

一般来讲我们都是给每一个缓存在一定的时间范围内设置一个随机过期时间,比如1-10分钟内,这样缓存在同一时间内失效的概率就减低,很难在引发群体事件

Random random = new Random();
             int i = random.nextInt(10) - 1;
             // 数据数据为null设置一个短暂过期时间
             redisTemplate.opsForValue().set(mixeId+"", JSON.toJSONString(mixe),i, TimeUnit.MINUTES);

缓存击穿问题

Reids缓存击穿是指对于一些设置了过期时间的key,如果这些key可能会在某些时间点被高并发地访问,变成一种非常“热点”数据。
如果这个key在大量请求进来前正好失效,那么对这个key的数据查询就会全部落到数据库,导致数据库压力增大

如何解决缓存击穿问题

加锁。大量并发只让一个人去查,其他人等待,查到以后释放锁,其他人获取锁,先查缓存,就会有数据,不要去查数据库

/**
      * 缓存击穿
      * 分布式锁
      */
     public Mixe distributedLock(Long mixeId) throws InterruptedException {

         // 设置唯一ID为锁value
         String uuid = UUID.randomUUID().toString();
         // 分布式去占锁
         Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 300, TimeUnit.SECONDS);

         if (lock) {
             // 枷锁成功执行业务
             Mixe mixe = null;
             try {
                 mixe = this.baseMapper.selectById(mixeId);
             }finally {
                 String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then\n" +
                         "    return redis.call(\"del\",KEYS[1])\n" +
                         "else\n" +
                         "    return 0\n" +
                         "end";
                 //原子删除
                 redisTemplate.execute(new DefaultRedisScript<Long>(script,Long.class), Arrays.asList("lock"),uuid);
             }

             return mixe;

         } else {
             Thread.sleep(100);
             this.distributedLock(mixeId);
         }

         return null;
     }

如果执行业务时间超长,锁过期怎么办?

引入Redisssion

/**
      * 引入Redission解决分布式锁问题
      */
     public Mixe distributedRedissionLock(Long mixeId) {

         RLock lock = redissonClient.getLock("mixe-id");
         lock.lock();
         Mixe mixe = null;
         try {
             mixe = cachePenetration(mixeId);
         } finally {
           lock.unlock();
         }
         return mixe;
     }

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

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

相关文章

软件设计(十三)-原码、反码、补码、移码

软件设计&#xff08;十二&#xff09;数据结构(下)https://blog.csdn.net/ke1ying/article/details/129035300 下面把一个数转成二进制表达形式 原码&#xff1a; 数值1 &#xff1a; 0000 0001 数值-1 &#xff1a; 1000 0001 1 (- 1) &#xff1a; 1000 0010 这是8个…

【安卓逆向】APK修改与反编译回编译

【安卓逆向】反编译修改APK回编译使用工具流程步骤Apktool相关安装与使用常用命令备查APK签名命令备查实战练习反编译查看修改的地方使用Apktool反编译得到产物文件夹并进行修改回编APK实用场景在日常开发我们可能需要替换某些资源或者修改某些代码&#xff0c;但是我们没有源码…

Java基础语法练习题

2023.2.18刷题1、java的4类流程控制语句解析&#xff1a;java的4类流程控制语句循环语句&#xff1a;while&#xff0c;for&#xff0c;do while选择语句&#xff08;分支语句&#xff09;&#xff1a;if,switch跳转语句&#xff1a;break,continue,break,label异常处理语句&am…

Markdown及其语法详细介绍(全面)

文章目录一、基本语法1.标题2.段落和换行3.强调4.列表5.链接6.图片7.引用8.代码9.分割线10表格二、扩展语法1.标题锚点标题 {#anchor}2.脚注3.自动链接4.任务列表5.删除线6.表情符号7.数学公式三、Markdown 应用1.文档编辑2.博客写作3.代码笔记四、常见的工具和平台支持 Markdo…

加油站会员管理小程序实战开发教程12

我们上一篇介绍了会员数据源的开发,本节我们介绍一下会员注册功能。 首先呢梳理一下会员注册的业务逻辑,如果用户是首次登录,那他肯定还没有给我们的小程序提交任何的信息。那么我们就在我的页面给他显示一个注册的按钮,如果他已经注册过了,那么就正常显示会员的信息,他…

spring cloud 集成 seata 分布式事务

spring cloud 集成 seata 分布式事务 基于 seata-server 1.6.x 序言 下载 seata-server 准备一个数据库 seata 专门为 seata-server 做存储&#xff0c;如, 可以指定 branch_tabledistributed_lockglobal_tablelock_table 准备一个业务库&#xff0c;比如存放定单&#xff…

【学习笔记2.19】动态规划、MySQL、Linux、Redis(框架)

动态规划 343整数拆分 class Solution {public int integerBreak(int n) {int dp [] new int [n 1];//dp[i]:正整数i拆分后的最大乘积dp[2] 1;for(int i 2;i < n ;i ){for(int j 1;j < i;j ){dp[i] Math.max(dp[i],Math.max(j * (i - j),j * dp[i - j]));} …

Ubuntu安装opencv库3.4.10,并在cmake工程中引入opencv库

Windows下安装不同&#xff0c;Ubuntu安装OpenCV库时&#xff0c;需要事先安装依赖&#xff0c;而且不同OpenCV库所需的依赖可能会有所不同&#xff0c;下面的依赖亲测 3.4.10 和 4.5.5版本的有效&#xff0c;但是4.6以上版本安装可能会报错。 参考链接&#xff1a;https://bl…

【Python】以邮件的方式定时发送一天的股票分析报告

【Python】以邮件的方式定时发送一天的股票分析报告 文章目录【Python】以邮件的方式定时发送一天的股票分析报告1、Python发送邮件1&#xff09;EmailSender封装2&#xff09;可能存在的问题2、jinja2动态渲染html页面3、阿里云OSS搭建图床1&#xff09;Python上传图片到OSS中…

在Linux和Windows上安装sentinel-1.8.5

记录&#xff1a;380场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;安装sentinel-1.8.5。在Windows上操作系统上&#xff0c;安装sentinel-1.8.5。Sentinel是面向分布式、多语言异构化服务架构的流量治理组件。版本&#xff1a;JDK 1.8 sentinel-1.8.5 CentOS 7.9官网地址…

开发板上搭建vsftpd服务器

1、交叉编译vstftp 下载vsftpd源码&#xff1a;vsftpd-3.0.2.tar.gz # tar –xzvf vsftpd-3.0.2.tar.gz # cd vsftpd-3.0.2 修改makefile文件&#xff1a; CC arm-linux-gnueabihf-gcc # make 将vsftpd文件放到/usr/bin/&…

说说Hibernate

当你在实战项目中需要用到SSH时, 如果你之前只用过Mybatis那自然是不能解决问题的, 因为在很多银行类金融类项目中你可能会使用到Hibernate, 那么关于Hibernate你应该要了解什么呢, 本篇文章就以学习Hibernate框架为目的, 巩固在工作中可能需要用到的这种ORM技术, 同时也欢迎家…

PVE硬件直通之强制IOMMU分组

文章目录检查是否直接支持IOMMU分组配置IOMMU分组不直接支持的需要更新内核参考检查是否直接支持IOMMU分组 下面 以SATA控制器为例&#xff0c;看pci设备是否可以直接支持IOMMU分组 /* 打印pci设备详细信息*/ lspci -vv /* 找到SATA controller 段落*/ 16:00.1 SATA controll…

设计模式:模板模式 CRTP设计习语

一、模板模式 1、模板模式 1&#xff09;定义 定义一个操作中的算法的骨架&#xff08;稳定&#xff09;&#xff0c;而将一些步骤延迟&#xff08;变化&#xff09;到子类中。Template Method使得子类可以不改变&#xff08;复用&#xff09;一个算法的结构即可重定义&…

tensorflow 学习笔记(二):神经网络的优化过程

前言&#xff1a; 学习跟随 如何原谅奋力过但无声的 tensorflow 笔记笔记。 本章主要讲解神经网络的优化过程&#xff1a;神经网络的优化方法&#xff0c;掌握学习率、激活函数、损失函数和正则化的使用&#xff0c;用 Python 语言写出 SGD、Momentum、Adagrad、RMSProp、Ada…

2023-02-18干活记录

MathBERT: 耗时&#xff1a;2-3hours(昨天和人聊天聊完了&#xff0c;今天九点才到实验室&#xff0c;呜呜呜一早上就看了个论文) 读论文&#xff1a;BERT-Based Embedding Model for Formula Retrieval Corpus Description&#xff1a; resource:from MSE;the formulas ex…

腾讯云——负载均衡CLB

负载均衡 CLB 提供四层&#xff08;TCP 协议/UDP 协议/TCP SSL 协议&#xff09;和七层&#xff08;HTTP 协议/HTTPS 协议&#xff09;负载均衡。您可以通过 CLB 将业务流量分发到多个后端服务器上&#xff0c;消除单点故障并保障业务可用性。CLB 自身采用集群部署&#xff0c;…

电子技术——共栅和共源共栅放大器的高频响应

电子技术——共栅和共源共栅放大器的高频响应 我们在之前学过无论是是CS放大器还是CE放大器&#xff0c;都可以看做是一个带通&#xff08;IC低通&#xff09;滤波器。在高频处的响应收到输入电容 CinC_{in}Cin​ 的限制&#xff08;主要是米勒效应&#xff09;。因此&#xff…

中南民族大学数字电路实验一

数字电路实验一基本逻辑门实验1.与非门实现与门2.与非门实现或门3.与非门实现或非门4.与非门实现异或门5.与非门实现与或门6.与非门实现与或非门实验报告结果分析基本逻辑门实验 一、实验目的 1&#xff0e;掌握 logisim 软件的使用方法&#xff1b; 2&#xff0e;学习基于该软…

基于蜣螂算法优化Kmeans图像分割-附代码

基于蜣螂优化Kmeans图像分割算法 - 附代码 文章目录基于蜣螂优化Kmeans图像分割算法 - 附代码1.Kmeans原理2.基于蜣螂算法的Kmeans聚类3.算法实验结果4.Matlab代码摘要&#xff1a;基于蜣螂优化Kmeans图像分割算法。1.Kmeans原理 K-Means算法是一种无监督分类算法&#xff0c;…