- 0
- 0
- 约3.58千字
- 约 8页
- 2022-03-18 发布于浙江
- 举报
?
?
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执行完毕
您可能关注的文档
- Python语言程序设计-文件和数据格式化.docx
- Python语言程序设计基础.docx
- Python课程设计爬虫篇.docx
- QT学习1:设计可视化窗口的框架-Ui-Class.docx
- RBAC权限系统分析、设计与实现.docx
- Redis+Nginx+JVM+设计模式+Spring全家桶+Dubbo.docx
- Redis+Nginx+设计模式+Spring全家桶+Dubbo精选.docx
- Redis+Nginx+设计模式+Spring全家桶+Dubbo精选概述.docx
- redis-list类型的设计与实现.docx
- redis-string类型的设计与实现.docx
- 七年级语文上册期末模拟试卷1(解析版).docx
- 七年级语文上册期末模拟试卷1(原卷版).docx
- 七年级语文上册期末模拟试卷2(原卷版).docx
- 七年级语文上册期末模拟试卷2(解析版).docx
- 期末测试卷(二)(解析版)2024—2025学年七年级语文上册期末测试卷(全国版).docx
- 期末测试卷(三)(解析版)2024—2025学年七年级语文上册期末测试卷(全国版).docx
- 期末测试卷(二)(原卷版)2024—2025学年七年级语文上册期末测试卷(全国版).docx
- 期末测试卷(三)(原卷版)2024—2025学年七年级语文上册期末测试卷(全国版).docx
- 期末测试卷(一)(原卷版)2024—2025学年七年级语文上册期末测试卷(全国版).docx
- 期末测试卷(一)(解析版)2024—2025学年七年级语文上册期末测试卷(全国版).docx
原创力文档

文档评论(0)