0%

redis之string

字符串是redis最基本的数据类型,其它几种数据类型构成也包含字符串对象,其长度不能超过512M。

一、原理

  1. 字符串是redis最基本的数据类型,其它几种数据类型构成也包含字符串对象,其长度不能超过512M。

  2. 字符串对象的编码可以是int,raw或者embstr。

  3. int编码:保存的是可以用long类型表示的整数值。

    • 当字符串保存的是一个可以用long类型来表示的整数时,那么robj对象里的属性ptr的类型void *就会被替换为long,而encoding的值会设置为int表示该字符串的实现方式是整型。
  4. embstr编码:全称embedded string,字符串的空间将会和redisObject对象的空间一起分配,两者在同一个内存块中。保存长度小于44字节的字符串(redis3.2版本之前是39字节)。

embstr

  • 当字符串保存的是一个小于等于44个字节的字符串时,那么robj对象里的属性ptr就会指向一个SDS对象,而encoding的值会设置为embstr表示该字符串的实现方式是SDS(简单动态字符串)。
  • embstr是一种用来保存短字符串的编码方式,embstr编码通过调用一次内存分配函数来创建一块连续的内存空间,即redisObject对象和它的ptr指针指向的SDS对象是连续的。
  • 不过embstr编码的字符串对象是只读性的,一旦对其指向APPEND命令追加字符串会导致其变为raw编码实现。
  1. raw编码:保存长度大于44字节的字符串(redis3.2版本之前是39字节)。

raw

  • 当字符串对象保存的是一个超过44个字节的字符串时,那么robj对象里的属性ptr就会指向一个SDS对象,而encoding的值会设置为raw表示该字符串的实现方式是SDS(简单动态字符串)
  • raw编码的字符串对象是可读可写的,对其指向APPEND命令追加字符串会不会导致其实现改变,如果追加的字符串的长度超过其free属性值,会在追加前重新进行内存空间分配。

emb-raw

  1. 编码转换
    • 当int编码保存的值不再是整数,或大小超过了long的范围时,自动转化为raw
    • 对于embstr编码,由于redis没有对其编写任何的修改程序(embstr是只读的),在对embstr对象进行修改时都会先转化为raw再进行修改,因此只要是修改embstr对象,修改后的对象一定是raw的,无论是否达到了44个字节

embstr与raw的区别

  • embstr的创建只需分配一次内存,而raw为两次(一次为sds分配对象,第二次为objet分配对象,embstr省去了第一次)
  • embstr释放内存的次数为一次,raw为两次
  • embstr的object和sds放在一起,更好地利用缓存带来的优势
  • embstr的坏处也很明显,如果字符串的长度增加需要重新分配内存时,整个redisObject和sds都需要重新分配空间,因此redis中的embstr实现为只读

redis中对于浮点数类型也是作为字符串保存的,在需要的时候再将其转换成浮点数类型

二、常用命令

  1. SET key value [expiration EX seconds|PX milliseconds] [NX|XX],设置key值为value

    • 可选项EX/PX:有效期秒/毫秒
    • 可选项NX/XX:当且仅当key不存在/存在时方可设置成功,
    • 结合以上两个选项可替代SETNX/SETXX/PSETEX等命令
  2. GET key,获取指定key的值。

  3. EXPIRE key seconds,设置key的过期时间为seconds

  4. TTL key,key还剩多少时间过期

  5. STRLEN key,返回key所储存的字符串值的长度。

  6. GETSET key value,将给定key的值设为value ,并返回key的旧值。

  7. SETBIT key offset value,对key所储存的字符串值,设置或清除指定偏移量上的位(bit)。

  8. GETBIT key offset,对key所储存的字符串值,获取指定偏移量上的位(bit)。

  9. MSET key value [key value ...],同时设置一个或多个key-value对。

  10. MGET key1 [key2..],获取所有(一个或多个)给定key的值。

  11. SETEX key seconds value,将值value关联到key,并将key的过期时间设为seconds(以秒为单位)。

    • PSETEX key milliseconds value,以毫秒为单位设置key的生存时间
    • 不存在PSETNX命令
  12. SETNX key value,只有在key不存在时设置key的值。

  13. GETRANGE key start end,返回key中字符串值的子字符

  14. SETRANGE key offset value,用value参数覆写给定key所储存的字符串值,从偏移量offset开始。

  15. MSETNX key value [key value ...] 同时设置一个或多个key-value对,当且仅当所有给定key都不存在。

    • 不存在MSETXX命令
  16. INCR key,将key中储存的数字值+1。

    • INCRBY key increment,将key所储存的值加上给定的增量值increment。
    • INCRBYFLOAT key increment,将key所储存的值加上给定的浮点增量值increment。
  17. DECR key 将key中储存的数字值-1。

    • DECRBY key decrement,将key所储存的值减去给定的减量值decrement。
    • 不存在DECRBYFLOAT命令
  18. APPEND key value,将指定的value追加到已经存在的一个字符串key原来值value的末尾。