本文所有代码可见 => 【gitee code demo】
本文会涉及 缓存预热、缓存雪崩、缓存击穿、缓存穿透介绍和解决方案业务实践
提前将热点数据加载到缓存,提前响应,降低后端数据源访问压力
@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);
}
同一时间大规模的缓存失效
常见原因:
/**
* 设置缓存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);
}
热点数据过期失效,导致数据库压力骤增



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

缓存和数据库中都不存在数据,请求每次都会直接到数据库
将空结果缓存起来,并设置一个较短的过期时间。这样当再次有相同的查询时,可以直接在缓存中获取到结果,减轻数据库的压力
过滤不可能存在的请求
在预期插入的数据量和误判率一定时,可以通过调整这些参数来控制内存的使用。例如:
如果想要降低误判率,就需要增加位数组的大小或使用更多的哈希函数,这会相应地增加内存的使用。
误判率越低,所需的位数组越长,占用的空间也就越大。
更多的哈希函数会增加计算的耗时,但也会降低误判率。
过滤器业务流程

过滤器业务代码

布隆过滤器封装
