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

缓存穿透 问题(缓存空对象)

文章目录

  • 1、缓存穿透
  • 2、缓存空对象
  • 3、AlbumInfoApiController --》getAlbumInfo()
  • 4、AlbumInfoServiceImpl --》getAlbumInfo()
  • 5、RedisConstant
  • 6、请求缓存不存在的数据

1、缓存穿透

缓存穿透带有恶意性,强调不存在的数据。
在这里插入图片描述

2、缓存空对象

在这里插入图片描述

3、AlbumInfoApiController --》getAlbumInfo()

	@GetMapping("getAlbumInfo/{albumId}")public Result<AlbumInfo> getAlbumInfo(@PathVariable("albumId") Long albumId) {
//		try {
//			Thread.sleep(20);
//		} catch (InterruptedException e) {
//			throw new RuntimeException(e);
//		}AlbumInfo albumInfo = this.albumInfoService.getAlbumInfo(albumId);return Result.ok(albumInfo);}

4、AlbumInfoServiceImpl --》getAlbumInfo()

    public AlbumInfo getAlbumInfo(Long albumId) {// 1.先查询缓存,如果命中则直接返回AlbumInfo albumInfo = (AlbumInfo) this.redisTemplate.opsForValue().get(RedisConstant.ALBUM_INFO_PREFIX + albumId);if (albumInfo != null) {return albumInfo;}// 查询专辑albumInfo = this.getById(albumId);if (albumInfo != null) {// 根据专辑查询专辑标签值List<AlbumAttributeValue> albumAttributeValues = this.attributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, albumId));albumInfo.setAlbumAttributeValueVoList(albumAttributeValues);}// 2.放入缓存if (albumInfo == null) {// 为了防止缓存穿透:数据即使为空也缓存,只是缓存时间不宜太长。this.redisTemplate.opsForValue().set(RedisConstant.ALBUM_INFO_PREFIX + albumId, albumInfo, RedisConstant.ALBUM_TEMPORARY_TIMEOUT, TimeUnit.SECONDS);}else {this.redisTemplate.opsForValue().set(RedisConstant.ALBUM_INFO_PREFIX + albumId, albumInfo, RedisConstant.CACHE_TIMEOUT, TimeUnit.SECONDS);}return albumInfo;}

在这里插入图片描述

5、RedisConstant

    public static final String ALBUM_INFO_PREFIX = "album:info:";// 商品如果在数据库中不存在那么会缓存一个空对象进去,但是这个对象是没有用的,所以这个对象的过期时间应该不能太长,// 如果太长会占用内存。// 定义变量,记录空对象的缓存过期时间public static final long ALBUM_TEMPORARY_TIMEOUT = 10 * 60;public static final long CACHE_TIMEOUT = 24 * 60 * 60;

6、请求缓存不存在的数据

http://127.0.0.1:8500/api/album/albumInfo/getAlbumInfo/9800

在这里插入图片描述
在这里插入图片描述

相关文章:

  • Java | Leetcode Java题解之第436题寻找右区间
  • Python 如何使用 unittest 模块编写单元测试
  • Vue75 编程式路由导航
  • Azure Data Box 80 TB 现已在中国区正式发布
  • Vue使用axios二次封装、解决跨域问题
  • LabVIEW闪退
  • Java项目实战II基于Java+Spring Boot+MySQL的汽车销售网站(文档+源码+数据库)
  • 2.1 HuggingFists系统架构(一)
  • 快讯:腾讯轻量服务器四周年,最低一折续费,还有免费升配
  • [Redis][主从复制][中]详细讲解
  • 在什么时候需要用到常引用const---情景
  • Java中的JDK8及后续的重要新特性
  • 【NumPy】专题学习
  • Qt优秀开源项目之二十三:QSimpleUpdater
  • Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【React系列】如何构建React应用程序
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Java,console输出实时的转向GUI textbox
  • JS笔记四:作用域、变量(函数)提升
  • LeetCode18.四数之和 JavaScript
  • markdown编辑器简评
  • Mybatis初体验
  • Python学习之路13-记分
  • QQ浏览器x5内核的兼容性问题
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SpriteKit 技巧之添加背景图片
  • 京东美团研发面经
  • 入手阿里云新服务器的部署NODE
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 思否第一天
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • ​你们这样子,耽误我的工作进度怎么办?
  • !$boo在php中什么意思,php前戏
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #window11设置系统变量#
  • #宝哥教你#查看jquery绑定的事件函数
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (7) cmake 编译C++程序(二)
  • (Qt) 默认QtWidget应用包含什么?
  • (苍穹外卖)day03菜品管理
  • (翻译)terry crowley: 写给程序员
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十七)Flink 容错机制
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)四层和七层负载均衡的区别
  • ***通过什么方式***网吧
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET MVC第三章、三种传值方式
  • .net 发送邮件
  • .NET6 命令行启动及发布单个Exe文件