Springboot+Redis:实现缓存 减少对数据库的压力

news2025/1/22 15:46:18

🎉🎉欢迎光临,终于等到你啦🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟持续更新的专栏Redis实战与进阶

本专栏讲解Redis从原理到实践

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net/


缓存如何实现?面试必考题  请看 我的讲解以及最佳实践吧

目录

缓存如何实现?面试必考题  请看 我的讲解以及最佳实践吧

关于 Redis 缓存的解释如下:

实现思路图

商户缓存跟着视频做的,然后我按照同样的方法逻辑 把商店类型的缓存自己做了一遍

首先注册一个IShopTypeService服务的对象typeService 然后直接调用typeService的方法queryTypeList()

下一节我们来讲解 Redis缓存击穿 缓存雪崩等缓存更新会发生的问题  都是Redis的面试必考题


关于 Redis 缓存的解释如下:

  1. Redis 如何实现缓存?
    在后端接收到请求后,对于需要进行缓存的接口,首先会在 Redis 中查找是否有对应的数据。如果缓存中不存在数据,系统会继续按照正常的业务流程处理请求,并将查询到的结果返回给客户端的同时也存储在 Redis 中。下次相同的请求到达时,系统可以直接从 Redis 中获取数据,而无需访问数据库。

在启用缓存后,相同的请求在缓存有效期内不会再去读取数据库。但是,如果在此期间修改了数据库中的数据,接口返回的数据就无法保证与数据库一致。因此,在进行增、删、改操作时,需要刷新缓存。

  1. Redis 缓存更新策略是什么?
    缓存更新可以采用不同的策略,以下是两种常见情况的比较:

第一种情况是先更新数据库,然后同步更新缓存,或者先更新缓存,然后同步更新数据库。这两种方式都属于写穿透(write through)策略。同步更新的好处是可以保持数据的一致性,但缺点是同步更新会对性能产生影响。

第二种情况是先更新缓存,然后异步写回数据库,也被称为写回(write back)策略。异步写回的优点是不会影响缓存的高性能,能够快速响应客户端请求。但缺点是在数据异步写回数据库之前,缓存与数据库的数据可能短暂不一致。

实现思路图

商户缓存跟着视频做的,然后我按照同样的方法逻辑 把商店类型的缓存自己做了一遍

以下是步骤

首先注册一个IShopTypeService服务的对象typeService 然后直接调用typeService的方法queryTypeList()

@RestController
@RequestMapping("/shop-type")
public class ShopTypeController {
    @Resource
    private IShopTypeService typeService;

    @GetMapping("list")
    public Result queryTypeList() {
//        List<ShopType> typeList = typeService.query().orderByAsc("sort").list();
        return typeService.queryTypeList();
    }
}

在IShopTypeService接口中我们定义这个抽象方法 然后在IShopTypeService的实现类IShopTypeServiceImp中实现这个方法

public interface IShopTypeService extends IService<ShopType> {

    Result queryTypeList();
}
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Resource//引入mybatis的接口 用于查数据库
    private IShopTypeService shopTypeService;
    @Override
    public Result queryTypeList() {
        //1.从redis中查询有无
        String shopTypeJson = stringRedisTemplate.opsForValue().get("shopType");
        //2.判断是否存在
        if (StrUtil.isNotBlank(shopTypeJson)){
            //3.存在直接返回 JSONUtil.parseArray将JSON 数组字符串转换为 Java 对象列表
            List<ShopType> shopType= BeanUtil.copyToList(JSONUtil.parseArray(shopTypeJson), ShopType.class);
//            System.err.println(shopType);
            return Result.ok(shopType);
        }
        //不存在 查询数据库
        List<ShopType> shopTypeList = shopTypeService.query().orderByAsc("sort").list();

        //数据库不存在 返回报错
        if (shopTypeList ==null) {
            return Result.fail("查询失败");
        }
        //数据库存在 写入redis  返回
        //将list转换成json 要用toJsonStr不能toString
        String str = JSONUtil.toJsonStr(shopTypeList);
        stringRedisTemplate.opsForValue().set("shopType",str);
//        System.err.println(str);
        return Result.ok(shopTypeList);
    }
}
  • 首先,从 Redis 中查询数据是否存在。
  • 如果数据存在,将 JSON 数组字符串转换为 List<ShopType> 对象,并直接返回结果。
  • 如果数据不存在于 Redis 中,则从数据库查询商店类型列表。
  • 如果数据库查询失败,返回查询失败的错误信息。
  • 如果数据库查询成功,将查询结果转换为 JSON 字符串,并存储到 Redis 中。
  • 最后,返回查询结果。

下一节我们来讲解 Redis缓存击穿 缓存雪崩等缓存更新会发生的问题  都是Redis的面试必考题

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

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

相关文章

期权波动率是什么?怎么计算?

期权波动率 历史波动率&#xff1a;基于历史行情计算出来的历史波动率 我们现在站在现实时点B回顾过去&#xff0c;从A到B这段时间的历史行情我们是知道的&#xff0c;但是基于过去一段时间&#xff0c;标的价格的历史数据计算出来的波动率&#xff0c;就是历史波动率&#x…

c++类和对象(中)类的6个默认成员函数及const成员函数

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a;类和对象 主厨&#xff1a;邪王真眼 所属专栏&#xff1a;c专栏 主厨的主页&#xff1a;Chef‘s blog 前言&#xff1a; 咱们之前也是…

字符分类函数

字符分类函数 文章目录 前言1. 字符分类函数1.2.使用例子 2.2.字符操作函数 前言 在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了⼀系列库函数&#xff0c;接下来我们就学习⼀下这些函数。 1. 字…

搭建项目后台系统基础架构

任务描述 1、了解搭建民航后端框架 2、使用IDEA创建基于SpringBoot、MyBatis、MySQL、Redis的Java项目 3、以原项目为参照搭建项目所涉及到的各个业务和底层服务 4、以原项目为例&#xff0c;具体介绍各个目录情况并参照创建相关文件夹 1、创建项目后端 BigData-KongGuan …

Linux发布项目(包括前端和后端)到OpenEuler虚拟机上

后端&#xff1a;SpringBoot 前端&#xff1a;VUE3 操作系统&#xff1a;Linux 虚拟机&#xff1a;OpenEuler 发布项目是需要关闭虚拟机上的防火墙 systemctl stop firewalld 一、发布后端项目到虚拟机 1打包后端项目为jar包 2将打包后的jar包放到虚拟机 /opt 目录下 3 运行项…

接口自动化测试流程、工具及实践(完整版)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、接口自动化测试简介 接口自动化测试是指通过编写脚本或使用自动化工具&#xff0c;对软件系…

小朋友排队(蓝桥杯,acwing,归并)

题目描述&#xff1a; n 个小朋友站成一排。 现在要把他们按身高从低到高的顺序排列&#xff0c;但是每次只能交换位置相邻的两个小朋友。 每个小朋友都有一个不高兴的程度。 开始的时候&#xff0c;所有小朋友的不高兴程度都是 0。 如果某个小朋友第一次被要求交换&#…

算法之前缀和

题目1: 【模板】一维前缀和&#xff08;easy&#xff09; 方法一: 暴力解法, 时间复杂度O(n*q), 当n10^5, q 10^5, 时间复杂度为O(10^10), 会超时. 方法二: 前缀和: 快速求出数组中某一段连续区间的和. 第一步: 预处理出来一个前缀和数组dp: 1. dp[i]表示区间[1,i]里所有元…

“币安悬赏500万美元”,调查BOME内幕!创始人:谁控制了Meme,谁就控制了宇宙!

自去年11月开始&#xff0c;背靠美帝资本力量的Solana在FTX交易所暴雷后重新崛起。目前Sol价格已经从熊市的8美刀上涨至200刀附近。除了Sol本币上涨外&#xff0c;Solana生态也是快速发展。 这其中又以Meme币最为突出&#xff01;西方玩家正把所有的梗都搬进链上制成Meme币&am…

echarts geo地图加投影两种方法

方法1&#xff0c;geo中加多个地图图形&#xff0c;叠加。缩放时 可能会不一致&#xff0c;需要捕捉georoam事件&#xff0c;使下层的geo随着上层的geo一起缩放拖曳 geo: [{zlevel: 3,//geo显示级别&#xff0c;默认是0 【最顶层图形】map: BJ,//地图名roam: true,scaleLimit: …

[AIGC] MySQL与PostgreSQL:两种流行的数据库系统的对比

数据库是存储和查询数据的重要工具。在选择数据库时&#xff0c;两个经常被考虑的选项都是开源的&#xff1a;MySQL和PostgreSQL。这两个数据库都与许多应用程序一起使用&#xff0c;但它们在某些方面存在显著的不同。在本文中&#xff0c;我们将比较MySQL和PostgreSQL的一些关…

基金分析之与行业间的相关系数计算

这几年买了非常多的基金&#xff0c;一直很好奇基金在非业绩披露期都持有了什么东西&#xff1f;所以写了一个基金净值和各申万一级行业相关系数&#xff08;以及和市场主流指数&#xff09;的代码看看能否分析出点东西。 这里依然用了wind API&#xff0c;复现前记得安装。 …

超快速排序(蓝桥杯,归并排序,acwing)

题目描述&#xff1a; 在这个问题中&#xff0c;您必须分析特定的排序算法----超快速排序。 该算法通过交换两个相邻的序列元素来处理 n 个不同整数的序列&#xff0c;直到序列按升序排序。 对于输入序列 9 1 0 5 4&#xff0c;超快速排序生成输出 0 1 4 5 9。 您的任务是确…

JavaScript基础知识2

求数组的最大值案例 let arr[2,6,1,7,400,55,88,100]let maxarr[0]let minarr[0]for(let i1;i<arr.length;i){max<arr[i]?maxarr[i]:maxmin>arr[i]?minarr[i]:min}console.log(最大值是&#xff1a;${max})console.log(最小值是&#xff1a;${min}) 操作数组 修改…

企业专业化管理金字塔:技能进阶与案例分析

在纷繁复杂的企业管理领域中&#xff0c;一套行之有效的管理技能体系对于企业的稳健发展至关重要。本文将深入探讨企业专业化管理金字塔的五个层次&#xff1a;基本的管理技能、业务操作管理技能、组织管理技能、组织开发技能以及管理转变技能&#xff0c;并结合实际案例&#…

Java后端八股------设计模式

Coffee可以设计成接口。 b

代码随想录算法训练营第27天|93.复原IP地址、78.子集、90.子集二

目录 一、力扣93.复原IP地址1.1 题目1.2 思路1.3 代码1.4 总结 二、力扣78.子集2.1 题目2.2 思路2.3 代码2.4 总结 三、力扣90.子集二3.1 题目3.2 思路3.3 代码3.4 总结 一、力扣93.复原IP地址 &#xff08;比较困难&#xff0c;做起来很吃力&#xff09; 1.1 题目 1.2 思路 …

30.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据搜索功能

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;29.数据推测功能…

解决MySQL “Lock wait timeout exceeded; try restarting transaction“ 错误

在处理MySQL数据库时&#xff0c;我们偶尔会遇到一个棘手的错误消息&#xff1a;“Lock wait timeout exceeded; try restarting transaction”。这通常表明我们的一个事务在尝试获取资源时被阻塞了太长时间。在并发环境中&#xff0c;多个事务同时竞争相同的资源可能会导致这种…

前端 - 基础 表单标签 -- 表单元素( input - type属性) 文本框和密码框

表单元素 &#xff1a; 在表单域中可以定义各种表单元素&#xff0c;这些表单元素就是允许用户在表单中输入或选择 的内容控件。 表单元素的外观也各不一样&#xff0c;有小圆圈&#xff0c;有正方形&#xff0c;也有方框&#xff0c;乱七八糟的&#xff0c;各种各样&#xf…