流殃的博客

| Comments

引言

众所周知,面试与实际使用的差别,redis在面试的时候,三大经典问题,缓存雪崩,缓存穿透,缓存击穿,在这些问题的回答中,经常会提到所谓的布隆过滤器,但是实际生产中很少人使用。

实际使用

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

缓存穿透

一行配置解决

spring.cache.redis.cache-null-values=true

带上该配置后,就可以缓存null值了,值得一提的是,这个缓存时间要设的少一点,例如15秒就够,如果设置过长,会导致正常的缓存也无法使用。

缓存击穿

一个注解解决

@Cacheable(cacheNames="menu", sync="true")

当设置它为true时,只有一个线程的请求会去到数据库,其他线程都会等待直到缓存可用。这个设置可以减少对数据库的瞬间并发访问。

缓存雪崩

在高并发下,大量的缓存key在同一时间失效,导致大量的请求落到数据库上,如活动系统里面同时进行着非常多的活动,但是在某个时间点所有的活动缓存全部过期。

那么针对该问题,最简单的解决方法就是,过期时间加随机值!

但是很麻烦的是,我们在使用@Cacheable注解的时候,原生功能没法直接设置随机过期时间的。

这个老实说,真没啥好方法,只能自己继承RedisCache,对其增强,改写其中的put方法,带上随机时间!

参考

Comments

评论