Redis设计与实现之SDS和RDB.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
? ? Redis设计与实现之SDS和RDB ? ? 1.数据结构与对象: ? ? ? Redis数据库里每个键值对都是由对象组成的,其中键总是一个字符串对象,值可以是字符串对象(String)、列表对象(List)、哈希对象(Hash)、集合对象(Set)、有序集合对象(ZSet)等对象的其中一种 ? ? ? Redis采用SDS(简单动态字符串)作为字符串类型进行存储,相较C字符串类型来说,其优点明显且突出如下: ? ? 1.常熟复杂度获取字符串长度: ?? ??? ?无需像C字符串一般对字符串进行遍历后才能获取字符串长度,它拥有自己的len区域,当需要获取字符串长度时只需读取该字符串len属性O(1)就可简洁方便的拿到字符串长度,无需如像C字符串一般将所有字符进行遍历O(n)后才能获取 ? ? 2.杜绝缓冲区溢出: ?? ??? ?很好的解决使用C字符串时产生的缓存区溢出问题,当需要进行字符拼接时,会先检查SDS的空间是否满足即将拼接字符串长度的大小,满足则拼接,如不满足就会自动扩展SDS的空间大小,使之能够装下拼接后的字符串,杜绝缓冲区溢出可能 ? ? 3.减少修改字符串时带来的内存重新分配的次数: ?? ?? ? Redis通过空间预分配策略,来减少连续执行字符串增长所需的内存分配次数 ?? ??? ??? ???空间预分配策略: ?? ??? ??? ??? ??? ?? ? 当修改后的SDS长度小于1MB时,程序则会给该对象分配Free=len的预分配空间 ?? ??? ??? ??? ??? ?? ? 当修改后的SDS长度大于1MB时,程序就会给该对象分配Free=1MB的预分配空间 ?? ?? ? ?Redis使用惰性空间释放来优化SDS的字符串缩短操作 ?? ??? ?? ? ? 惰性空间释放: ?? ??? ??? ??? ??? ?? ? 当需要缩短SDS保存的字符串时,程序并不会直接调用内存重新分配来将缩短空间回收,而是使用?? ??? ??? ??? ??? ??? ??? Free属性来记录这段缩短空间,以便将来增长SDS字符串时使用 ? ? 4.二进制保存、保证数据安全 ?? ?? ? Redis中以处理二进制的方式处理SDS键所对应的存放在Buf数组中的数据、程序不会对该数据做任何限制、过滤或假设等操作,而是将数据原样保存 ? ? 5.兼容部分C字符串函数 ? ?? 总结:C字符串和SDS的区别: ? ? 以下是针对SDS的相应操作说明及API: 1. 2. ? ? 2.Redis持久化机制之RDB和AOF ? ? ? 1.为什么需要持久化? ?? ??? ?? ? 因为Redis是一个内存数据库,它将数据库状态保存在内存中,如果不使用持久化机制,当进程退出时,数据库状态也随之消失,为了很好的保存数据库状态,我们需要持久化机制将数据库状态保存至磁盘中,从而避免数据意外丢失。 ?? ??? ??? ?? RDB持久化是将数据进行压缩,生成一个二进制压缩文件,该文件可以通过还原生成RDB文件时的数据库状态 ? ? 2.生成RDB文件 ? ? ?? ? 两种方式: ?? ??? ??? 1. save------该命令会阻塞Redis服务器进程,直到RDB文件生成完毕为止,期间服务器不能处理任何命令请求 ? ? ? ? ? ?2. bgsave---该命令则不会阻塞服务器进程,而是派生出一个子进程来生成RDB文件,主进程则继续处理其他命令请求 ?? ?3.数据载入 ?? ?? ? ?(1)因为AOF文件更新的频率远比RDB文件要高出很多,从而数据的完整性要比后者也相对要好,所以如果在服务器开启了AOF持久化功能的时候,在载入文件时,服务器会优先使用AOF文件来还原数据库状态 ?? ??? ??(2)只有在AOF处于关闭状态时(默认处于关闭),服务器才会使用RDB文件来还原数据库状态,这时RDB文件的载入是随着Redis服务器启动而自动载入的 ?? ??? ??? ? ? ? 注释: ?? ??? ?? ? 服务器在载入RDB文件期间都是出于阻塞状态的,直到RDB文件在完成 ?? ??? ?? ? 在执行bgsave命令期间,服务器是拒绝save和另一个bgsave命令的,服务器禁止save和bgsave命令同时执行,是为了避免主进程和子进程同时执行两个rdbSave函数调用,防止产生竞争关系 ?? ??? ?? ? 另外,bgrewriteaof和bgsave命令不能同时执行。如果 bgrewriteaof 先执行,服务器会拒绝bgsave命令;如果bgsave先执行时,服务器会等待bgsave执行完毕

文档评论(0)

科技之佳文库 + 关注
官方认证
内容提供者

科技赋能未来,创新改变生活!

版权声明书
用户编号:8131073104000017
认证主体重庆有云时代科技有限公司
IP属地重庆
统一社会信用代码/组织机构代码
9150010832176858X3

1亿VIP精品文档

相关文档