在redis比较流行的时代,redis的使用也面临着一些问题,今天就来简单讲下关于redis使用中会遇到的问题以及解决措施。
    缓存雪崩:假设redis的key的失效时间都是1个小时,在一个小时以后所有的key全部失效,但是此时有大量的用户涌入,就会导致所有用户的请求全部落在数据库中,导致数据库因压力过大而宕机,这就是缓存雪崩,缓存雪崩的特点就是访问量大,失效的key多,且落点不在redis中。
    缓存穿透:就是数据库中没有某个数据这时候redis中肯定也不会存储,而此时如果用户一直在调用这个key值就会还是落在数据库中,如果是恶意攻击就会连续发起这样的请求导致数据库宕机。
    缓存击穿:有点类似于缓存雪崩,但是缓存穿透是对某个热点数据而言,在某个时刻这个热点数据失效了,而此时并发较高就会导致所有的用户请求落点到数据库,redis此时失去了他的作用。
解决方案:
(1)针对缓存雪崩现象可以设置数据的key的过期时间随机,同时也可以设置热点数据永不过期。
(2)针对缓存穿透有主流的两种解决方案:
    【1】为数据库中没有的数据在redis中设置null值或者其他符合业务逻辑的值,此种方式的缺点就是当这个值更新时会导致数据更新不及时,同时如果是恶意攻击攻击者可能会采取多种数据库中不存在的数据不断的对数据库发起请求。
    【2】使用布隆过滤器,这里可以采用redis中的setbit和getbit实现布隆过滤器,用于数据的提前判断,布隆过滤器会在后边的文章中介绍。
(3)关于缓存击穿的解决方案就是采用锁(分布式系统中使用分布式锁)的形式,当多个用户发起请求的时候可以如果redis中不存在可以对key进行上锁,保证只有一个用户取请求数据库,当该用户请求完成后将数据更新到redis中,没拿到所得用户当拿到锁后判断redis中有无数据,直接从redis中进行读取。