回答Redis 在使用中会遇到哪些坑?如何规避?

59 阅读2分钟

1、Redis通常是做缓存或分布式锁的

2、缓存穿透是指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到DB去查询,可能导致DB挂掉,这种情况大概率是遭到了攻击。

解决缓存穿透可以使用布隆过滤器。它是用于检索一个元素是否存在一个集合中,比如使用redisson实现布隆过滤器。

它的底层主要是先去初始化一个比较大的数组,里面存放的二进制0和1,在开始都是0,当一个key来了之后经过3次hash计算,模于数组长度找到数据的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一个key的存在,查找的过程也是一样的。

缺点是,布隆过滤器有可能产生一定的误判,我们一般设置一个误判率,大概不会超过5%,其实这个误判是必然存在的,要不就得增加数组的长度,5%以内的误判率一般的项目也能接受,不至于高并发下压倒数据库。

3、缓存击穿:给每一个key设置过期时间,当key过期的时候,恰好这段时间对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮。

解决缓存击穿可以使用互斥锁和逻辑过期。互斥锁可以保障强一致性,但性能差,逻辑过期(Redis设置缓存永不过期)可以保证高可用,性能优,不能保证数据绝对一致。

4、缓存雪崩:在同一个时间段大量的缓存key同时失效或Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

解决方案:给不同的Key的TTL添加随机值,利用Redis集群提高服务的可用性,给缓存业务添加降级限流策略,给业务添加多级缓存。