前言
redis的读写速率非常之快,所以在实际使用中,redis经常用来存储缓存,减轻数据库的负担。在面试中被问的最多的缓存相关的问题也就是以上几个:
缓存穿透
缓存击穿
缓存雪崩
与数据库数据一致性问题
前三个其实已经是烂大街的问题了,第四个还算是有点水准的问题,也是值得深究的一个问题。
容我一个个慢慢道来,看完此文以后面试遇到这几个问题,必当横着走。
缓存穿透、击穿、雪崩
缓存穿透
什么是缓存穿透?
缓存穿透就是请求直接穿过了缓存,缓存没有了存在的意思:请求所查询的数据在数据库中并没有存在,那么正常情况下缓存中肯定也没有该数据。这就导致每次请求都会打到数据库上,数据库负担较大,遇到大量恶意的请求甚至会致使数据库宕机。
比如某个数据表的id是long类型,数据库中存储的id都是正整数。此时某个请求查询的数据 id = -1,数据库中必然没有此id的数据。
如何解决?
其实搞清楚缓存穿透的由来,就可以对症下药来解决:
过滤非法请求非法参数,如上所提的例子,参数明显是不合法的,可以先过滤,减少后端的负担。
设置value为null的缓存。比如查询一个 id = 13802881111 的数据,此请和id是合法的,但是数据库中并没有此数据。此时可以在redis中set一个key: id = 13802881111,value为null的缓存。下次该请求进来则可以直接在redis读取到该数据为null。需注意设置合理的缓存失效时间。