Redis 缓存预热、缓存雪崩、缓存击穿、缓存穿透业务实践

0、前言

本文所有代码可见 => 【gitee code demo】

本文会涉及 缓存预热、缓存雪崩、缓存击穿、缓存穿透介绍和解决方案业务实践

1、缓存预热

1.1、描述

提前将热点数据加载到缓存,提前响应,降低后端数据源访问压力

1.2、实践

java 复制代码
	@Autowired
	private RedisTemplate<String, Object> redisTemplate;

	// 业务
    public void bizFunc(String[] args) {
        // 预热缓存
        warmUpCache();

        // 使用缓存
        String value = getFromCache("key1");
        System.out.println("从缓存中获取的值:" + value);
    }

    // 模拟缓存预热
	public void warmUpCache() {
		redisTemplate.opsForValue().set("key1", "value1");
		redisTemplate.opsForValue().set("key2", "value2");
		redisTemplate.opsForValue().set("key3", "value3");
	}
	
	
	public String getFromCache(String key) {
		return (String) redisTemplate.opsForValue().get(key);
	}

2、缓存雪崩

2.1、描述

同一时间大规模的缓存失效

常见原因:

  • 服务器宕机
  • 同一时刻,缓存大面积失效

2.2、解决方案

  • 使用集群防止单点故障
  • 对缓存key的过期时间进行随机化处理
  • 服务降级

2.3、实践:过期时间随机化处理

java 复制代码
/**
 * 设置缓存key的过期时间并进行随机化处理
 * @param key 缓存key
 * @param value 缓存value
 */
public void setWithRandomExpire(String key, Object value) {
	// 生成一个随机的过期时间,范围在[240, 300]s之间
	long randomExpireTime = ThreadLocalRandom.current().nextLong(60) + 240;
	redisTemplate.opsForValue().set(key, value, randomExpireTime, TimeUnit.SECONDS);
}

3、缓存击穿

3.1、描述

热点数据过期失效,导致数据库压力骤增

3.2、解决方案

  • 差异失效时间(双缓存)
  • 双检加锁

3.3、实践1:差异失效时间(双缓存)

3.4、实践2:双检加锁

缓存失效时,对查询MySQL加锁,只有一个线程能查MySQL,防止MySQL压力过大

4、缓存穿透(本来无一物)

4.1、描述

缓存和数据库中都不存在数据,请求每次都会直接到数据库

4.2、解决方案

  • 缓存空结果

将空结果缓存起来,并设置一个较短的过期时间 。这样当再次有相同的查询时,可以直接在缓存中获取到结果,减轻数据库的压力

  • 布隆过滤器

过滤不可能存在的请求

4.3、实践:Guava布隆过滤器

4.3.1、Guava布隆过滤器原理

在预期插入的数据量和误判率一定时,可以通过调整这些参数来控制内存的使用。例如:

  • 如果想要降低误判率 ,就需要增加位数组 的大小或使用更多的哈希函数 ,这会相应地增加内存的使用

  • 误判率越低,所需的位数组越长,占用的空间也就越大。

  • 更多的哈希函数会增加计算的耗时,但也会降低误判率。

size fpp bit count hash function num
100 w 0.03 361,9595 5 测试1截图
100 w 0.003 585,1072 8 测试2截图

4.3.2、实践

过滤器业务流程

过滤器业务代码

布隆过滤器封装

相关推荐
一周困⁸天.10 小时前
Redis Sentinel哨兵集群
redis·bootstrap·sentinel
Hello World......10 小时前
互联网大厂Java面试实战:以Spring Boot与微服务为核心的技术场景剖析
java·spring boot·redis·微服务·junit·kafka·spring security
linweidong11 小时前
多级缓存系统设计:从本地到分布式,打造高性能利器
分布式·缓存·消息队列·雪崩·java面经·击穿·消费端
Feng.Lee11 小时前
聊聊高并发访问遇到过期的缓存项测试策略
功能测试·缓存·可用性测试·测试覆盖率
宁&沉沦16 小时前
Nginx清除浏览器缓存的三个缓存响应头的关系详解
运维·nginx·缓存
vivo互联网技术18 小时前
Redis key 消失之谜
数据库·redis·内存淘汰策略·redis抓包分析·机制分析
JosieBook18 小时前
【SpringBoot】29 核心功能 - 数据访问 - Spring Boot 2 操作 Redis 实践指南:本地安装与阿里云 Redis 对比应用
spring boot·redis·阿里云
山河亦问安18 小时前
SpringBoot3整合JetCache缓存
缓存
一辉ComeOn19 小时前
【大数据高并发核心场景实战】 数据持久化层 - 查询分离
java·大数据·数据库·elasticsearch·缓存·oracle
cookies_s_s20 小时前
项目--缓存系统(C++)
c++·缓存