Redis知识点总结

2,919 阅读5分钟

Redis

数据类型

String

  • SDS

    • embstr

      • <=44byte
    • raw

      • 44byte

    • int

      • =8byte
  • 每次扩容1倍

  • 超过1M时每次扩容1M

List

  • quicklist
  • ziplist

Hash

  • hashtable

  • ziplist

    • filed个数不超过512

      hash-max-ziplist-entries

    • value不大于64字节

      hash-max-ziplist-value

    • 遍历肯能差点,但是filed少的情况下问题不大

Set

  • hashtable

  • inset

    • 只能存int

zset

  • skiplist
  • ziplist

集群(Cluster)

集群实现

  • 哈希槽 16384

    • CRC16算法
  • hashtag

容错

  • master

    • 存储数据
    • 节点状态
    • solts和node的对应关系
    • node id 不变
    • 自动识别ip和port的变化
    • Gossip 协议
  • save

  • 节点失效检测

  • 从节点选举

  • 弱一致性

分布式

  • 线性拓展

  • 数据弱一致性

    • master和save异步复制
    • 网络分区
  • 可用性

    • replicas migration提高可用性

哨兵(Sentinel)

功能

  • 监控
  • 提醒
  • 故障转移

主观下线SDOWN

Sentinel 实例对服务器做出的下线判断。

如果一个服务器没有在 master-down-after-milliseconds 选项所指定的时间内, 对向它发送 PING 命令的 Sentinel 返回一个有效回复(valid reply), 那么 Sentinel 就会将这个服务器标记为主观下线。

客观下线ODOWN

指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。

  • 只适用于主服务器

自动发现

和master建立两个连接__sentinel__:hello订阅频道

  • 每10s会向master和save发送INFO命令,主要用于发现save和其他的sentinel

    通过master发现save,和监控master的其他sentinel。

  • 每2s向master和save的__sentinel__:hello发送自己的信息,主要用于发现新加入的sentinel

  • 每1s向master、slave以及其他Sentinel发送PING命令

故障转移

  • 发现master主观下线

  • 发送is-master-down-by-addr命令判断是否客观下线

  • 领头哨兵选取

    • Raft算法

      • 领导选取

        • Leader

        • Follower

          • 随机超时时间
        • Canidate

          • 随机超时时间短的将发起投票
          • 票数一样,触发重新选举
      • 日志复制

        • 心跳
      • 安全性

        • 拥有最新的log entry的follwer才有资格成为leader
      • 日志压缩

  • 故障恢复

    • 标记为主观下线、已断线、或者最后一次回复 PING 命令的时间大于五秒钟的save服务器都会被淘汰
    • 与失效master服务器连接断开的时长超过 down-after 选项指定的时长十倍的从服务器都会被淘汰
    • 选出复制偏移量最大的作为master
    • 复制偏移量相同,选择runid小的

持久化

持久化方式

  • RDB

    • 触发原理

      • 命令触发

        • save

        • bgsave

          • fork子进程处理

            主进程和子进程共享内存快照,主进程可写,子进程只读。

          • copy-on-write

      • 配置触发

        • save m n

          m秒内有n个键发生变化执行快照

      • 主从同步,全量触发

      • FLUSHALL

        清空数据库

      • shutdown

      • 故障恢复

    • 优缺点

      • 优点

        • 数据为二进制,紧凑
        • 故障恢复快
      • 缺点

        • fork进程需要复制数据,大数据集耗时比较长
        • 可能导致数据丢失
  • AOF

    • 触发原理

      • 1.追加写入

        写到内核缓冲区 AOF_BUF

      • 2.刷新到磁盘

        • no

          不使用fsync,交给内核刷新

        • always

          每次都使用fsync函数刷新

        • everysec

      • 3.重写AOF

        主进程fork子进程 子进程进行AOF日志重写 新命令写到临时缓冲区 AOF日志重写完成后替代就旧的AOF日志 追加临时缓冲区日志到AOF文件

        • fork子进程
        • copy-on-write
    • 优缺点

      • 优点

        • 数据安全性高
      • 缺点

        • fsync函数可能比较慢
  • 混合持久化

  • 持久化方案选择

    • master关闭持久化

      fork函数复制内存数据比较耗费CPU性能,影响Redis命令的读写。

    • save开始RDB持久化

      AOF的fsync函数实际上也是比较耗费性能的。

    • master关闭自动重启

    • 可以容忍短暂的数据不一致

持久化相关命令

  • CONFIG GET

    • dbfilename
    持久化文件名
    
    • dir

      持久化文件目录

    • logfile

      日志目录

  • info Persistence

    持久化信息

内存回收

LRU算法

  • 淘汰策略

    • allkeys

      • lru
      • random
    • volatile

      • lru
      • random
      • ttl
    • noeviction

过期淘汰策略

  • 惰性删除
  • 定时删除
  • 定期删除

分布式锁

主从复制

复制原理

  • 1.连接建立

    通过saveof ip port和mater建立连接 save向master发送ping命令,检查master是否可用,如果可用返回pong。否则,重试。

  • 2.数据同步

    • 全量复制
    • 增量复制
  • 3.命令传播

    save每秒向master汇报复制偏移量,master对比复制偏移量向save同步。

核心概念

  • replication id
  • psync命令
  • 复制的积压缓冲区
  • 复制偏移量

如何处理过期的key

  • save不处理过期key

什么情况下会进行全量复制

  • 初次进行复制
  • svave的复制偏移量已经不在master的积压缓冲区内
  • 发生故障转移后,replication id不同

存储优化

保持key的长度统一可以有效的减少内存碎片

ziplist比hashtable更省内存,value尽量不要大于64

大量的字符串可以使用压缩算法,使用字节存储

在允许一定的hash冲突的情况下,可以使用hash算法计算key

不要使用append,直接用set替换掉原来的