一、持久化
Redis 提供了两种主要的持久化机制来确保数据在服务器重启或崩溃后能够恢复:RDB(快照持久化)和 AOF(追加文件持久化)。这两种机制可以单独使用,也可以同时使用以提供额外的安全保障。
1、 RDB(Redis DataBase)快照持久化
RDB 持久化通过在指定的时间间隔内生成 Redis 数据集的快照来工作。快照以二进制格式存储在磁盘上,可以在 Redis 启动时被加载,从而恢复数据。
优缺点
- 优点:
- 简单高效:RDB 文件可以快速加载,适合用作数据备份。
- 性能影响小:由于是周期性快照,性能影响相对较小。
- 缺点:
- 数据丢失:在最后一次快照和崩溃之间的数据可能丢失。
- 恢复时间:在数据集较大的情况下,恢复可能比较慢。
2、AOF(Append-Only File)追加文件持久化
AOF 持久化记录对 Redis 数据集的所有写操作,并将这些操作以追加的形式写入到 AOF 文件中。文件记录了所有操作,可以用来恢复数据。
优缺点
- 优点:
- 数据完整性:AOF 提供了更高的数据安全性,因为所有写操作都被记录下来。
- 可配置性:可以选择不同的同步策略,以平衡性能和数据安全性。
- 缺点:
- 文件增长:AOF 文件会随着时间的推移而增长,可能会变得非常大。
- 恢复时间:恢复时间可能较长,因为需要重放所有写操作。
3、混合模式
Redis 允许同时启用 RDB 和 AOF 持久化机制。这样可以利用 RDB 快照的快速恢复能力和 AOF 的数据完整性保障
优缺点
- 优点:
- 高数据安全性:结合了两种持久化方式的优点,提供了更高的数据恢复能力。
- 灵活性:根据需要选择不同的恢复方式。
- 缺点:
- 性能开销:同时使用 RDB 和 AOF 可能会增加系统的性能开销。
- 配置复杂性:需要管理两种持久化方式的配置和性能调优。
二、使用中可能出现的问题
1、缓存穿透
定义:
缓存穿透指的是查询一个缓存中不存在的数据,且该数据在数据库中也不存在。这会导致每次请求都直接访问数据库,绕过缓存,从而对数据库造成压力。
原因:
(1) 请求的数据在缓存中不存在,而数据库中也没有这个数据。
(2)恶意攻击或无效查询导致的请求。
解决方案:
(1)布隆过滤器:在缓存层和数据库之间使用布隆过滤器来过滤掉那些肯定不存在的数据。
(2)缓存空值:对于查询结果为空的数据也进行缓存,设置较短的过期时间,避免重复查询数据库。
(3)查询合法性校验:确保请求的数据有效性,防止恶意或无效请求。
2、缓存击穿
定义:
缓存击穿指的是在缓存失效的瞬间,有大量请求并发地访问数据库,导致数据库压力骤增。这通常发生在缓存过期时间到达的瞬间。
原因:
(1)缓存中的数据在同一时间点过期。
(2)大量请求同时到来,导致对数据库的请求激增。
解决方案:
(1)互斥锁:在缓存过期时,通过锁机制防止多个请求同时查询数据库。一个请求查询数据库并更新缓存,其他请求等待更新完成后再从缓存中读取数据。
(2)延迟双删:删除缓存时,设置稍微延迟的删除策略,再次删除缓存,减少缓存击穿的风险。
(3)过期时间随机化:为缓存设置随机过期时间,避免大量缓存同时过期。
3、缓存雪崩
定义:
缓存雪崩指的是由于缓存服务器故障或大量缓存同时失效,导致大量请求直接访问数据库,数据库负载急剧增加,可能造成服务宕机。
原因:
(1)缓存服务器宕机或发生故障。
(2)缓存大规模过期,导致大量请求直接访问数据库。
解决方案:
(1)高可用架构:使用 Redis 集群或主从复制来增加缓存的高可用性。
(2)缓存预热:在系统启动时预加载缓存,减少缓存失效的影响。
(3)降级策略:在缓存不可用时,使用降级方案,比如返回默认数据或提示用户稍后再试。
(4)监控和报警:实时监控缓存服务的健康状况和性能指标,及时处理潜在的问题。