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

基于Redis提高查询性能(保持数据一致性)

Redis实战篇 | Kyle's Blog (cyborg2077.github.io)

目录

背景

商户查询缓存(根据ID查询)

 根据店铺类型查询(List型)

缓存更新策略(保证数据一致性)

案例(利用缓存更新策略)


背景

起初客户端直接向数据库查询数据                              添加redis后 

商户查询缓存(根据ID查询)

 实现业务流程

 ShopController

    @GetMapping("/{id}")public Result queryShopById(@PathVariable("id") Long id) {return shopService.queryById(id);}

IShopService 

public interface IShopService extends IService<Shop> {Result queryById(Long id);
}

ShopServiceImpl 

@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {@Resourcepublic StringRedisTemplate stringRedisTemplate;@Overridepublic Result queryById(Long id) {String key = CACHE_SHOP_KEY + id;// 1.从redis查询商铺缓存String shopJson = stringRedisTemplate.opsForValue().get(key);// 2.判断缓存是否命中if(StrUtil.isNotBlank(shopJson)){// 3.缓存命中,返回// 将json反序列化为对象Shop shop = JSONUtil.toBean(shopJson, Shop.class);return Result.ok(shop);}// 4.缓存未命中,根据id查询数据库Shop shop = getById(id);// 5.数据库不存在,返回错误if(shop == null){return Result.fail("店铺不存在");}// 6.数据库存在,写入缓存stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop),30L, TimeUnit.MINUTES);// 7.返回return Result.ok(shop);}
}

 根据店铺类型查询(List型)

Controller 

@RestController
@RequestMapping("/shop-type")
public class ShopTypeController {@Resourceprivate IShopTypeService typeService;@GetMapping("list")public Result queryTypeList() {return typeService.queryList();}
}

接口 

public interface IShopTypeService extends IService<ShopType> {Result queryList();
}

实现类

@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {@Resourcepublic StringRedisTemplate stringRedisTemplate;@Overridepublic Result queryList() {// 1.从redis查询商铺类型List<String> shopTypes = stringRedisTemplate.opsForList().range(CACHE_SHOP_KEY, 0, -1);// 2.判断redis是否命中if(!shopTypes.isEmpty()){//如果命中则转为ShopType类型返回List<ShopType> tmp = new ArrayList<>();for (String types : shopTypes) {ShopType shopType = JSONUtil.toBean(types, ShopType.class);tmp.add(shopType);}return Result.ok(tmp);}//没有命中则查询数据库List<ShopType> tmp = query().orderByAsc("sort").list();if(tmp.isEmpty()){return Result.fail("店铺类型不存在");}//3.将数据写入redisshopTypes.forEach(shopType -> {stringRedisTemplate.opsForList().rightPush(CACHE_SHOP_KEY,JSONUtil.toJsonStr(shopType));});//4.返回return Result.ok(tmp);}
}

缓存更新策略(保证数据一致性)

 三种更新缓存的策略(保证数据一致性)

我们主要使用主动更新策略

又因为操作数据库和缓存的先后顺序,线程问题;因此需要先修改数据库,再删除缓存,加锁,使用事务。

案例(利用缓存更新策略)

根据id查询店铺时,如果缓存未命中,则查询数据库,将数据库结果写入缓存,并设置超时时间 

// 6.数据库存在,写入缓存
stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop), CACHE_SHOP_TTL , TimeUnit.MINUTES);

根据id修改店铺时,先修改数据库,再删除缓存

    @Override@Transactionalpublic Result update(Shop shop) {Long id = shop.getId();if(id == null){return Result.fail("店铺id不能为空");}// 1.更新数据库updateById(shop);// 2.删除缓存stringRedisTemplate.delete(CACHE_SHOP_KEY + id);return Result.ok();}

相关文章:

  • YOLOV8 目标检测:训练自定义数据集
  • 短视频热恋进行时:成都柏煜文化传媒有限公司
  • React是什么?
  • 从治理到“智”理,打造新一代金融数据体系
  • 通义千问调用笔记
  • 使用kettle做的数据同步案例
  • C/C++ string模拟实现
  • MYSQL execute command denied to user ‘‘@‘%‘ for routine
  • 腾讯《地下城与勇士:起源》手游在部分安卓平台停止更新
  • 微信小程序-上拉加载和下拉刷新
  • C类IP介绍
  • 【Java数据结构】优先级队列详解(二)
  • centos环境上:k8s 简单安装教程
  • 《算法设计与分析》第五六章:回溯法与分支限界法
  • FreeRTOS学习笔记-基于stm32(11)任务通知及相关API函数简介
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Java深入 - 深入理解Java集合
  • linux学习笔记
  • markdown编辑器简评
  • Vim 折腾记
  • vue 配置sass、scss全局变量
  • vue2.0项目引入element-ui
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 跨域
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 优化 Vue 项目编译文件大小
  • HanLP分词命名实体提取详解
  • 阿里云ACE认证学习知识点梳理
  • 函数计算新功能-----支持C#函数
  • 正则表达式-基础知识Review
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Apache SeaTunnel 究竟是什么?
  • #Linux(make工具和makefile文件以及makefile语法)
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)Android开发优化---------UI优化
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (LLM) 很笨
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (回溯) LeetCode 131. 分割回文串
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (六)vue-router+UI组件库
  • (区间dp) (经典例题) 石子合并
  • (四)Linux Shell编程——输入输出重定向
  • (详细文档!)javaswing图书管理系统+mysql数据库