Redis五种数据结构之字符串String

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>库的部分代码


字符串的常用命令

命令用法描述
setset key value设置指定key的值
getget key获取指定key的值
deldel 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)
命令用法描述
incrincr key将key中存储的数字值加1 原子加
decrdecr key将key中存储的数字值减1 原子减
incrbyincrby key increment将 key 所储存的值加上给定的增量值(increment)
decrbydecrby 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"
命令用法描述
mgetmget key1[key2...]获取所有(一个或者多个)给定的值
msetmset 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

标签: Redis String 字符串

发表评论: