Featured image of post Redis 知识点

Redis 知识点

Redis 相关内容记录

Redis 是一个高性能的内存数据存储系统,广泛应用于缓存、消息队列、实时分析等领域。

1. 内存存储机制

Redis 的数据存储在内存中,这意味着数据访问速度非常快。然而,内存存储也带来了数据持久化的问题。

2. 数据结构

Redis 支持多种数据结构,每种都有其独特的实现和适用场景:

  • 字符串(String):Redis 的基本数据类型,支持动态字符串和原子操作,适用于存储简单键值对。
  • 哈希(Hash):由键值对组成的集合,内部使用哈希表实现,适合存储对象的多个字段。
  • 列表(List):有序的字符串集合,使用双向链表实现,适合在两端进行高效插入和删除操作。
  • 集合(Set):无序的唯一字符串集合,内部使用哈希表实现,支持高效的成员检查和集合运算。
  • 有序集合(Sorted Set):集合的扩展,每个成员关联一个分数,使用哈希表和跳表实现,支持有序操作。
  • 位图(Bitmap):通过位操作在字符串上实现,适用于存储大量的布尔值,非常节省内存。
  • HyperLogLog:一种概率数据结构,用于估计集合中唯一元素的数量,适用于大数据量的统计场景。
  • 地理空间索引(Geospatial Index):使用有序集合和 geohash 实现,支持高效的地理范围查询。

3. 内存管理

Redis 使用 slab 分配器管理内存,减少内存碎片并提高缓存局部性。数据淘汰策略如 LRU、TTL 和随机淘汰,帮助管理内存使用。

4. 持久化

Redis 提供了两种持久化机制:RDB(快照持久化)和 AOF(日志持久化),它们各自有不同的工作原理和适用场景。以下是对这两种机制的详细解析:

4.1. RDB (Redis Database Backup)

RDB 快照:定期将内存中的数据快照保存到磁盘,形成一个 RDB 文件。

  • 工作原理: RDB 通过 fork 一个子进程来生成数据快照,并将快照保存到磁盘。主进程在此期间继续处理请求,不会被阻塞。
  • 配置: 通过 save 指令配置快照策略,例如 save 900 1 表示在900秒内有1次修改时进行保存。
  • 性能考虑: 使用写时复制(Copy-On-Write)技术,避免内存复制开销,确保主进程性能不受影响。
  • 优缺点: 优点是文件紧凑,适合快速恢复;缺点是可能会丢失最近修改的数据。
4.2. AOF (Append Only File)

AOF 日志:记录每一个写操作,确保数据的持久化。

  • 工作原理: AOF 通过追加日志文件记录每一次写操作,恢复时重新执行这些操作。
  • 配置: 通过 appendfsync 选项控制同步频率,有 alwayseverysecno 三个可选值。
  • 文件重写: 定期重写 AOF 文件,生成只包含恢复数据所需最小操作的文件,减少文件大小。
  • 优缺点: 优点是数据安全性高,缺点是文件较大且恢复速度较慢。
4.3. RDB 与 AOF 的结合使用
  • 优先级: Redis 启动时优先加载 AOF 文件,若 AOF 文件不可用,则加载 RDB 文件。
  • 数据一致性: 两者独立进行,但 Redis 会自动处理潜在的一致性问题。
4.4. 持久化与性能
  • 影响: 过于频繁的持久化操作可能影响性能,需根据实际场景调整策略。
  • 优化: 可通过调整配置或优化硬件(如使用更快的磁盘)来缓解性能压力。

5. Redis 高可用架构设计

Redis 的高可用性架构设计旨在确保系统在故障发生时仍能继续提供服务,通常通过复制、监控和自动故障转移机制来实现。

5.1. 主从复制(Master-Slave Replication)
  • 基本原理
    • 主节点(Master)处理读写请求,从节点(Slave)复制主节点的数据。
    • 从节点可以提供读扩展和数据冗余。
  • 故障转移
    • 手动故障转移:手动将从节点升级为主节点。
    • 自动故障转移:结合 Sentinel 实现自动故障检测和转移。
  • 配置
    • slaveof 命令配置从节点。
    • replica-serve-stale-data 控制从节点在连接不上主节点时的行为。
5.2. Sentinel(监控与自动故障转移)
  • 功能
    • 监控 Redis 实例的状态(主从节点)。
    • 检测故障并自动进行故障转移。
    • 通知客户端主节点变更。
  • 配置
    • 配置 Sentinel 节点,指定监控的主节点和从节点。
    • 设置 quorum 决定多少 Sentinel 节点同意才能进行故障转移。
    • down-after-milliseconds 等参数调整故障检测的敏感度。
  • 工作流程
    • Sentinel 定期检查 Redis 实例的心跳。
    • 当主节点故障时, Sentinel 选举一个从节点升级为主节点。
    • 其他从节点重新配置指向新的主节点。
5.3. Redis Cluster(集群模式)
  • 高可用性
    • 自动分片,数据分布在多个节点。
    • 每个节点有多个副本(从节点),支持自动故障转移。
  • 数据分片
    • 数据根据键的哈希值分布到 16384 个槽中。
    • 每个槽由一个主节点负责,可配置多个从节点。
  • 故障转移
    • 当主节点故障时,集群自动选择一个从节点升级为主节点。
    • 客户端需支持集群模式,以处理槽的重新分配。
  • 配置与管理
    • 使用 redis-cli --cluster 命令进行集群的创建和管理。
    • 配置 cluster-node-timeout 等参数调整集群行为。

6.Redis 缓存击穿、缓存雪崩、缓存穿透

在高并发场景下,缓存系统(如 Redis)可能会遇到缓存击穿、缓存雪崩和缓存穿透等问题。这些问题会导致数据库压力骤增,甚至引发系统崩溃。

对比
问题 定义 原因 解决方案
缓存击穿 热点数据失效,大量请求直接访问数据库。 热点数据过期或缓存未命中。 加锁、永不过期、热点数据预热。
缓存雪崩 大量缓存数据同时失效,导致数据库压力骤增。 缓存数据设置相同过期时间或 Redis 宕机。 分散过期时间、多级缓存、高可用架构、限流与降级。
缓存穿透 查询不存在的数据,缓存和数据库均未命中,导致每次请求都访问数据库。 恶意请求或非法查询。 缓存空值、布隆过滤器、参数校验。
最佳实践
  1. 合理设置缓存过期时间
    • 避免缓存集中失效,设置随机过期时间。
  2. 监控与报警
    • 实时监控缓存命中率和数据库查询量,及时发现异常。
  3. 限流与降级
    • 在缓存失效时,通过限流和降级保护数据库。
  4. 数据预热
    • 提前加载热点数据到缓存中,避免冷启动问题。
  5. 使用布隆过滤器
    • 对于可能不存在的数据,使用布隆过滤器减少无效查询。
使用 Hugo 构建
主题 StackJimmy 设计