String字符串
字符串是Redis最基础的数据类型, 关于字符串需要特别注意: (1)首先Redis中所有的键的类型都是字符串类型, 而且其它几种数据结构也是在字符串类型的基础上构建的, 例如列表和集合的元素都是字符串类型, 所以字符串类型能为其它4种数据结构的学习奠定基础. (2)其次, 如图, 字符串类型的值实际可以是字符串, 包含一般格式的字符串类似JSON, XML格式的字符串; 数字, 可以是整型或者浮点型; 甚至是二进制数据, 例如图片, 音频等. 不过一个字符串的最大值不能超过512MB.
由于Redis内部存储的字符串完全是按照二进制流的形式保存的, 所以Redis是不处理字符集编码问题的, 客户端传入的命令中使用的是什么字符集编码, 就存储什么字符集编码.
常见命令
SET
将string类型的value设置到key中. 如果key之前存在, 则覆盖, 无论原来的数据类型是什么. 之前关于此key的TTL也全部失效.
语法:
SET key value [expiration EX seconds | PX milliseconds] [NX|XX]
命令有效版本: 1.0.0之后. 时间复杂度:O(1)
选项:
EX seconds: 使用秒为单位设置key的过期时间.
PX milliseconds: 使用毫秒为单位设置key的过期时间.
NX: 只在key不存在时才进行设置, 即如果key之前已经存在, 设置不执行.
XX: 旨在key存在时才进行设置, 即如果key之前不存在, 设置不执行.
注: 由于带选项的SET命令可以被SETNX, SETEX, PSETEX等命令代替, 所以之后版本中, Redis可能进行合并.
返回值:
如果设置成功, 则返回OK.
如果由于SET制定了NX或XX但条件不满足, SET不会执行, 并返回(nil).
示例:
GET
获取key对应的value. 如果key不存在, 返回nil. 如果value的数据类型不是string, 会报错.
语法:
GET key
命令有效版本: 1.0.0之后. 时间复杂度: O(1).
返回值: key对应的value, 或者nil当key不存在.
MGET
一次性获取多个key的值. 如果对应的key不存在或者对应的数据类型不是string, 返回nil.
语法:
MGET key [key...]
命令有效版本: 1.0.0之后. 时间复杂度: O(N) N是key的数量.
返回值: 对应value的列表.
示例:
MSET
一次性设置多个key的值.
语法:
MSET key value [key value...]
命令有效版本: 1.0.1之后. 时间复杂度: O(N) N是key的数量.
返回值: 永远是OK.
SETNX
设置key-value但只允许在key之前不存在的情况下.
语法:
SETEX key value
命令有效版本: 1.0.0之后 时间复杂度: O(1)
返回值: 1表示设置成功. 0表示没有设置.
示例:
计数命令
INCR
将key对应的string表示的数字加一. 如果key不存在, 则视为key对应的value是0. 如果key对应的string不是一个整型或者范围超过了64位有符号整型, 则报错.
语法:
INCR key
命令有效版本: 1.0.0之后 时间复杂度:O(1)
返回值: integer类型的加完后的数值.
示例:
INCRBY
将key对应的string表示的数字加上对应的值. 如果key不存在, 则视为key对应的value是0. 如果key对应的string不是一个整型或者范围超过了64位有符号整型, 则报错.
语法:
INCRBY key decrement
命令有效版本: 1.0.0之后. 时间复杂度: O(1)
返回值: integer类型加完后的数值.
示例:
DECR
将key对应的string表示的数字-1. 如果key不存在, 则视为key对应的value是0. 如果key对应的string不是一个整型或者范围超过了64位有符号整型, 则报错.
语法:
DECR key
命令有效版本: 1.0.0之后 时间复杂度: O(1)
返回值: integer类型减完后的值.
DECRBY
将key对应的string表示的数字减去对应的值. 如果key不存在, 则视为key对应的value是0. 如果key对应的string不是一个整型或者范围超过了64位有符号整型, 则报错.
语法:
DECRBY key decrement
命令有效版本: 1.0.0之后. 时间复杂度: O(1)
返回值: integer类型减完后的数值.
INCRFLOAT
将key对应的string表示的浮点数加上对应的值. 如果对应的值是负数, 则视为减去对应的值(因此没有DECRFLOAT). 如果key不存在, 则视为key对应的value是0. 如果key对应的不是string, 或者不是一个浮点数, 则报错. 允许采用科学计数法表示浮点数.
语法:
INCRBYFLOAT key increment
命令有效版本: 2.6.0之后 时间复杂度: O(1)
返回值: 加/减完后的数值.
示例:
很多存储系统和编程语言内部使用CAS机制实现计数功能, 会有一定的CPU开销, 但在Redis中完全不存在这个问题, 因为Redis是单线程架构, 任何命令到了Redis服务端都要顺序执行.
其它命令
APPEND
如果key已经存在并且一个是string, 命令会将value追加到原有string的后面. 如果key不存在, 则效果等同于SET命令.
语法:
APPEND KEY VALUE
命令有效版本: 2.0.0之后. 时间复杂度:O(1). 追加的字符串长度比较短, 可以视为O(1).
返回值: 追加完成之后string的长度.
示例:
GETRANGE
返回key对应的string的字串, 由start和end确定(左闭右闭) . 可以使用负数表示倒数. -1代表倒数第一个字符, -2表示倒数第二个. 0是正数开始. 超过范围的偏移量会根据string的长度调整成正确的值.
语法:
GETRANGE key start end
命令有效版本: 2.4.0之后. 时间复杂度: O(N) N为[start,end]长度. 由于string通常较短, 可视为O(1)
返回值: string类型的字串.
SETRANGE
覆盖字符串的一部分, 从指定的偏移开始.
语法:
SETRANGE key offset value
命令有效版本: 2.2.0之后. 时间复杂度: O(N), N为value的长度. 由于value一般较短, 可视为O(1)
返回值: 替换后string的长度.
示例:
STRLEN
获取key对应的string长度. 当key存放的类型不是string时, 报错.
语法:
STRLEN key
命令有效版本: 2.2.0之后. 时间复杂度:O(1)
返回值: string的长度. 或者当key不存在时, 返回0.