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

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

文章目录

  • 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

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


http://www.kler.cn/news/311963.html

相关文章:

  • C++ 中std::promise和std::future基本使用
  • OpenCV基础入门30讲(Python)——第二讲 图像色彩转换
  • 卷积参数量计算公式
  • GO主流开源框架
  • python测试开发---js基础
  • 网工请注意!华为认证笔试考试系统升级公告!
  • Matlab Delany-Bazley和Miki模型预测多孔材料吸声性能
  • pprof简单使用
  • 五、I/O与网络编程-5.2、网络编程
  • 全国各省山峰分布SHP数据
  • 【深度学习】(3)--损失函数
  • git使用“保姆级”教程1——简介及配置项设置
  • Kafka基础概念
  • Vivado FIR IP 详解 (一)
  • yolo车位数据集
  • MATLAB 图像处理入门详解
  • 油烟机制造5G智能工厂物联数字孪生平台,推进制造业数字化转型
  • 2.计算机网络基础
  • C# 比较对象新思路,利用反射技术打造更灵活的比较工具
  • 基于 jenkins 的持续集成、持续部署方案
  • 自然语言处理入门:从基础概念到实战项目
  • 计算机毕业设计 教师科研信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • Redis性能测试redis-benchmark
  • ORACLE SAVEPOINT保存点
  • Vue 中常用的基础指令
  • 一、编译原理(引论)
  • 【Python技术】使用akshare、scikit-learn预测股票涨跌简单例子
  • web基础—dvwa靶场(九)Weak Session IDs
  • 组题能力研判:基于教师上传试卷的深度分析
  • AI应用的时代:从大模型到个性化创新