Redis数据类型之SDS简单动态字符串
一,简单的动态字符串
1,Redis自己构建了一种名为简单动态字符串的抽象类型,并将SDS用作Redis的默认字符串表示,
2,在redis的数据库里面,包含字符串值的键值对在底层都是由SDS实现的
举个栗子:set msg "hello word"
(1)键值对的键是一个字符串对象,对象的底层是一个保存字符串msg的SDS
(2)键值对的值也是一个字符串对象,对象的底层是个保存字符串"hello word"的SDS
3,SDS的定义
(1) SDS遵循C字符串以空字符串结尾的规则(空字符串不计入长度)
4,SDS与C字符的区别
(1)常数复杂度获取字符的长度
SDS:在SDS中len属性记录了该字符串的长度,它的时间复杂度为O(1)
C字符:需要程序遍历整个字符串,它的时间复杂度为O(N)
(2)杜绝缓冲区溢出
C:将一个字符串拼接到另一个字符串后面时,当分配的内存不够时,就会产生缓冲区溢出,
SDS:当需要对SDS修改时,会先检查当前空间是否满足修改所需要的空间,不满足会自动扩展空间
(3)减少修改字符串时带来的内存重分配次数
C:每一次的修改都会对这个字符串的组进行一次内存重分配操作,而且很容易产生内存泄漏和缓冲区溢出
SDS:在SDS中主要有两种优化策略
□空间预分配
当对一个SDS字符串进行修改时,程序就会为SDS分配额外的未使用空间
公式:当SDS的长度小于1MB时就会多分配出1MB ,2MB时就是多分配2MB
□惰性空间释放
这个只针对于对SDS字符串缩短时操作,当字符串缩短时,程序不立即使用内存重分配,而是将这个字节记录起来,并等待将来使用
(4)二进制安全
C:它的字符串必须符合某种编码格式,并除字符串末尾外,字符串不能包含空字符,如果包含空字符,就会被误认为字符串结尾
SDS:它并不是用结尾是空字符串来代表字符串结尾,而是通过length来表示是否是结尾
(5)兼容部分C字符串函数
Redis数据类型之SDS简单动态字符串的更多相关文章
- 图解Redis之数据结构篇——简单动态字符串SDS
图解Redis之数据结构篇--简单动态字符串SDS 前言 相信用过Redis的人都知道,Redis提供了一个逻辑上的对象系统构建了一个键值对数据库以供客户端用户使用.这个对象系统包括字符串对象 ...
- 小白的Redis学习(一)-SDS简单动态字符串
本文为读<Redis设计与实现>的记录.该书以Redis2.9讲解Redis相关内容.请注意版本差异. Redis使用C语言实现,他对C语言中的char类型数据进行封装,构建了一种简单动态 ...
- 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等
redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...
- redis 学习笔记二 (简单动态字符串)
redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; char data[0]; }; 这是个广泛使用的常见技巧,常用来 ...
- 1.redis设计与实现--简单动态字符串
1.redis没有使用c语言的字符串表示,而是使用更加适合自己的SDS(simple dynamic string),简单动态字符串,结构如下: 2.sys与c字符串的对比: 3.总结: redis采 ...
- 关于redis中SDS简单动态字符串
1.SDS 定义 在C语言中,字符串是以’\0’字符结尾(NULL结束符)的字符数组来存储的,通常表达为字符指针的形式(char *).它不允许字节0出现在字符串中间,因此,它不能用来存储任意的二进制 ...
- sds(简单动态字符串) 内存预分配优化策略
* 1024 , 也就是说. 当大小小于 1MB 的字符串运行追加操作时,sdsMakeRoomFor 就为它们分配多于所需大小一倍的空间: 当字符串的大小大于 1MB . 那么 sdsMakeRoo ...
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
- Redis—简单动态字符串(SDS)
目录 Redis-简单动态字符串(SDS) SDS的定义 SDS与C字符串的区别 1. 常数复杂度获取字符串长度: 2. 杜绝缓冲区溢出: 3. 减少修改字符串时带来的内存重分配次数 4. 二进制安全 ...
随机推荐
- 2018.09.24 bzoj4977: [[Lydsy1708月赛]跳伞求生(贪心+线段树)
传送门 线段树好题. 这题一看我就想贪心. 先把a,b数组排序. 然后我们选择a数组中最大的b个数(不足b个就选a个数),分别贪心出在b数组中可以获得的最大贡献. 这时可以用线段树优化. 然后交上去只 ...
- 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)
[描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...
- 2018.08.17 洛谷P3110 [USACO14DEC]驮运(最短路)
传送门 一道sb最短路,从两个起点和终点跑一边最短路之后直接枚举两人的汇合点求最小值就行了. 代码: #include<bits/stdc++.h> #define N 40005 #de ...
- b3_trcd_EDCD_new
# -*- coding:utf-8 -*- import re year="17A" ss='./data/' filename = ss+'EDCD%s.txt'%year ' ...
- linux信号量(转载)
本文转载自http://blog.csdn.net/qinxiongxu/article/details/7830537 信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只 ...
- java web 通过前台输入的数据(name-value)保存到后台 xml文件中
一:项目需求,前端有一个页面,页面中可以手动输入一些参数数据,通过点击前端的按钮,使输入的数据保存到后台生成的.xml文件中 二:我在前端使用的是easyui的propertygrid,这个能通过da ...
- A Good Story for Great Friends
There once was a little girl who had a bad temper. Her mother gave her a bag of nails and told her t ...
- BMDThread控件动态创建多线程示例
http://www.cnblogs.com/railgunman/archive/2010/12/08/1900688.html BMDThread控件是一套相当成熟的线程控件,使用它可以让你快速的 ...
- C# 获取相对路径(绝对路径转相对路径)
这个的方法有很多吧. 1. 用PInvok调用Windows API的PathRelativePathTo 2. 自行处理字符串 3. 利用Uri 前两种就不说了,觉得有点麻烦,想了解的同学,自已,百 ...
- Git提取两次提交的差异文件
1. 创建清单文件 获取两次提交之间的文件差异,并将文件清单保存到diff.txt文件中 Git diff --name-only 173d3010 18586360 > diff.txt 2. ...