求字符串场庋的C语言,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语言库的部分代码

字符串的常用命令命令用法描述setset key value设置指定key的值

getget key获取指定key的值

deldel key删除指定的key127.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值