当前位置: 首页 > 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

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

相关文章:

  • 513. 找树左下角的值
  • 常见场景题3(面试)
  • Netty简介
  • 时序数据库 TDengine 的入门体验和操作记录
  • java 框架组件
  • 24暑假实习信息、25秋招提前批信息,地信、测绘、遥感、地质相关岗位招聘汇总
  • C++——输入三个整数,按照由小到大的顺序输出。用指针方法处理。
  • ubuntu错误GPG error: http://repo.mysql.com/apt/ubuntu noble InRelease
  • Contact Form 7最新5.9.8版错误修复方案
  • Redisson 总结
  • QT窗口无法激活弹出问题排查记录
  • Stylized Smooth Clouds 卡通风格化云朵包
  • 《ChatGPT:强大的人工智能聊天机器人》
  • PG逻辑订阅功能
  • 【完整梳理验证】企业微信第三方应用接入全流程java版
  • 大数据新视界 --大数据大厂之探索ES:大数据时代的高效搜索引擎实战攻略
  • 第十四届蓝桥杯嵌入式国赛
  • 瑞利相干斑模型
  • 本地程序管理 -- geek(自带删除注册表内容)
  • Node-RED-L2-Node-RED在Linux系统启动时自动运行
  • 贵州省总工会正厅级副主席梁伟被查,曾任贵州省纪委副书记
  • 第三届“老山国际春茶节”活动在云南麻栗坡举办
  • 广西钦州:坚决拥护自治区党委对钟恒钦进行审查调查的决定
  • 庆祝上海总工会成立100周年暨市模范集体劳动模范和先进工作者表彰大会举行,陈吉宁寄予这些期待
  • 招商蛇口:今年前4个月销售额约498.34亿元
  • 保利42.41亿元竞得上海杨浦东外滩一地块,成交楼面单价超8万元