Redis数据结构-字符串

216 阅读6分钟
简介
最简单的数据结构,相当于Java中的String
基本操作
  • SET key value 将字符串键key的值设置为value,命令返回OK表示设置成功 如果字符串键key已经存在,那么用新值覆盖原来的旧值

    127.0.0.1:6379> set msg "hello world"
    OK
    127.0.0.1:6379> get msg
    "hello world"
    127.0.0.1:6379> set msg "hi"
    OK
    127.0.0.1:6379> get msg
    "hi"
    

    SET key value [ NX|XX ] NX: 命令仅在键key不存在的情况下,才进行设置操作;如果键key已经存在,那么SET... NX 命令不做动作(不会覆盖旧值) XX: 命令仅在键key已经存在的情况下,才进行设置操作,如果key不存在,那么SET... XX命令不做动作(一定会覆盖旧值)

    在给定NX选项和XX选项的情况下,SET命令在设置成功时返回OK,设置失败时返回nil

    样例:

    • NX:
      127.0.0.1:6379> keys *
      (empty list or set)
      127.0.0.1:6379> set msg hi NX
      OK
      127.0.0.1:6379> set msg hi NX
      (nil)
      
    • XX
      127.0.0.1:6379> keys *
      (empty list or set)
      127.0.0.1:6379> set msg hi XX
      (nil)
      127.0.0.1:6379> set msg hi 
      OK
      127.0.0.1:6379> set msg hi2 XX
      OK
      127.0.0.1:6379> get msg
      "hi2"
      
  • GET key 返回字符串键key存储的值

    127.0.0.1:6379> get msg
    "hi2"
    
  • SETNX key value 仅在键key不存在的情况下,将键key的值设置成value,效果和set key value NX 一样

  • MSET key value [ key value ... ] 一次为一个或多个字符串键设置值,效果和同时执行多个SET命令一样

    127.0.0.1:6379> MSET msg1 value1 msg2 value2 msg3 value3
    OK
    
  • MSETNX key value [ key value ... ] 只有在所有给定键都不存在的情况下,MSETNX会为所有给定键设置值,效果和同时执行多个SETNX一样。如果给定的键至少有一个是存在的,那么MSETNX将不执行任何设置操作

  • MGET key [ key ... ] 一次返回一个或多个字符串键的值,效果和同时执行多个GET命令一样

    127.0.0.1:6379> mget msg1 msg2 msg3
    1) "value1"
    2) "value2"
    3) "value3"
    
  • GETSET key new-value 将字符串键的值设置为new-value,并返回字符串键在设置新值之前存储的旧值(old value)

    127.0.0.1:6379> get msg
    "hi"
    127.0.0.1:6379> getset msg hello
    "hi"
    127.0.0.1:6379> get msg
    "hello"
    
  • APPEND key value 追加内容到字符串末尾,将值value推入到字符串键key已存储内容的末尾,返回被追加后值的长度

    127.0.0.1:6379> get msg
    "hello"
    127.0.0.1:6379> append msg " world"
    (integer) 11
    127.0.0.1:6379> get msg
    "hello world"
    
  • STRLEN key 返回字符串key存储的值的长度

    127.0.0.1:6379> strlen msg
    (integer) 11
    
索引
  • 字符串的索引(index)以0为开始,从字符串的开头向字符串的结尾依次递增,字符串第一个字符的索引为0,字符的最后一个字符的索引为N-1,其中N为字符串的长度
  • 除了正数索引之外,字符串还有负数索引:负数索引以-1为开始,从字符串的结尾向字符串的开头依次递减,字符串的最后一个字符的索引为-N,其中N为字符串的长度 在这里插入图片描述
  • SETRANGE key index value 从索引index开始,用value覆写给定键key所存储的字符串值。只接受正数索引。 命令返回覆写之后,返回字符串值的长度
    127.0.0.1:6379> get msg
    "hello world"
    127.0.0.1:6379> setrange msg 6 XX
    (integer) 11
    127.0.0.1:6379> get msg
    "hello XXrld"
    
  • GETRANGE key start end 返回键key存储的字符串值中,位于start和end两个索引之间的内容。索引可以是正数或者负数
    127.0.0.1:6379> getrange msg 5 11
    " XXrld"
    127.0.0.1:6379> getrange msg -5 -1
    "XXrld"
    
数字操作

只要存储在字符串键里面的值可以被解释为64位整数,或者IEEE-754标准的64位浮点数,那么用户就可以对这个字符串键执行针对数字值的命令

能否执行数字命令原因
123456可以值可以被解释为整数
3.14可以值可以被解释为浮点数
+123可以值可以被解释为整数
123456789123456789123456789不可以值太大,不能使用64位整数来存储
2.0e7不可以不能解释科学计数法表示的浮点数
123AAA不可以值包含字符
AAA不可以值为字符串
即时字符串键值存储的是数字值,也可以执行APPEND,STRLEN,SETRANGE和GETRANGE。 当针对一个数字值执行这些命令的时候,Redis会先将数字值转换为字符串,然后再执行命令
  • INCRBY key increment 将key存储的数字值加上增量increment,命令返回操作执行之后,键key的当前值

    127.0.0.1:6379> get msg
    "10"
    127.0.0.1:6379> incrby msg 5
    (integer) 15
    127.0.0.1:6379> get msg
    "15"
    
  • DECRBY key decrement 将key所存储的值减去减量decrement,命令返回操作执行之后,键key的当前值

    127.0.0.1:6379> get msg
    "15"
    127.0.0.1:6379> decrby msg 2
    (integer) 13
    127.0.0.1:6379> get msg
    "13"
    

    如果执行INCRBY和DECRBY时,键不存在,命令会将键key的值初始化为0,然后再执行增加或者减少操作

  • INCR key 当前存储key的值上加1,等同于执行INCRBY key 1

    127.0.0.1:6379> get msg
    "13"
    127.0.0.1:6379> incr msg
    (integer) 14
    127.0.0.1:6379> get msg
    "14"
    
  • DECR key 当前存储key的值减1,等同于执行DECRBY key 1

    127.0.0.1:6379> get msg
    "14"
    127.0.0.1:6379> decr msg
    (integer) 13
    127.0.0.1:6379> get msg
    "13"
    
  • INCRBYFLOAT key increment 为字符串键key存储的值加上浮点数增量increment,命令返回操作执行之后,键key的值

    127.0.0.1:6379> set num 11
    OK
    127.0.0.1:6379> incrbyfloat num 0.14
    "11.14"
    127.0.0.1:6379> get num 
    "11.14"
    127.0.0.1:6379> incrbyfloat num -1.82
    "9.32"
    127.0.0.1:6379> get num
    "9.32"
    
二进制数据操作

SET、GET、SETINX、APPEND等命令可以用于设置二进制数据

  • 索引 和存储文字时一样,字符串键在存储二进制位时,索引也是从0开始的 但是和存储文字时,索引从左到右依次递增不同,当字符串键存储的是二进制时,二进制位的索引会从左到右依次递减 在这里插入图片描述

  • SETBIT key index value 将给定索引上的二进制的值设置为value,命令返回被设置的位原来存储的旧值

  • GETBIT key value 返回给定索引上的二进制位的值

  • BITCOUNT key [start] [end] 计算并返回字符串键值存储的值中,被设置为1的二进制的数量

  • BITOP operation destkey key [ key ... ] 多一个或多个保存二进制位的字符串键执行位元操作,并将结果保存到destkey上 。 operation 可以:AND、OR、NOR、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 ... ]多一个或多个key求逻辑非,并将结果保存到destkey
存储中文注意事项
  • 英文字符只需要使用单个字节来存储,而一个中文字符需要使用3个字节来存储 STRLEN、SETRANGE和GETRANGE是为英文设置的,只会在字符为单个字节的情况下正常工作,存储类式中文这样多字节字符,则此三个命令不再适用

  • redis-cli 中使用中文时,必须打开 --raw选项,才能正常显示中文

    127.0.0.1:6379> set msg "你好"
    OK
    127.0.0.1:6379> get msg
    "\xe4\xbd\xa0\xe5\xa5\xbd"
    127.0.0.1:6379> strlen msg
    (integer) 6
    

    使用 --raw

    [root@localhost utils]# redis-cli --raw
    127.0.0.1:6379> auth 123456
    OK
    127.0.0.1:6379> get msg
    你好
    127.0.0.1:6379> strlen msg
    6