解决Redis面试题中缓存穿透问题(redis面试题缓存穿透)

2023-05-15 03:26:25 缓存 面试题 穿透

缓存穿透是指由于量太大,不断地有数据过来访问Redis缓存服务器,由于没有对应缓存数据,继而达到破坏Redis服务器的目的。缓存穿透是一种低延时高覆盖率的攻击,能够产生比其他攻击更大的强度,对应用系统和WEB服务器组灵活迅速的响应缓冲服务产生不良影响,下面是我们用解决Redis缓存穿透的方法:

1)缓存设计

我们可以在设计Redis缓存时,遵守一定的规范,由于缓存key占用大量的空间,且对响应时间有影响,所以我们在设计时可以采用hash结构进行存储,它可以有效降低缓存空间占用,又不会降低响应速度。

2)缓存预热

如果要避免缓存穿透的出现,可以利用缓存预热的方法,由于目前有很多球队,参加各种赛事,每次赛事都会有对应的比分更新,当数据过量的时候,我们可以利用缓存预热的方法去提前加载比赛数据,实时更新数据,从而避免缓存穿透出现。

相应的代码如下:

//提前加载数据

String key = “soccer-score-” + gameId;

String value = scoreCacheService.queryScoreCache(gameId);

redisTemplate.opsForValue().set(key,value);

//设置过期时间

redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);

3)Bloom Filter

Bloom Filter是一种布隆过滤器,能够快速判断一个值是否存在,能够提高系统的处理性能,在解决缓存穿透的时候,可以先调用Bloom Filter查看该键是否存在,存在的话,那么就可以直接去从数据库查找数据,不存在的话,那么就能够用空值的默认值,减轻系统的压力。

相应的代码如下:

//初始化布隆过滤器

private BloomFilter bloomFilter = BloomFilter.create(Funnels.stringFunnel(StandardCharsets.UTF_8), 100000, 0.001);

//查看key是否存在

String key = “soccer-score-” + gameId;

boolean exists = bloomFilter.mightContn(key);

if (exists) {

String value = scoreCacheService.queryScoreCache(gameId);

redisTemplate.opsForValue().set(key,value);

}else {

String value = “blank”;

redisTemplate.opsForValue().set(key,value);

}

以上是我们可以用来解决Redis缓存穿透的一些方法,同时也能够减轻系统缓冲的压力,提升系统的处理性能。

相关文章