string类型的数据存储是最简单的key-value存储;通常用于缓存使用,也有部分场景用kv结构做原子计数器使用。
与其它键值存储提供的字符串非常相似,键(key)----值(value),字符串拥有一些基本的操作命令,如get set del decr incr等。
redis是用c语言写的,由于C语言并没有字符类型,只能使用指针或者数组的形式表示一个字符串,所以redis设计了一套字符串类型叫做简单动态字符串simple dynamic string。
结构主要包括三部分,int len,int free, char[] buf。len表示buf中字节数组长度,free表示还有多少字节可以用,buf存储字节数组,最后一个是终止字符"0",表示当前的内容
他和普通的c字符串相比有几个好处:
1、通过len可以0(1)复杂度获取字符串大小
通过len可以0(1)复杂度获取字符串大小,而普通的c字符串需要遍及数据直到空字符串,也叫终止字符串,时间复杂度是0(n)。所以strlen方法复杂度是0(1)。
2、可以以二进制的形式存储任意数据
普通的c字符串不能存储空格等特殊字符串,如果包含了终止字符,后续的字符就会截断,而sds存储用的是字节数组,并且有len来表示数据长度
3、sds的api是安全的,不会照成缓冲区溢出和内存泄漏
内存泄漏是在截断字符串的时候,如果内存没有手动释放,就会泄漏。sds的api自动帮我们做了内存释放和获取的操作,我们不需要关心。
4、sds可以减少内存分配的次数,从必定n次到最多n次
如果在concat的时候,会有两种内存分配策略,增加的时候有内存预分配策略;减少的时候先不释放,只是把free增加,这样如果下次操作是增加就可能不需要分配了。
预分配策略,先增加必须的内存,然后如果增加后的len大于等于1mB,那么free等于1MB;如果增加后len小于1MB,那么free等于len。
5 重用c语言<string.h>库的部分代码
字符串的常用命令
命令 | 用法 | 描述 |
---|---|---|
set | set key value | 设置指定key的值 |
get | get key | 获取指定key的值 |
del | del key | 删除指定的key |
127.0.0.1:6379> set key1 123456789
OK
127.0.0.1:6379> get key1
"123456789"
127.0.0.1:6379> del key1
(integer) 1
127.0.0.1:6379> get key1
(nil)
命令 | 用法 | 描述 |
---|---|---|
incr | incr key | 将key中存储的数字值加1 原子加 |
decr | decr key | 将key中存储的数字值减1 原子减 |
incrby | incrby key increment | 将 key 所储存的值加上给定的增量值(increment) |
decrby | decrby key increment | 将 key 所储存的值加上给定的增量值(increment) |
127.0.0.1:6379> incr key1
(integer) 1
127.0.0.1:6379> get key1
"1"
127.0.0.1:6379> decr key
(integer) -1
127.0.0.1:6379> get key
"-1"
127.0.0.1:6379> incrby key1 3
(integer) 4
127.0.0.1:6379> decrby key1 4
(integer) 0
127.0.0.1:6379> get key1
"0"
命令 | 用法 | 描述 |
---|---|---|
mget | mget key1[key2...] | 获取所有(一个或者多个)给定的值 |
mset | mset key value [key value...] | 同时设置一个或多个 key-value 对 |
127.0.0.1:6379> mset milk wahaha hello world date 20190518
OK
127.0.0.1:6379> mget milk hello date
wahaha
world
20190518