(1)为什么使用缓存

对于经常访问的,且不会轻易发生改变的数据可以使用缓存,这样就减轻了数据库访问的压力,数据的访问,先从redis中进行查询,如果redis中有数据,就直接从redis中进行返回,redis中没有数据就去数据库中进行查询,将查询的结果返回给redis,方便下次进行查询。

(2)为什么使用redis,而不用原生缓存

原生的缓存:mybatis的二级缓存,和hibernate(是jpa的实现)的二级缓存

                     这里不再讨论一级缓存,因为一级缓存是默认存在的,存在于一次会话中。

中央缓存:redis和memcached

原因:

       (1)因为原生缓存是存在内存中,而内存的大小是有限的,当数据量大的时候,会造成系统奔溃

       (2)原生缓存不可持久化

       (3)不支持集群

(3)缓存穿透

指的是redis中没有数据,数据库中也没有数据,前台就会一直发送请求,导致缓存穿透

解决方案:①做拦截,对于这种错误的请求,直接拦截 避免进入redis和数据库中

                  ②因为redis中存值的方式是key-value,当数据去访问的时候,没有对请求进行拦截,将会去redis中进行拿取数据,这时候,在redis中会拿不到数据,会去数据库中拿取,在数据库中也查询不到值,然后将这条请求的数据的值设置为null值,这样访问查询的时候,就会拿到null的值进行返回(但是这里需要注意的是需要进行null值的判断,否则会报异常)

(4)缓存击穿

指的是缓存中没有数据,但是数据库中有数据(这里一般是一条数据的过期),当这条数据访问量大的时候,就会发生缓存击穿

解决方案:可以将这条数据设置过期时间为永久不过期

(5)缓存雪崩

指的是在高并发的情况下,在同一时间点,redis中的数据全部过期,全部去数据库中进行查询,造成雪崩

解决方案:①将redis中的数据的过期时间设置为永久都不过期

                  ②将存入redis中的数据的过期时间设置为随机的时间,这样可以保证数据过期的时间是不相同的

(6)缓存击穿和缓存雪崩的区别

            缓存击穿是指redis中的一条数据过期,前台访问的时候,只针对这一条数据的高并发访问情况

           缓存雪崩是指redis中的绝大多数数据都在失效,这时候前台页面高并发的访问这些数据