redis数据结构----字符串
一. 字符串:使用 null 字符 '\0' 终止的一维字符数组
二. redis的字符串和平时使用的字符串有所不同,称为简单动态字符串(SDS,simple dynamic string)
redis 数据结构:
struct sds {
int len;
int free;
char buf[];
};
len字段:buf数组使用长度
free字段:buf数组未使用长度
buf字段:存储字符的数组
三. 字符串和简单动态字符串的区别
1. 获取长度
字符串:在每次获取长度时都需要遍历一次,时间复杂度为:O(n)
简单动态字符串:在结构中len字段已经记录了使用长度,时间复杂度为:O(1)
2. 简单动态字符串避免了缓冲区溢出
a. 什么叫缓冲区溢出
缓冲区:内存中存放数据的地方
缓冲区溢出:当计算机程序向缓冲区填充数据位数超过了缓冲区本身的容量,溢出的数据覆盖在了合法的数据上
字符串:不记录字符串长度,在拼接两个字符串时,需要先判断第一个字符串后面是否有足够的内存空间,如果不够了需要手动扩容
简单动态字符串:SDS空间分配政策完全杜绝了发生缓冲区溢出
3. 减少字符串带来的内存重分配次数
字符串:不记录字符串长度,每次增长或者缩短都要对字符串数组进行一次内存重分配操作,因为内存分配涉及复杂的算法,并且可能需要执行系统调用,所以是个比较耗时和耗能的操作,因为redis作为缓存,追求速度,所以不能经常发生内存重分配
简单动态字符串:SDS数组中记录了free长度
a. 空间预分配,用于优化SDS字符串增长操作
字符串长度大于free字段长度,拼接字符串时自动扩容,如果新字符串小于1M,则扩容为新字符串长度两倍(总长度 = 2 * 新len + 1),如果新字符串大于等于1M,则扩容为新字符串长度增加2M(总长度 = 新len + 1M + 1)
b. 惰性空间释放,用于优化SDS字符串缩短操作
当SDS的API要缩短SDS保存的字符串时,程序并不需要立即使用内存重分配策略来回收缩短之后多出来的字节,而是使用free属性来记录
4. 二进制安全
字符串:必须包含某种编码(如ASCII),并且除了字符串末尾之外字符串不能包含空字符串,否则最先被程序读入的空字符串将被误认为是字符串结尾
简单动态字符串:所有的SDS API都会以处理二进制的方式来处理存放在SDS buf中的数据,写入是什么样的,读取就是什么样的
5. 兼容部分c字符串函数,重用一部分<string.h>库
四. string存储
字符串类型是redis中最为基础的数据存储类型,它在redis中是二进制安全的,这便意味着该类型可以接收任意格式的数据,比如:图像数据,json数据。在redis中的字符串类型的value最多可以容纳的数据长度是512M.
五. 命令操作
1. set
set key "value" //通过set命令设置新值,并覆盖原有的值
2. get
get key //通过get命令获取该键的值,获取已过期的key将返回null
3. exists
exists key //判断该键是否存在,存在返回1,不存在返回0
4. append
append key "value" //该键不存在则创建key,存在则将内容追加,返回当前value的长度
5. strlen
strlen key //获取指定长度key的字符长度
6. incr
incr key //将key的值递增1,非整数时报错
7. decr
decr key //将key的值递减1,非整数时报错
8. del
del key //删除已有键
9. incrby
incrby key 5 //key原子性增加固定值
10. decrby
decrby key 5 //key原子性减少固定值
11. getset
getset key "value" //设置新值的同时,并返回原有值
12. setex
setex key 10 "value" //设置key的过期时间和值,秒为单位
13. ttl
ttl key //查看指定key的剩余存活时间,0表示已过期,-1表示永不过期
14. setnx
setnx key "value" //该键不存在则命令执行成功,存在则执行无效果,设置key和value
15. setrange
setrange key 3 test //替换该key的value,从第3个字节开始替换4个字节(替换字节和test长度有关),如果已经超过原有值的长度,会在末尾补0
16. getrange
getrange key 1 2 //截取该key的value,从第一个字节到第二个字节结束
17. setbit
setbit key 7 1 //设置从0开始的第七位bit值为1,返回原有的bit值
18. getbit
getbit key 6 //返回指定offset的bit值
19. mset
mset key1 "value1" key2 "value2" //批量设置多个key和值
20. mget
mget key1 key2 //批量获取多个key的值,不存在的key,返回null
21. msetx
msetx key1 "value1" key2 "value2" //批量设置多个键,如果键不存在则执行成功返回1,键存在执行失败返回0

浙公网安备 33010602011771号