Redis(Remote Dictionary Server)的使用(1) | 青训营笔记

106 阅读3分钟

Redis(Remote Dictionary Server)的使用(1) | 青训营笔记

这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天 ✌

1. Redis简单回顾

在前面的课程中学到,Redis是一个键值对型存储的数据存储系统,其同时实现了基于内存存储以及磁盘可持久化的日志型存储数据库,使用C语言编写,被广泛用于数据库、缓存以及消息中间件。支持string、hash、List、Set等多种数据类型的存储,适用于不同应用场景,支持事务、LUA 脚本以及多种集群方案等。

2. Redis常见存储问题

(1) 缓存穿透:

对于缓存和数据库中都没有的数据请求,其首先在缓存中进行分层查询,如果未找到则进行数据库查询,所有的请求最终都将落在数据库上,造成数据库短时间内超负荷导致宕机问题。

解决思路:

  • 设置过滤器: 布隆过滤器——将查询的参数都存储到一个 bitmap 中,在查询缓存前,如果 bitmap 存在则进行底层缓存的数据查询,如果不存在则进行拦截,不再进行缓存的数据查询

  • 空对象缓存: 对于数据库查询为空的数据,仍然将其进行缓存并设置有效时间,一定时间内如果未访问则将被替换更新,如果多次访问则有效时间延长,以避免造成数据库的直接多次访问。

(2) 缓存雪崩: 在Redis存储机制中,缓存会在一定时间后自动失效,如果缓存在同一时间内大面积失效,此时同缓存穿透一样,所有的请求都直接落到数据库上,数据库此时极有可能由于过载而宕机。

解决思路:

  • 在缓存失效期间,控制读数据库写缓存的线程数(可通过常规的加互斥锁或者消息队列来控制)
  • 设置二级缓存或双缓存策略
  • 优化缓存更新以及失效的时间,降低缓存失效时间的重复率
  • 预先Reload机制,在缓存雪崩之前,在即将发生高并发访问前手动更新缓存

(3) 缓存击穿: 通常而言,在数据的缓存时间到期之后会被替换而失效,此时对于缓存中没有的数据请求最终会落到数据库中,同样也存在数据库超负荷问题。

解决思路:

  • 加互斥锁控制更新,保证同一进程中同一个数据的请求不会在数据库中并发进行,减少数据库压力
  • 对于经常访问到的热点数据,设置其有效时间为“永久”,降低系统缓存击穿的概率
  • 对数据请求随机选择性应答,设置请求线程在访问失效时随机sleep很短的时间退避,之后再次查询更新的缓存