Redis基础——剖析基础数据结构及其操纵
发布时间:2021-06-04 16:28:00 所属栏目:大数据 来源:互联网
导读:1. 数据类型 其基础数据类型有String、List、Hash、Set、Sorted Set,这些都是常用的基础数据类型,可以看到非常丰富,几乎能够满足大部分的需求了。其实还有一些高级数据结构,我们在这章里暂时先不提,只聊基础的数据结构。 2. String String可以说是最基
|
1. 数据类型
其基础数据类型有String、List、Hash、Set、Sorted Set,这些都是常用的基础数据类型,可以看到非常丰富,几乎能够满足大部分的需求了。其实还有一些高级数据结构,我们在这章里暂时先不提,只聊基础的数据结构。
2. String
String可以说是最基础的数据结构了, 用法上可以直接和Java中的String挂钩,你可以把String类型用于存储某个标志位,某个计数器,甚至狠一点,序列化之后的JSON字符串都行,其单个key限制为512M。其常见的命令为get、set、incr、decr 、mget。
2.1 使用
get 获取某个key,如果key不存在会返回空指针
set 给key赋值,将key设置为指定的值,如果该key之前已经有值了,那么将被新的值给覆盖
incr 给当前的key的值+1,如果key不存在则会先给key调用set赋值为0,再调用incr。当然如果该key的类型不能做加法运算,例如字符串,就会抛出错误
decr 给当前key的值-1,其余的同上
mget 同get,只是一次性返回多条数据,不存在的key将会返回空指针
string相关命令
可能大多数的人只是到用一用的地步,这也无可厚非,但是如果是作为一个对技术有追求的开发,或者说你有想近大厂的想法,一定要有刨根问底的精神。只有当你真正知道一个东西的底层原理时,你遇到问题时才能提供给你更多的思路去解决问题。接下来我们就来聊一下Redis中String底层是如何实现的。
2.2 原理
2.2.1 结构
我们知道Redis是用C语言写的,但是Redis却没有直接使用,而是自己实现了一个叫SDS(Simple Dynamic String)的结构来实现字符串,结构如下。
struct sdshdr {
// 记录buf中已使用的字节数量
int len;
// 记录buf中未使用的字节数量
int free;
// 字节数组,用于保存字符串
char buf[];
}
2.2.2 优点
为什么Redis要自己实现SDS而不是直接用C的字符串呢?主要是因为以下几点。
减少获取字符串长度开销 C语言中获取字符串的长度需要遍历整个字符串,直到遇到结束标志位 ,时间复杂度为O(n),而SDS直接维护了长度的变量,取长度的时间复杂度为O(1)
避免缓冲区溢出 C语言中如果往一个字节数组中塞入超过其容量的字节,那么就会造成缓冲区溢出,而SDS通过维护free变量解决了这个问题。向buf数组中写入数据时,会先判断剩余的空间是否足够塞入新数据,如果不够,SDS就会重新分配缓冲区,加大之前的缓冲区。且加大的长度等于新增的数据的长度
空间预分配&空间惰性释放 C语言中,每次修改字符串都会重新分配内存空间,如果对字符串修改了n次,那么必然会出现n次内存重新分配。而SDS由于冗余了一部分空间,优化了这个问题,将必然重新分配n次变为最多分配n次,而数据从buf中移除的时候,空闲出来的内存也不会马上被回收,防止新写入数据而造成内存重新分配
保证二进制安全 C语言中,字符串遇到 会被截断,而SDS不会因为数据中出现了 而截断字符串,换句话说,不会因为一些特殊的字符影响实际的运算结果
![]() (编辑:伊春站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

