redis的持久化方式? AOF在持久化时的优化策略?

Redis提供了两种主要的持久化方式:RDB(Redis Database)和AOF(Append Only File)。

  1. RDB持久化

    • RDB是Redis默认的持久化方式,通过定期将内存中的数据生成一份数据快照(snapshot)保存到磁盘上。
    • Redis可以在满足特定条件时自动触发RDB持久化,例如设置save指令指定的条件(如每隔一段时间有特定数量的数据改变时)或者手动调用BGSAVE命令。
    • RDB文件是一个紧凑的二进制文件,适合用于备份和快速恢复整个数据库。
  2. AOF持久化

    • AOF持久化是通过记录每一次写操作的命令到AOF文件中,以此来实现数据的持久化。
    • 当Redis接收到写命令时,会将命令追加到AOF缓冲区,然后根据配置的appendfsync策略将其同步到磁盘:
      • appendfsync always:每次写入都会调用系统API同步到磁盘,这是最安全但最慢的方式。
      • appendfsync everysec:每秒同步一次,即使出现故障,最多只会丢失一秒的数据。
      • appendfsync no:完全依赖操作系统,由OS自行决定何时同步,这种方式风险较高,可能会在系统崩溃时丢失较多数据。

AOF持久化时的优化策略

  • AOF重写(Rewrite):

    • 随着操作的不断积累,AOF文件可能会变得非常大,为了减少文件大小和加快重启时的加载速度,Redis引入了AOF重写机制。
    • 重写时Redis会创建一个新的AOF文件,其中仅包含重建当前数据库状态所需的最小命令集,这样可以去除无效命令和合并重复命令,极大地减小文件体积。
    • Redis 4.0及更高版本中,AOF重写是一个后台操作,通常在一个子进程中完成,避免阻塞主线程。
  • 增量同步

    • 使用appendfsync everysec时,Redis会在后台异步地将缓冲区的内容刷到磁盘,尽量减少对Redis性能的影响。
  • AOF后台线程同步

    • Redis 5.0引入了可选的后台线程来协助完成同步工作,进一步降低同步对主进程的影响。
  • 混合持久化

    • Redis 4.0后支持混合持久化模式,在AOF重写时,新的AOF文件开头部分是RDB格式的数据,接着是增量的AOF日志,这样在重启时既可以快速加载RDB部分,又可以确保没有遗漏任何最近的写操作。

sort set的底层实现?

Redis的Sorted Set(也称为ZSet或zset)的底层实现结合了哈希表和跳跃表(Skip List)这两种数据结构来高效地支持按分数排序的集合操作。

  1. 哈希表 (dict):

    • 每个成员(member)对应一个键值对,存储在哈希表中,键是成员本身,值是一个指针,指向跳跃表中的节点。
  2. 跳跃表 (Skip List):

    • 跳跃表是一种随机化的数据结构,它允许在O(log N)时间内进行插入、删除和查找操作。
    • 在Sorted Set中,跳跃表的节点不仅包含成员值,还包含对应的分数(score)信息,并且节点是根据分数从低到高排序的。
    • 跳跃表的层级是随机生成的,每个节点都可以有多条向前的指针,使得查询过程可以“跳跃”过大量节点,从而提高查询效率。

此外,对于元素数量较少或元素长度较短的Sorted Set,Redis还会使用ziplist(压缩列表)作为更紧凑的内存存储结构,以节省空间。当满足一定条件(如元素数量不超过配置阈值,且ziplist内元素总大小未超过限制)时,会优先选择ziplist存储。不过,一旦这些条件不再满足,Sorted Set就会转换为使用dict和skiplist的组合结构。

最后编辑: kuteng  文档更新时间: 2024-04-02 09:53   作者:kuteng