8.2 字符串对象

字符串对象的编码可以是intraw或者embstr
如果字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面,并将字符串对象的编码设置为int
如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于32字节,那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将对象的编码设置为raw
如果字符串对象保存的是一个字符串值,并且这个字符串值的长度小于等于32字节,那么字符串对象将使用embstr编码的方式来保存这个字符串值。
embstr编码是专门用于保存短字符串的一种优化编码方式,这种编码和raw编码一样,都是用redisObject结构和sdshdr结构来表示字符串对象,但raw编码会调用两次内存分配函数来分别创建redisObject结构和sdshdr结构,而embstr编码则通过调用一次内存分配一块连续的空间,空间中依次包含redisObjectsdshdr两个结构。
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的比特位的数量。
一般情况下,给定的整个字符串都会被进行计数,通过指定额外的startend参数,可以让计数只在特定的位上进行。
startend参数的设置和GETRANGE命令类似,都可以使用负数值: 比如-1表示最后一个字节,-2表示倒数第二个字节,以此类推。
不存在的key被当成是空字符串来处理,因此对一个不存在的key进行BITCOUNT操作,结果为0

用途:bitmap实现用户上线次数统计

3. BITOP
BITOP operation destkey key [key ...]

对一个或多个保存二进制位的字符串key进行位元操作,并将结果保存到destkey上。
operation可以是ANDORNOTXOR这四种操作中的任意一种:
-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中字符串值的子字符串,字符串的截取范围由startend两个偏移量决定(包括startend在内)。
负数偏移量表示从字符串最后开始计数,-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储存的不是字符串值时,返回一个错误。

你可能感兴趣的:(8.2 字符串对象)