深入探究Redis存储原理

电子说

1.3w人已加入

描述

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

Redis数据存储原理

** 存储结构如图:**

C语言

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

C语言

占的字节数:

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

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

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

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

内存清理方式:

  • 定期清理

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

C语言

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

  • 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性能影响低,二进制压缩文件体积小,数据恢复块;
    

    ** 缺点:**

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

    ** 过程如图:**

C语言* AOF快照方式

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

C语言

配置 含义 效率 数据安全
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

过程如图:

C语言

Redis重启恢复过程:

C语言

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

Redis可靠性保障

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

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

C语言

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

哨兵模式架构:

C语言

  • 集群模式

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

C语言

缺点:

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

C语言

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分