引言
众所周知,面试与实际使用的差别,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方法,带上随机时间!