当前位置: 首页 > news >正文

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

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

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

🌟持续更新的专栏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 {@Resourceprivate 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 {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Resource//引入mybatis的接口 用于查数据库private IShopTypeService shopTypeService;@Overridepublic 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不能toStringString 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的面试必考题

相关文章:

  • 防范服务器被攻击:查询IP地址的重要性与方法
  • Java 多线程(超详细讲解)上篇
  • 实现:mysql-5.7.42 到 mysql-8.2.0 的升级(二进制方式)
  • BUGKU-WEB shell
  • Vector Magic:高效图像矢量化工具,轻松实现图片转矢量
  • PTA L2-021 点赞狂魔
  • 众生度尽,方证菩提,地狱不空,誓不成佛;男人一定要帅,像地藏王菩萨一样
  • 张宇高数一学习笔记-第一讲-函数极限与连续(1)
  • 移除元素(leetcode)
  • HarmonyOS NEXT应用开发之大文件拷贝案例
  • 提升零售行业竞争力的信息抽取技术应用与实践
  • 深入挖掘C语言之——枚举
  • [Linux] 进程间通信基础
  • Java安全 反序列化(1) URLDNS链原理分析
  • Linux下使用ntpdate进行时间同步
  • 时间复杂度分析经典问题——最大子序列和
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Babel配置的不完全指南
  • es的写入过程
  • java小心机(3)| 浅析finalize()
  • JSDuck 与 AngularJS 融合技巧
  • Js基础——数据类型之Null和Undefined
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • MySQL数据库运维之数据恢复
  • mysql外键的使用
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 回顾2016
  • 技术发展面试
  • 如何使用 JavaScript 解析 URL
  • 小李飞刀:SQL题目刷起来!
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • postgresql行列转换函数
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​flutter 代码混淆
  • #include
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)Mysql的优化设置
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .Net IOC框架入门之一 Unity
  • .net MySql
  • .NET 服务 ServiceController
  • .NET企业级应用架构设计系列之结尾篇
  • .NET序列化 serializable,反序列化
  • .net中生成excel后调整宽度
  • .考试倒计时43天!来提分啦!
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @angular/cli项目构建--http(2)
  • @Service注解让spring找到你的Service bean
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [04]Web前端进阶—JS伪数组
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]