Redis缓存实战(2)

news2025/1/8 12:18:16

目录

缓存定义

Redis缓存实战

1删除缓存还是更新缓存?

2如何保证缓存与数据库的操作同时成功或者失败?

3先操作数据库还是缓存?

缓存问题

缓存穿透

缓存雪崩

缓存击穿


缓存定义

缓存(Cache)是数据交换的缓冲区,是存储数据的临时地方,读写性能较高。缓存的作用:降低后端负载并且提高读写时间,降低响应时间。缓存的成本:数据一致性成本,代码维护成本和运维成本。

Redis缓存实战

此代码模拟商户查询,查询商户时首先从redis缓存中查询是否有符合自己id的商户,如果有直接返回,如果没有然后从数据库中查询,如果数据库中查询到对应的数据,然后将该数据添加到redis缓存中,并且返回该数据,如果还是没有查询到就会返回异常信息。代码如下

   @GetMapping("/select")
    public Result select(Long id){
        TbShop tbShop = (TbShop) redisTemplate.opsForValue().get("shopcache" + id);
        if(tbShop!=null){
            return Result.success(tbShop);
        }
        TbShop tbShop1 = tbShopMapper.selectById(id);
        if(tbShop1==null){
            return Result.error("404","未发现该商铺");
        }
        redisTemplate.opsForValue().set("shopcache"+id,tbShop1,30,TimeUnit.MINUTES);
        return Result.success(tbShop1);

    }

对于更新数据库信息,缓存更新策略如下图

 这里采用主动更新策略,在更新数据库的时候同时更新缓存。操作缓存和数据库有三个问题需要考虑如下。

1删除缓存还是更新缓存?

更新缓存:每次更新数据库都更新缓存,无效操作比较多

删除缓存:更新数据库让缓存失效,查询时更新缓存,效果比较好

2如何保证缓存与数据库的操作同时成功或者失败?

单体系统:将缓存和数据库放在一个事务中。

分布式系统:利用TCC等分布式事务方案。

3先操作数据库还是缓存?

先删除数据库再操作数据库会遇到如下问题

 经过如图所示过程就会出现缓存保存旧的数据的情况。并且这种情况的发生概念是非常高的。

先操作数据库,再删除缓存会出现如下情况

 这种情况下也会发生缓存中存入旧数据的情况,但是由于缓存的执行时间远远小于数据库操作数据,所有这种情况的发生概念会比较小,因此可以选择先更新数据库,然后再删除缓存。

代码如下

   @Transactional
    @PostMapping("/update")
    public Result update(@RequestBody  TbShop tbShop){
        int update = tbShopMapper.updateById(tbShop);
        redisTemplate.delete("shopcache"+tbShop.getId());
        return Result.success();

    }

缓存问题

缓存穿透

缓存穿透是指客户端请求的数据在缓存和数据库中都不存在,这样缓存永远都不会生效,这些请求都会打到数据中。

常见的解决方案:缓存空对象或者布隆过滤。

缓存空对象优点:实现简单,维护方便,缺点:额外的内存消耗,可能造成短期的不一致。

布隆过滤:优点:内存占用少,没有多余的key。缺点:实现复杂和存在误判可能。

缓存雪崩

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

解决方案

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

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

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

给业务添加多级缓存

缓存击穿

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

解决方案:可以通过互斥锁和逻辑过期的方式进行解决。

 这里利用互斥锁的方式来进行模拟

互斥锁流程如下图

 代码如下

 @GetMapping("/select1")
    public Result select1(Long id){
        TbShop tbShop = (TbShop) redisTemplate.opsForValue().get("shopcache" + id);
        if(tbShop!=null){
            return Result.success(tbShop);
        }
        TbShop tbShop1 = null;
        String lockkey = "lockshop"+id;
        try {
            boolean trylock = trylock(lockkey);
            if(!trylock){
                Thread.sleep(50);
               return select(id);
            }
            tbShop1 = tbShopMapper.selectById(id);
            System.out.println("数据库查询");
            Thread.sleep(200);
            if(tbShop1==null){
                return Result.error("404","未发现该商铺");
            }
            redisTemplate.opsForValue().set("shopcache"+id,tbShop1,30,TimeUnit.MINUTES);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            unlock(lockkey);
        }
        return Result.success(tbShop1);

    }

通过jmeter压测工具使用一千多个线程进行测试,后端仅仅只是执行了一次调用数据库操作,实验结果因此得到验证。

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

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

相关文章

微信小程序自动化测试实战教程,框架源码应有尽有

目录 1. 微信小程序自动化测试介绍 2. 搭建微信小程序自动化测试框架 步骤1:选择测试工具 步骤2:搭建测试环境 步骤3:编写测试脚本 步骤4:执行测试 3. 实现微信小程序自动化测试的关键技术 技术1:微信小程序自动…

Netty:常见的面试题和答案

1. 什么是Netty? 答:Netty是一个高性能的网络编程框架,基于NIO的非阻塞式IO模型,可以帮助开发者快速开发高性能、高可靠性的网络应用程序。 2. Netty的核心组件有哪些? 答:Netty的核心组件包括&#xff…

GPT-3模型简单介绍

目录 一、概要 二、深入扩展 一、概要 与T5模型( Text-to-Text Transfer Transformer,详见文末链接 )相似,OpenAI提出的GPT-3模型(第三代GPT)也是通过将不同形式的自然语言处理任务重定义为文本生成实现模型的通用化。…

【面试】一文读懂Java类加载全过程

文章目录 一、概述1. 类加载器2. 加载阶段3. 验证阶段4. 准备阶段5. 解析阶段6. 初始化阶段类加载过程总结 二、相关问题Q: 什么是类加载?Q: Java中有哪些类加载器?Q: 类加载的过程包括哪些步骤?Q: 类加载器的双亲委派模型是什么?…

告别StringUtil:使用Java的全新String API优化你的代码

前言 Java编程语言每一次主要更新,都引入了许多新功能和改进。 并且在String 类中引入了一些新的方法,能够更好地满足开发的需求,提高编程效率。 repeat(int count):返回一个新的字符串,该字符串是由原字符串重复指定…

Jetson TX1 /TX2 对比介绍

大家好,我是虎哥,经过一段时间的整理,针对TX1/TX2这些看起来已经落伍的产品,如何找到合适的应用场景,我也整体上做了一些了解好调研。现在由于资料很多都比较老了,有些表述也有些前后表述不一,所…

ClickHouse环境搭建

目录 1 ClickHouse 的安装1.1 准备工作1.1.1 确定防火墙处于关闭状态1.1.2 CentOS 取消打开文件数限制1.1.3 安装依赖1.1.4 CentOS 取消 SELINUX 1.2 单机安装1.2.1 在 hadoop102 的/opt/software 下创建 clickhouse 目录1.2.2 将安装文件上传到 hadoop102 的software/clickhou…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的伽马变换校正算法增强(C++)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的伽马变换校正算法增强(C) Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合OpenCV使用图像增强算法1.引用合适的类文件2.BGAPI SDK在图像回调…

第三章 作业(7BF)【计算机系统结构】

第三章 作业(7BF)【计算机系统结构】 前言推荐第三章 作业(7BF)71115鲲鹏流水线调研华为鲲鹏处理器ARM体系的总体思想ARM的流水线结构 最后 前言 2023-4-10 18:49:41 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐…

上一次c语言多文件处理代码的改进和总结

先看看上一次的文件: (3条消息) 认真复习c语言1_穿花云烛展的博客-CSDN博客 对于有重复结构体定义但是并不会报错,只是难以修改而已:为了解决这个一改就要改两次的情况,这里有一个解决方案: 上面的代码是可以运行的&…

常见的Web攻击技术

文章目录 前言HTTP 不具备必要的安全功能在客户端即可篡改请求针对 Web 应用的攻击模式 因输出值转义不完全引发的安全漏洞跨站脚本攻击XSSXSS实例 SQL 注入攻击实例 HTTP 首部注入攻击HTTP 首部注入攻击案例HTTP 响应截断攻击 因会话管理疏忽引发的安全漏洞会话劫持会话固定攻…

Java企业级开发学习笔记(2.2)利用MyBatis实现CRUD操作

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/ajSEO】 文章目录 一、准备工作二、查询表记录2.1 在映射器配置文件里引入结果映射元素2.2 添加按姓名查询用户记录功能2.2.1 添加按姓名查询的映射语句2.2.2 添加按姓名查询用户记录的测试方法2.…

17、嵌入式Servlet容器

文章目录 1、切换嵌入式Servlet容器2、定制Servlet容器 【尚硅谷】SpringBoot2零基础入门教程-讲师:雷丰阳 笔记 路还在继续,梦还在期许 1、切换嵌入式Servlet容器 ● 默认支持的webServer ○ Tomcat, Jetty, or Undertow ○ ServletWebServerApplicati…

C++linux高并发服务器项目实践 day7

Clinux高并发服务器项目实践 day7 进程间通信匿名管道管道的特点匿名管道的使用创建匿名管道查看管道缓冲大小命令查看管道缓冲大小函数匿名管道通信案例 管道的读写特点 有名管道有名管道的使用写FIFO管道读FIFO管道总结有名管道实现简单版聊天功能 进程间通信 进程是一个独立…

SRv6实践项目(五):ONOS控制平面实现控制

在先前的几个小结中,一共了解了: p4的编译过程p4runtime的实现原理NDP协议的简单工作流程YANG模型的定义以及用处基于YANG的配置和状态的读写 一共实现了: Mininet拓扑创建p4的基本框架编写对数据平面进行订阅以实现状态读取对数据平面进行…

OJ系统刷题 第十一篇(重点题)

13463 - 折点计数(难题!重点题!) 时间限制 : 1 秒 内存限制 : 128 MB 给定 n 个整数表示一个商店连续 n 天的销售量。 如果某天之前销售量在增长,而后一天销售量减少,则称这一天为折点,反过来…

玩转车载影像传输技术 ,学习Opengl与Surface渲染提升车载影像传输效果

近年来,随着智能化汽车的快速发展,车载倒车影像逐渐成为了汽车安全辅助系统的标配,而高清传输的倒车影像则成为了目前主流的倒车影像传输方式。在这一过程中,Opengl与Surface渲染技术的应用也是不可或缺的一环。 一、高清传输倒车…

E. Archaeology(纯思维)

Problem - E - Codeforces 爱丽丝买了一个刚果总理视频的订阅,正在看一部关于苏格兰卡特林湖的因子岛的考古发现的纪录片。考古学家发现了一本书,其年代和来源都不明。也许爱丽丝可以对它进行一些解释? 这本书包含一串字符 "a"、&…

【AI绘画】Stable Diffusion的介绍及程序示例

Stable Diffusion 1.背景2.StableD 的原理3.StableD 的应用3.1.如何使用 StableD 进行图像生成3.2 图像生成与编辑3.2.1 生成新图像3.2.2 图像编辑 1.背景 近年来,随着人工智能技术的发展,图像生成和合成技术得到了很大的发展。Stable Diffusion (Stable…

MyBatis的关联映射和缓存机制

学习目标: 了解数据表之间的三种关联关系了解对象之间的三种关系熟悉关联关系中的嵌套查询和嵌套结果掌握一对一关联映射掌握—对多关联映射掌握多对多关联映射熟悉Mybatis的缓存机制 文章概述: 前面几章介绍了MyBatis的基本用法、关联映射和动态SQL等…