1. 字符串命令介绍
序号 | 命令及描述 |
---|---|
1 | SET key value:设置指定 key 的值 |
2 | GET key: 获取指定 key 的值。 |
3 | GETRANGE key start end: 返回 key 中字符串值的子字符 |
4 | GETSET key value:将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 |
5 | GETBIT key offset:对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 |
6 | MGET key1 [key2..]:获取所有(一个或多个)给定 key 的值。 |
7 | SETBIT key offset value:对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 |
8 | SETEX key seconds value:将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 |
9 | SETNX key value:只有在 key 不存在时设置 key 的值。 |
10 | SETRANGE key offset value:用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 |
11 | STRLEN key:返回 key 所储存的字符串值的长度。 |
12 | MSET key value [key value …]:同时设置一个或多个 key-value 对。 |
13 | MSETNX key value [key value …]:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。 |
14 | PSETEX key milliseconds value:这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。 |
15 | INCR key:将 key 中储存的数字值增一。 |
16 | INCRBY key increment将 key: 所储存的值加上给定的增量值(increment) 。 |
17 | INCRBYFLOAT key increment:将 key 所储存的值加上给定的浮点增量值(increment) 。 |
18 | DECR key:将 key 中储存的数字值减一。 |
19 | DECRBY key decrementkey: 所储存的值减去给定的减量值(decrement) 。 |
20 | APPEND key value:如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。 |
2. 字符串命令的实现
字符串命令底层数据结构为 简单动态字符串SDS 。对于字符串命令,无论是命令本身还是参数,都是作为成一个对象对待的。关于redis的对象系统,请参考文章:redis对象系统源码剖析和注释。
在redis的对象系统中,字符串对象的底层实现类型有如下三种:
编码—encoding | 对象—ptr |
---|---|
OBJ_ENCODING_RAW | 简单动态字符串实现的字符串对象 |
OBJ_ENCODING_INT | 整数值实现的字符串对象 |
OBJ_ENCODING_EMBSTR | embstr编码的简单动态字符串实现的字符串对象 |
因此,一个字符串对象的结构定义如下:123456789101112typedef struct redisObject { //对象的数据类型,字符串对象应该为 OBJ_STRING unsigned type:4; //对象的编码类型,分别为OBJ_STRING、OBJ_ENCODING_INT或OBJ_ENCODING_EMBSTR unsigned encoding:4; //暂且不关心该成员 unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */ //引用计数 int refcount; //指向底层数据实现的指针 void *ptr;} robj;
我们假设一个key的值为”Hello World” ,因此它的空间结构如图所示:
[url01]
3. 字符串命令源码注释
这里列出几个重要的命令。
3.1 SET 一类命令的最底层实现
|
|
3.2 GET 一类命令的最底层实现
|
|
3.3 DECR 和 INCR 底层实现
|
|
.4 APPEND 实现
|
|