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

文章目录

1、缓存穿透

缓存穿透带有恶意性,强调不存在的数据。

2、缓存空对象

3、AlbumInfoApiController --》getAlbumInfo()

java 复制代码
	@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()

java 复制代码
    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

java 复制代码
    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、请求缓存不存在的数据

cpp 复制代码
http://127.0.0.1:8500/api/album/albumInfo/getAlbumInfo/9800


相关推荐
Zfox_4 小时前
Redis:Hash数据类型
服务器·数据库·redis·缓存·微服务·哈希算法
呼拉拉呼拉4 小时前
Redis内存淘汰策略
redis·缓存
咖啡啡不加糖8 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
MickeyCV8 小时前
使用Docker部署MySQL&Redis容器与常见命令
redis·mysql·docker·容器·wsl·镜像
肥仔哥哥19309 小时前
springCloud2025+springBoot3.5.0+Nacos集成redis从nacos拉配置起服务
redis·缓存·最新boot3集成
呼拉拉呼拉11 小时前
Redis故障转移
数据库·redis·缓存·高可用架构
什么都想学的阿超11 小时前
【Redis系列 04】Redis高可用架构实战:主从复制与哨兵模式从零到生产
数据库·redis·架构
我命由我1234514 小时前
Spring Boot 项目集成 Redis 问题:RedisTemplate 多余空格问题
java·开发语言·spring boot·redis·后端·java-ee·intellij-idea
篱笆院的狗15 小时前
如何使用 Redis 快速实现布隆过滤器?
数据库·redis·缓存
小鸡脚来咯16 小时前
redis分片集群架构
数据库·redis·架构