redis string
Contents
redis string
Redis 字符串数据类型的相关命令用于管理 redis 字符串值
template
|
|
|
|
INCR key 将key中储存的数字值增一。
内部编码
字符串 类型的 内部编码 有 3 种:
int: 8 个字节的 长整型。
embstr: 小于等于 39 个字节的字符串。
raw: 大于 39 个字节的字符串。
embstr
如果字符串对象保存的是一个字符串值,并且这个字符串值的长度小于等于44字节 (44这个值并不会一直保持不变,例如redis3.2版本之前是39) ,则使用embstr编码,embstr即embedded string,“嵌入式的字符串,将SDS结构体嵌入RedisObject对象中”,是专门用于保存短字符串的一种编码方式,与raw的差别在于,raw会调用两次内存分配函数来创建redisObject结构和sdshdr结构,而embstr编码则通过调用一次内存分配函数来分配一块连续的空间,空间内一次包含了redisObject和sdshdr两个结构。 embstr有以下好处:
embstr编码将创建字符串对象所需的内存分配次数从raw编码的两次降低为一次,内存释放函数也是从两次降低为一次。 因为embstr编码的字符串对象的所有数据都保存在一块连续的内存里面,所以这些编码的字符串对象比起raw编码的对象字符串,能够更好地利用缓存 (CPU缓存/缓存行) 带来的优势。 embstr的缺点:
如果字符串的长度增加需要重新分配内存时,sds需要重新分配空间,所以embstr编码的字符串对象实际上是只读的,redis没有为embstr编码的字符串对象编写任何相应的修改程序。当我们对embstr编码的字符串对象执行任何修改命令 (例如append) 时,程序会先将对象的编码从embstr转换成raw,然后再执行修改命令。
sds
Sds (Simple Dynamic String,简单动态字符串) 是 Redis 底层所使用的字符串表示, 几乎所有的 Redis 模块中都用了 sds 为什么redis string 要使用sds字符串? O(1)获取长度,c语言的字符串本身不记录长度,而是通过末尾的\0作为结束标志,而sds本身记录了字符串的长度所以获取直接变为O(1)的时间复杂度、同时,长度的维护操作由sds的本身api实现 防止缓冲区溢出bufferoverflow: 由于c不记录字符串长度,相邻字符串容易发生缓存溢出。sds在进行添加之前会检查长度是否足够,并且不足够会自动根据api扩容 减少字符串修改的内存分配次数: 使用动态扩容的机制,根据字符串的大小选择合适的header类型存储并且根据实际情况动态扩展。 使用空间预分配和惰性空间释放,其实就是在扩容的时候,根据大小额外扩容2倍或者1M的空间,方面字符串修改的时候进行伸缩 使用二进制保护,数据的读写不受特殊的限制,写入的时候什么样读取就是什么样 支持兼容部分的c字符串函数,可以减少部分API的开发
embstr vs sds
https://www.cnblogs.com/sunchong/p/11924295.html
SETNX
Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值, redis 2.6.12 之后 可以用 set key0 value0 NX 实现, 还能同时加过期时间.
|
|
Author -
LastMod 2018-11-06