暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis存储原理深入剖析

老李说架构之道 2021-06-27
1828

Redis是用C语言开发的一个开源的高性能键值对(key-value)内存数据库。

Redis数据存储原理

      存储结构如图:

redisDB、dict、dictht、dictEntry、RedisObject的存储结构关系如图:

占的字节数:

dictEntry :16字节、RedisObject:12字节、sds:8字节 + 字符串长度

我们现在思考,如果一个10字节的key,需要多少存储空间呢?

  16+12+8+10+1=47*2(exprires也需要同样的空间所以乘以倍数)

结论:在key设置的时候尽量的少的字节,避免空间的浪费;


内存清理方式:

  • 定期清理

           随机取样的方式,如果清理的比例大于25%,继续。如下图:


  • 惰性删除:被动删除策略,访问时判断;

  • LFU

  •     volatile-lfu:对有过期时间的key采用LFU淘汰算法;

        allkeys-lfu:对全部key采用LFU淘汰算法;

  •  LRU 

  •     volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放;

        allkeys-lru:从数据集中选择最近最久未使用的数据释放;


Redis数据固化方式

  • RDB快照方式

            手动方式:

                    save:阻塞当前Redis服务器,直到RDB过程完成为止;

            自动方式:

                     bgsave:fork子进程,持久化过程由子进程负责,完成后自动结束;

            配置项:save m n,m秒存在n次写入,触发bgsave  ;

    优点:

             对Redis性能影响低,二进制压缩文件体积小,数据恢复块;

     缺点:

            有数据丢失可能,备份文件版本兼容问题;

    过程如图:



    • AOF快照方式

                    append only file,日志形式记录写入指令,实时持久化;

      命令写入过程:


配置含义效率数据安全
appendfsync=always每次同步全最高,最多丢失一个写入的数据
appendfsync=everysec每秒同步安全最折中,最多丢失1S的数据
appendfsync=no关 闭 安全最低,最多上一次保存AOF文件到当前时刻的全部数据
  • AOF文件重写

    • fork子进程不影响父进程处理请求

    • 子进程双写,确保数据不丢失

    • 手动触发:调用bgrewriteaof命令

    • 被动触发:

      •  auto-aof-rewrite-min-size

      •  auto-aof-rewrite-percentage

      •  aof_current_size

      • aof_base_size

过程如图:


Redis重启恢复过程:


注意:重启的过程中需要注意:如果开启RDB模型,未开启AOF模式,而在重启的时候开启AOF模式,这是RDB的数据就会覆盖掉。


Redis可靠性保障

  • 主从模式

        启动时,全量同步Slave。增量同步,运行ID(Master启动时生成),同步给Slave,通过复制偏移量确定具体同步位置;

具体同步过程如下图所示:

  • 哨兵模式

            不断地检查Master和Slave是否运作正常,发现故障通知管理员和客户端,自动主从切换,更新配置信息,客户端应用初始化时连接Sentinel获取节点信息;

哨兵模式架构:


  • 集群模式

  •       无需Sentinel哨兵,支持水平扩容,自动迁移。

    缺点:

        不支持批量操作,客户端路由,两次交互,存在性能问题,如图


文章转载自老李说架构之道,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论