您的位置:首页 > 数据库 > Redis

redis——string类型的设计与实现

2016-03-27 23:16 519 查看
Redis的string类型可以保存任何数据,包括图片、视频,是用二进制形式存储的

Redis String,无前缀,对于不存在的key都会创建指定的key

命令

效果

备注

set key value

设置对应的key和value

 set name lzj

get key

获取对应key的value

 get name

setnx key value

如果key已经存在,则不执行并返回0

set if not exists

setex key time value

设置键值对并且设置有效期,单位为s

 setex name 10 lzj

setrange index str

从指定下标开始替换字符(6则从第七个字符开始替换),

剩余的字符串不会被删除

 setrange name 0 L

把首字母大写

mset key1 value1 key2 value2

一次设置多个key的值,1√0×,会覆盖已经存在的key

mset name lzj sex man

mget key1 key2

一次获取多个key的值

 mget name sex

getset

设置key的值,返回key的旧值

 gettest name

getrange key start end

获取子字符串

 getrange name 0 2

incr key

对key的值做加加操作,并返回新的值

可以通过负数来实现减法

 incr age

incrby

添加指定的值 

 incrb key 2

decr decrby

 

 

append key value

给指定key的字符串追加value,返回新字符串值的长度

 append name zzzz

strlen key

取指定key的value值的长度

 strlen name

 

 

redis中string的实现

redis自己构建了一种名为简单动态字符串(SDS , simple dunamic string)的抽象类型
将其作为redis的默认字符串表示
例: 客户端设置字符串时
set name lzj
键值对的键是一个字符串对象,底层是保存着字符串"name"的SDS
键值对的值也是SDS,保存着"lzj"

SDS的定义

每个sds.h/sdshdr结构表示一个SDS值:
struct sdshdr {
  //记录buf数组已保存字符的个数
  int len;
  //标识buf数组中剩余的空间
  int free;
  //保存字符串的字节数组
  char buf[];
}



SDS遵循C字符串以空字符结尾的惯例,保存空字符('\0')的1字节空间不包含在len里面

SDS的空间分配规则:
1.如果SDS修改后len小于1MB,则free变为修改后的len长度
即原来len==5,修改后len==10,则修改后 SDS = len(10) + free(10) + 1

2.如果SDS修改后len>=1MB,则每次扩展1MB
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息