- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)