字符串对象的编码可以是int
、raw
或者embstr
如果字符串对象保存的是整数值,并且这个整数值可以用long
类型来表示,那么字符串对象会将整数值保存在字符串对象结构的ptr
属性里面,并将字符串对象的编码设置为int
。
如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于32字节,那么字符串对象将使用一个简单动态字符串(SDS
)来保存这个字符串值,并将对象的编码设置为raw
如果字符串对象保存的是一个字符串值,并且这个字符串值的长度小于等于32字节,那么字符串对象将使用embstr
编码的方式来保存这个字符串值。
embstr
编码是专门用于保存短字符串的一种优化编码方式,这种编码和raw
编码一样,都是用redisObject
结构和sdshdr
结构来表示字符串对象,但raw
编码会调用两次内存分配函数来分别创建redisObject
结构和sdshdr
结构,而embstr
编码则通过调用一次内存分配一块连续的空间,空间中依次包含redisObject
和sdshdr
两个结构。
embstr
编码的字符串对象在执行命令时,产生的效果和raw
编码的字符串对象执行命令时产生的效果是相同的,优点如下:
-
embstr
编码将创建字符串对象所需的内存分配次数从raw
编码的两次降低为一次。 - 释放
embstr
编码的字符串对象只需要调用一次内存释放函数,而释放raw
编码的字符串对象需要调用两次内存释放函数。 -
embstr
编码的字符串对象的所有数据都保存在一块连续的内存里面,所以这种编码的字符串对象比起raw
编码的字符串对象能够能好的利用缓存带来的优势。
可以用long double
类型表示的浮点数在redis
中也是作为字符串值来保存的。如果我们要保存一个浮点数到字符串对象里面,那么程序会先将这个浮点数转换成字符串值,然后在保存转换所得到的字符串值。
在有需要的时候,程序会将保存在字符串对象里面的字符串值转换为浮点数值,执行某些操作,然后再将执行操作所得的浮点数职转换为字符串值,并继续保存在字符串对象里面。
编码的转换
int
编码的字符串对象和embstr
编码的字符串对象在条件满足的情况下,会被转换为raw
编码的字符串对象。
int
编码的字符串对象来说,执行某些命令之后,使得这个对象保存的不在是整数值,而是一个字符串值,那么字符串对象的编码将从int
变为raw
Redis
没有为embstr
编码的字符串对象编写任何响应的修改程序(只有int
编码的字符串对象和raw
编码的字符串对象有这些程序),所以embstr
编码的字符串对象实际上是只读的。当我们对embstr
编码的字符串对象执行任何修改命令时,程序会将对象的编码从embstr
转换成raw
,然后再执行修改命令。
8.2.2 字符串命令
1. APPEND
APPEND key value
如果key
已经存在并且是一个字符串,APPEND
命令将value
追加到key
原来的值的末尾。
如果key
不存在,APPEND
就简单地将给定key
设为value
,就像执行SET key value
一样。
2. BITCOUNT
BITCOUNT key [start] [end]
计算给定字符串中,被设置为1
的比特位的数量。
一般情况下,给定的整个字符串都会被进行计数,通过指定额外的start
或end
参数,可以让计数只在特定的位上进行。
start
和end
参数的设置和GETRANGE
命令类似,都可以使用负数值: 比如-1
表示最后一个字节,-2
表示倒数第二个字节,以此类推。
不存在的key
被当成是空字符串来处理,因此对一个不存在的key
进行BITCOUNT
操作,结果为0
。
用途:
bitmap
实现用户上线次数统计
3. BITOP
BITOP operation destkey key [key ...]
对一个或多个保存二进制位的字符串key
进行位元操作,并将结果保存到destkey
上。
operation
可以是AND
、OR
、NOT
、XOR
这四种操作中的任意一种:
-BITOP AND destkey key [key ...]
,对一个或多个key
求逻辑并,并将结果保存到destkey
。
-BITOP OR destkey key [key ...]
,对一个或多个key
求逻辑或,并将结果保存到destkey
。
-BITOP XOR destkey key [key ...]
,对一个或多个key
求逻辑异或,并将结果保存到destkey
。
-BITOP NOT destkey key
,对给定key
求逻辑非,并将结果保存到destkey
。
除了NOT
操作之外,其他操作都可以接受一个或多个key
作为输入。
4. BITFIELD
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
5. DECR
DECR key
将key
中储存的数字值减一。
如果key
不存在,那么key
的值会先被初始化为0
,然后再执行DECR
操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64
位(bit
)有符号数字表示之内。
6. DECRBY
DECRBY key decrement
将key
所储存的值减去减量decrement
。
如果key
不存在,那么key
的值会先被初始化为0
,然后再执行DECRBY
操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64
位(bit
)有符号数字表示之内。
7. GET
GET key
返回key
所关联的字符串值。
如果key
不存在那么返回特殊值nil
。
假如key
储存的值不是字符串类型,返回一个错误,因为GET
只能用于处理字符串值。
8. GETBIT
GETBIT key offset
对key
所储存的字符串值,获取指定偏移量上的位(bit
)。
当offset
比字符串值的长度大,或者key
不存在时,返回0
。
9. GETRANGE
GETRANGE key start end
返回key
中字符串值的子字符串,字符串的截取范围由start
和end
两个偏移量决定(包括start
和end
在内)。
负数偏移量表示从字符串最后开始计数,-1
表示最后一个字符,-2
表示倒数第二个,以此类推。
GETRANGE
通过保证子字符串的值域(range
)不超过实际字符串的值域来处理超出范围的值域请求。
10. GETSET
GETSET key value
将给定key
的值设为value
,并返回key
的旧值(old value
)。
当key
存在但不是字符串类型时,返回一个错误。
11. INCR
INCR key
将key
中储存的数字值增一。
如果key
不存在,那么key
的值会先被初始化为0
,然后再执行INCR
操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64
位(bit
)有符号数字表示之内。
12. INCRBY
INCRBY key increment
将key
所储存的值加上增量increment
。
如果key
不存在,那么key
的值会先被初始化为0
,然后再执行INCRBY
命令。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64
位(bit
)有符号数字表示之内。
13. INCRBYFLOAT
INCRBYFLOAT key increment
为key
中所储存的值加上浮点数增量increment
。
如果key
不存在,那么INCRBYFLOAT
会先将key
的值设为0
,再执行加法操作。
如果命令执行成功,那么key
的值会被更新为(执行加法之后的)新值,并且新值会以字符串的形式返回给调用者。
14. MGET
MGET key[key...]
返回所有(一个或多个)给定key
的值。
如果给定的key
里面,有某个key
不存在,那么这个key
返回特殊值nil
。因此,该命令永不失败。
15. MSET
MSET key value [key value ...]
同时设置一个或多个key-value
对。
如果某个给定key
已经存在,那么MSET
会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用MSETNX
命令:它只会在所有给定key
都不存在的情况下进行设置操作。
MSET
是一个原子性(atomic
)操作,所有给定key
都会在同一时间内被设置,某些给定key
被更新而另一些给定key
没有改变的情况,不可能发生。
16. MSETNX
MSETNX key value [key value ...]
同时设置一个或多个key-value
对,当且仅当所有给定key
都不存在。
即使只有一个给定key
已存在,MSETNX
也会拒绝执行所有给定key
的设置操作。
MSETNX
是原子性的,因此它可以用作设置多个不同key
表示不同字段(field
)的唯一性逻辑对象(unique logic object
),所有字段要么全被设置,要么全不被设置。
17. PSETEX
PSETEX key milliseconds value
这个命令和SETEX
命令相似,但它以毫秒为单位设置key
的生存时间,而不是像SETEX
命令那样,以秒为单位。
18. SET
SET key value [EX seconds] [PX milliseconds] [NX|XX]
将字符串值value
关联到key
。
如果key
已经持有其他值,SET
就覆写旧值,无视类型。
19. SETBIT
SETBIT key offset value
对key
所储存的字符串值,设置或清除指定偏移量上的位(bit
)。
位的设置或清除取决于value
参数,可以是0
也可以是1
。
当key
不存在时,自动生成一个新的字符串值。
字符串会进行伸展(grown
)以确保它可以将value
保存在指定的偏移量上。当字符串值进行伸展时,空白位置以0
填充。
20. SETEX
SETEX key seconds value
将值value
关联到key
,并将key
的生存时间设为seconds
(以秒为单位)。
如果key
已经存在,SETEX
命令将覆写旧值。
21. SETNX
SETNX key value
将key
的值设为value
,当且仅当key
不存在。
若给定的key
已经存在,则SETNX
不做任何动作。
22. SETRANGE
SETRANGE key offset value
用value
参数覆写(overwrite
)给定key
所储存的字符串值,从偏移量offset
开始。
不存在的key
当作空白字符串处理。
23. STRLEN
STRLEN key
返回key
所储存的字符串值的长度。
当key
储存的不是字符串值时,返回一个错误。