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

使用Redis实现业务信息缓存(缓存详解,缓存更新策略,缓存三大问题)

一、什么是缓存?

        缓存是一种高效的数据存储方式,它通过将数据保存在内存中来提供快速的读写访问。这种机制特别适用于需要高速数据访问的应用场景,如网站、应用程序和服务。在处理大量数据和高并发请求时, 缓存能显著提高性能和用户体验。

        Redis就是一款常用的缓存中间件。

二、如何在业务中结合Redis进行缓存(代码模版)?

1.基本步骤

在业务中结合Redis进行缓存主要有以下步骤:

(1)根据key到redis中查找对应值

(2)若查找到,则直接返回。若redis中没有,则在数据库中进行查找

(3)数据库查找完毕后,先存储查找到的数据到redis中,便于下次查找同样数据的时候,可以直接从redis中获取,不用走数据库,减轻数据库的压力

(4)最后将数据进行返回即可

2.代码模版

这里以查找商铺信息为例,给出结合redis进行商铺信息缓存的代码:

(1)Controller层:

    /*** 根据id查询商铺信息* @param id 商铺id* @return 商铺详情数据*/@GetMapping("/{id}")public Result queryShopById(@PathVariable("id") Long id) {return shopService.queryById(id);}

(2)Service层:

    @AutowiredStringRedisTemplate stringRedisTemplate;/*** 根据id查询商铺信息* @param id* @return*/@Overridepublic Result queryById(Long id) {//1.从redis查询商铺缓存String key = RedisConstants.CACHE_SHOP_KEY + id;String shopFromRedis = stringRedisTemplate.opsForValue().get(key);//2.判断是否存在if(!StringUtils.isEmpty(shopFromRedis)){//3.redis存在此商铺,返回结果Shop shop = JSONUtil.toBean(shopFromRedis, Shop.class);return Result.ok(shop);}//4.不存在,到数据库中去查询Shop shop = getById(id);//5.数据库不存在,返回错误if(shop == null){return Result.fail("店铺不存在");}//6.数据库存在,写入redisstringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop),RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);//7.返回结果return Result.ok(shop);}

三、缓存更新策略

1.三种缓存更新策略

        缓存更新策略主要有:内存淘汰超时剔除主动更新这三种。

1.内存淘汰:

        简单来说就是Redis根据其内存大小,其淘汰策略(如:键值对的访问频率)等,对键值对进行淘汰。 可以对redis进行配置(如:设置redis内存大小),来控制其内存淘汰。这种方法一般由redis自主控制,因此其一致性也比较差。

2.超时剔除:

        简单来说,就是在向redis存入键值对的时候,为这个键值对赋予一个TTL(超时时间),如果超过这个时间,redis就会将这个键值对进行删除。其一致性相较于内存淘汰策略会好一些。

3.主动更新:

        也就是在修改数据库的时候对缓存也进行修改。这种方法一致性相较于前两种会好很多,但是需要由程序员自主编码进行控制,会复杂一些。

        一般使用主动更新策略为主,结合超时剔除作为兜底,来实现缓存的更新

2.主动更新详解

2.1.三种主动更新策略

(1)Cache Aside Pattern:

        由缓存的调用者,在更新数据库的同时更新缓存

(2)Read/Write Through Pattern:

        缓存与数据库整合为一个服务,由服务维护一致性,调用者调用该服务,无需关心缓存一致性问题。但这种方式较为复杂,市面上提供这种服务的框架较少。

(3)Wri

http://www.lryc.cn/news/534199.html

相关文章:

  • 已验证正常,Java输入字符串生成PDF文件
  • android手机安装deepseek-r1:1.5b
  • 51单片机俄罗斯方块清屏函数
  • PLSQL: 存储过程,用户自定义函数[oracle]
  • 深度学习-医学影像诊断
  • 备战蓝桥杯:双指针(滑动窗口)算法之逛花展
  • Linux如何设置软件开机启动呢?
  • Vue(3)
  • 11vue3实战-----封装缓存工具
  • 第16章 Single Thread Execution设计模式(Java高并发编程详解:多线程与系统设计)
  • MySQL 8.0.41 终端修改root密码
  • 微信小程序案例2——天气微信小程序(学会绑定数据)
  • android的Compose 简介
  • 缓存实战:Redis 与本地缓存
  • apisix的real-ip插件使用说明
  • 音视频协议
  • 第一财经对话东土科技 | 探索工业科技新边界
  • Maven 与企业项目的集成
  • 激活函数篇 01 —— 激活函数在神经网络的作用
  • 22.2、Apache安全分析与增强
  • Day.23
  • CentOS虚机在线扩容系统盘数据盘
  • 动手写ORM框架 - GeeORM第一天 database/sql 基础
  • 绘制中国平安股价的交互式 K 线图
  • [渗透测试]热门搜索引擎推荐— — shodan篇
  • JavaScript 在 VSCode 中的优势与应用
  • 深度学习之StyleGAN算法解析
  • 数据结构之排序
  • Vue.js 与第三方插件的集成
  • 基于Docker搭建ES集群,并设置冷热数据节点