(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中的绝大多数数据都在失效,这时候前台页面高并发的访问这些数据