目录
incr/incrby/decr/decrby/incrbyfloat
hlen/hsetnx/hincrby/hincrbyfloat
sinter/sinterstore/sunion/sunionstore/sdiff/sdiffstore
常用的数据结构
Redis中常用的数据类型如下图所示:

每一种数据类型的编码实现方式也不同,不同的数据结构编码实现方式如下:
|--------|------------|
| 数据结构 | 内部编码 |
| string | raw |
| string | int |
| string | embstr |
| hash | hashtable |
| hash | ziplist |
| list | linkedlist |
| list | ziplist |
| set | hashtable |
| set | intset |
| zset | skiplist |
| zset | ziplist |
raw是最基本的字符串,底层持有一个char数组;当value就是一个整数的时候,redis会使用int来保存;embstr是针对短字符串进行的特殊优化。
hashtable为最基本的哈希表;ziplist为压缩列表,在哈希表元素较少的时候会使用,能够节省空间。
linkedlist为基本的链表;ziplist为压缩列表;redis 3.2之后,引入了新的实现方式quicklist,这个数据结构同时兼顾了linkedlist和ziplist的优点,将时间和空间效率都兼顾到。
skiplist为跳表。
查看编码方式可使用object encoding key指令。
string类型
Redis中的字符串,直接就是按照二进制数据的方式存储的,不会做任何的编码转换,存的是啥,取出来就是啥;Redis对于string类型,限制了大小最大是512M。
set
set命令语法如下:
set key value [expiration EX seconds | PX milliseconds] [NX|XX]
在设置时可以设置超时时间,NX表示如果key不存在,才设置,如果key存在,则不设置(返回nil);XX表示如果key存在,才设置(相当于更新key的value)并进行覆盖,原来key的ttl时间也会失效,如果key不存在,则不设置(返回nil)。
mget/mset
mset和mget可以一次性操作多个key和value,语法如下:
mget key [key ...]
mset key value [key value ...]
setnx/setex/psetex
setnx用来在设置key时同时设置了nx,不存在才能设置,存在则设置失败。setex用来指定key的超时时间,时间单位为秒,psetex的超时时间单位为微秒。
incr/incrby/decr/decrby/incrbyfloat
incr为针对value + 1,incrby针对value+n,decr针对vlaue-1,decrby针对value-n,incrbyfloat为针对value进行+/-一个小数,返回值为计算结果之后的值。
若操作的key不存在,就会把这个key的value当做0来使用。
append
append用来对字符串进行拼接,如果key已经存在并且是一个string,命令会将value追加到原有string的后面,如果key不存在,效果相当于set命令,append返回的长度为拼接字符串后的字节长度,append语法如下:
append key value
getrange/setrange
getrange可以返回key对应的string的子串,由start和end确定(左闭右闭)。可以使用负数表示倒数。-1代表倒数第一个字符串,-2代表倒数第二个,超过范围的偏移量或根据string的长度调整为正确的值。语法如下:
getrange key start end
该函数返回string类型的子串。
setrange用来修改字符串,语法如下:
setrange key offset value
offset为偏移量,代表开始进行替换的位置,返回替换后的字符串长度,
若setrange对一个不存在的key进行操作,就会在对应的位置凭空生成字节0x00,并将要替换的字符串追加到后面。
strlen
能获取到字符串长度,获取到的长度为字节。语法如下:
strlen key
返回字符串的长度,当key不存在时,返回0。
hash类型
Redis本身就是键值对,自身的键值对就是通过哈希的方式来组织的,不过,v将key这一层组织完了后,到了value这一层,还可以是哈希。
hset/hget/hexists/hdel
hset用来设置键值对,语法如下:
hset key field value [field value ...]
返回值为设置成功的键值对的个数。
value为字符串类型的数据。
hget用来获取hash中指定的字符串,语法如下:
hget key field
若对应的key或者field不存在,都会返回nil。
hexists用来判断hash中是否有指定的字段,语法如下:
hexists key field
hdel用来删除hash对应的field,语法如下:
hdel key field [field...]
返回值为成功删除的个数。
hkeys/hvals
hkeys可以用来对应的hash的所有字段。
hkeys key
hvals用来获取hash中所有的val,语法如下:
hvals key
在使用这个指令前,要保证对应的value为哈希类型。
hgetall/hmget
hgetall用来获取hash中所有的字段和对应的值,语法如下
hgetall key
hmget可以查询多个field,语法如下:
hmget key field1 [field ...]
查询结果中,多个value的顺序和field的顺序是匹配的。
hlen/hsetnx/hincrby/hincrbyfloat
hlen用来获取hash的元素个数,语法如下:
hlen key
hsetnx用于在对应的key不存在时设置成功,存在则设置失败,语法如下:
hsetnx key field value
返回值为1,表示设置成功;为0表示设置失败。
hincrby用于将hash中字段对应的数值添加指定的整数值。语法如下:
hincrby key field increment
hincrbyfloat用于将将hash中字段对应的数值添加指定的小数值。语法如下:
hincrbyfloat key field increment
hincrby和hincrbyfloat返回值都为对应字段变化之后的值。
内部编码
哈希的内部编码有两种,分别为ziplist和hashtable,当哈希类型元素个数较少时,会使用ziplist来表示,当元素个数较多时,会使用hashtable来表示;如果每个value的值长度比较短,使用ziplist来表示,如果某个value的长度太长了,也会转换成hashtable。
list类型
list用来存储多个有序的字符串,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、 获取指定索引下标的元素等。
lpush/lrange
lpush可以将一个或多个元素从头部插入,语法如下:
lpush key element [element ...]
若插入多个,则按照顺序头插,返回值为list的长度,如果key已经存在,并且key对应的value类型不是list,此时lpush就会报错。
lrange可以查看指定范围的元素。语法如下:
lrange key start stop
这个start和stop支持负数,如下所示:

前面的序号是是专门给结果集使用的序号,和list的下标无关。若区间不合法,会尽可能获取合法区间的元素,如下所示:

lpushx/rpush/rpushx
lpush为在key存在时,将一个或者多个元素从头插到list中,不存在则直接返回;rpush可以将一个或多个元素从尾部插入;rpush为在key存在时,将一个或者多个元素从尾部插到list中,不存在则直接返回。
lpop/rpop
lpop可以从list左侧取出元素,即头删,语法如下:
lpop key
rpop可以从list右侧取出元素,即尾删,语法如下:
rpop key
lindex/linsert/llen
lindex指令为获取指定下标的元素,如果下标非法,会返回空值,语法如下:
lindex key index
linsert可以在特定位置插入元素,语法如下:
linsert key <before | after> pivot element
返回值为插入之后得到的新list长度。pivot为具体的值,不是通过下标,若基准值存在多个,从左往右寻找,找到第一个符合基准值的位置即可。
llen指令为获取list的长度,语法如下:
llen key
lrem
lrem可以用来删除元素,语法如下:
lrem key count element
count为要删除的个数,element为要删除的值,count > 0时,从左往右去找并删除;count < 0 时,从右往左去找并删除;count = 0 时,删除所有的element元素。
ltrim/lset
ltrim保留指定范围内的元素,范围外的元素全部删除,语法如下:
ltrim key start stop
lset根据下标来修改元素,语法如下:
lset key index element
如果下标越界则会报错。
blpop/brpop
blpop和brpop为lpop和rpop的阻塞版本,redis中的list也相当于阻塞队列一样,线程安全是通过单线程模型支持的,redis中的阻塞只支持队列为空的情况,如果list中存在元素,blpop和brpop就和lpop和rpop作用完全相同;如果list为空,blpop和brpop就会根据阻塞时间产生阻塞,一直阻塞到队列不为空为止,期间redis也可以执行其他命令。
同时,blpop和brpop也可以同时去尝试获取多个key的列表的元素,多个key对应多个list,哪个list有元素了,就会返回哪个元素。
如果多个客户端对同一个key执行blpop或者brpop,则最先执行命令的客户端就会得到弹出的元素。
blpop和brpop语法如下:
[blpop | brpop] [key ... ] timeout
timeout为超时时间,单位为秒。
set类型
set集合类型就是将一些有关联的数据放到一起,集合中的元素是无序的,例如,1, 2, 3和2, 1, 3是一个集合。
sadd/smembers/sismember
sadd可以将一个或者多个元素添加到set中,注意,重复的元素无法添加到set中,语法如下 :
bash
sadd key member [member ...]
返回值类型为添加成功元素的个数。
smembers可以查看set集合中的元素,语法如下:
bash
smembers key
sismember用来判断一个元素是否在set中,语法如下:
bash
sismember key member
查找成功返回1,查找失败返回0。
spop/srandmember
spop用来删除元素,但这个是随机删除,语法如下:
bash
spop key [count]
count为要删除元素的个数,不指明默认删除1个。返回删除的元素。
srandmember可以随机获取set集合中的元素。语法如下:
bash
srandmember key [count]
smove/srem
smove指令可以将一个元素从set中取出来并放到目标set中,语法如下:
bash
smove source destination member
返回1说明移动成功,返回0说明移动失败。如果移动的元素在目标set中存在,则会按照先删除再插入的顺序执行;如果source中要移动的元素不存在,则移动失败,返回0。
srem用来将指定的元素从key中删除,语法如下:
bash
srem key member [member ...]
返回值代表删除元素的数据个数。
sinter/sinterstore/sunion/sunionstore/sdiff/sdiffstore
sinter用来求集合间的交集,语法如下:
bash
sinter key [key ...]
每个key都对应一个集合,返回值为最终交集的数据。
sinterstore用来将获取的交集保存到目标set中,语法如下:
bash
sinterstore destination key [key ...]
返回值为交集的元素个数。
同样地,sunion/sunionstore为对应的求并集操作,sdiff/sdiffstore为对应的求差集操作。
