String字符串
字符串类型是Redis最基础的数据类型,关于字符串类型需要特别注意以下几点:
-
Redis中所有的键类型都是字符串类型,而且其他几种数据结构也都是在字符串类型基础上构建的,例如链表和集合的元素类型也是字符串类型
-
不止局限于一般格式的字符串或者JSON、XML格式的字符串,像是数字(整型、浮点型)、甚至是二进制数据,例如图片、音频、视频等等。
-
一个字符串的最大不超过512MB
-
Redis内部存储字符串完全是按照二进制流的形式保存的,所以Redis是不处理字符集的编码问题的,客户端传入的命令中使用的是什么字符编码,就存储什么字符编码。
关于Redis是不处理字符集的编码问题的演示:
如果想看到对应的字符需要在进入客户端时加入 --raw
shell
127.0.0.1:6379> set key2 你好
OK
127.0.0.1:6379> get key2
"\xe4\xbd\xa0\xe5\xa5\xbd"
127.0.0.1:6379>
root@instance-5a74bdri:~# redis-cli --raw
127.0.0.1:6379> get key2
你好
127.0.0.1:6379>
常见命令
SET
语法:
shell
SET key value [NX|XX] [expiration EX seconds|PX milliseconds]
功能:
将string类型的value设置到key中。如果key之前存在,则覆盖,无论原来的数据类型是什么,之前关于此key的TTL也全部失效。
命令有效版本:1.0.0以后
时间复杂度:O(1)
选项介绍:
EXseconds :使用秒作为设置key的过期时间PXmillseconds :使用毫秒作为单位设置key的过期时间NX:只在key不存在时才进行设置,即如果key之前已经存在,设置不执行XX:只在key存在时才进行设置,即如果key之前不支持,设置不执行
注意:由于带选项的set命令可以被 SETNX,SETEX,PSETEX等命令代替,所以之后的版本中,redis可能进行合并。
返回值:
-
如果设置成功,返回OK。
-
如果由于SET指定的NX获取XX但是条件不满足,SET不会执行,并返回nil
演示:
shell
127.0.0.1:6379> set key1 value1 NX
OK
127.0.0.1:6379> set key1 value1 NX
(nil)
127.0.0.1:6379> set key1 value2 XX
OK
127.0.0.1:6379> set key2 value2 NX EX 100
OK
127.0.0.1:6379> TTL key2
94
127.0.0.1:6379>
GET
语法:
shell
GET key
功能:
获取key对应的value。如果key不存在,返回nil。如果value的数据类型不是sting,会报错。
命令有效版本:1.0.0以后
时间复杂度:O(1)
返回值:key对应的value,或者nil
演示:
shell
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key2
(nil)
127.0.0.1:6379>
MGET
语法:
shell
MGET key [key ...]
功能:
一次性获取多个key的值。如果对应的key不存在或者对应的数据类型不是string,返回nil。
命令有效版本:1.0.0以后
时间复杂度:O(1)
返回值:key对应的value列表,或者nil
演示:
shell
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set key1 value
OK
127.0.0.1:6379> set key2 value2
OK
127.0.0.1:6379> set key3 value3
OK
127.0.0.1:6379> mget key1 key2 key3
1) "value"
2) "value2"
3) "value3"
127.0.0.1:6379>
MSET
语法:
shell
MSET key value [key value ...]
功能:一次性设置多个key的值
命令有效版本:1.0.1以后
时间复杂度:O(N)
返回值:有且只有OK
演示:
shell
127.0.0.1:6379> mset key1 value1 key2 value2 key3 value3
OK
127.0.0.1:6379> mget key1 key2 key3
1) "value1"
2) "value2"
3) "value3"
127.0.0.1:6379>
注意:Redis提供MSET和MGET的目的是为了减少网络通信的次数,但是每次批量操作所发送的键的数量也不能是无节制的,否则可能造成单一命令执行时间过长导致Redis堵塞。
SETNX
语法:
shell
SETNX key value
功能:
只允许key之前不存在的情况下设置key value。
命令有效版本:1.0.0以后
时间复杂度:O(1)
返回值:1表示设置成功,0表示设置失败。
演示:
shell
127.0.0.1:6379> setnx key1 value1
(integer) 1
127.0.0.1:6379> setnx key1 value
(integer) 0
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379>
计数命令
INCR
语法:
shell
INCR key
功能:
将key对应的string表示的数字加一。如果key不存在,则将key视为对应的value为0。如果key对应的string不是一个整型或者范围超过了64位有符号整型,则报错。
命令有效版本:1.0.0以后
时间复杂度:O(1)
返回值:integer类型加完后的数值
演示:
shell
127.0.0.1:6379> exists key1
(integer) 0
127.0.0.1:6379> incr key1
(integer) 1
127.0.0.1:6379> get key1
"1"
127.0.0.1:6379> set key2 10
OK
127.0.0.1:6379> incr key2
(integer) 11
127.0.0.1:6379> get key2
"11"
127.0.0.1:6379> set key3 abcdefg
OK
127.0.0.1:6379> incr key3
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
INCRBY
语法:
shell
INCRBY key decrement
功能:将key对应的string表示的数字加N。如果key不存在,则将key视为对应的value为0。如果key对应的string不是一个整型或者范围超过了64位有符号整型,则报错。
命令有效版本:1.0.0以后
时间复杂度:O(1)
返回值:integer类型加完后的数值
演示:
shell
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> incrby key 100
(integer) 100
127.0.0.1:6379> get key
"100"
127.0.0.1:6379> set key1 111
OK
127.0.0.1:6379> incrby key1 123
(integer) 234
127.0.0.1:6379> get key1
"234"
127.0.0.1:6379>
DECR
语法:
shell
DECR key
功能:
将key对应的string表示的数字减一。如果key不存在,则将key视为对应的value为0。如果key对应的string不是一个整型或者范围超过了64位有符号整型,则报错。
命令有效版本:1.0.0以后
时间复杂度:O(1)
返回值:integer类型加完后的数值
演示:
shell
127.0.0.1:6379> clear
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> decr key
(integer) -1
127.0.0.1:6379> get key
"-1"
127.0.0.1:6379> set key1 101
OK
127.0.0.1:6379> decr key1
(integer) 100
127.0.0.1:6379> get key1
"100"
127.0.0.1:6379>
DECRBY
语法:
shell
DECRBY key decrement
功能:
将key对应的string表示的数字减N。如果key不存在,则将key视为对应的value为0。如果key对应的string不是一个整型或者范围超过了64位有符号整型,则报错。
命令有效版本:1.0.0以后
时间复杂度:O(1)
返回值:integer类型加完后的数值
演示:
shell
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> decrby key 100
(integer) -100
127.0.0.1:6379> get key
"-100"
127.0.0.1:6379> set key1 114514
OK
127.0.0.1:6379> decrby key1 7878
(integer) 106636
127.0.0.1:6379> get key1
"106636"
127.0.0.1:6379>
INCRBYFLOAT
语法:
shell
INCRBYFLOAT key increment
功能:
将key对应的string表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果
key不存在,则视为key对应的value是0。如果key对应的不是string,或者不是⼀个数值,则报
错。允许采⽤科学计数法表⽰浮点数
命令有效版本:2.6.0以后
时间复杂度:O(1)
返回值:加减完后的数值
演示:
shell
127.0.0.1:6379> set key 10.10
OK
127.0.0.1:6379> incrbyfloat key 10.09
"20.19"
127.0.0.1:6379> incrbyfloat key 2.0e2
"220.19"
127.0.0.1:6379>
注意:没有DECRBYFLOAT
其他命令
APPEND
语法:
shell
APPEND KEY VALUE
功能:
如果key已经存在并且是⼀个string,命令会将value追加到原有string的后边。如果key不存在,
则效果等同于SET命令。
命令有效版本:2.0.0以后
时间复杂度:O(1)
返回值:追加后的string长度
演示:
shell
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> append key 12345
(integer) 5
127.0.0.1:6379> get key
"12345"
127.0.0.1:6379> set key1 12345
OK
127.0.0.1:6379> append key1 54321
(integer) 10
127.0.0.1:6379> get key1
"1234554321"
127.0.0.1:6379>
GETRANGE
语法:
shell
GETRANGE key start end
功能:
返回key对应的string的⼦串,由start和end确定(左闭右闭)。可以使⽤负数表⽰从后往前。-1代表倒数第⼀个字符,-2代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据string的⻓度调整成正确的值。
命令有效版本:2.4.0以后
时间复杂度:O(N)
返回值:string类型的子串
演示:
shell
127.0.0.1:6379> set key "you can see me"
OK
127.0.0.1:6379> getrange key 0 -1
"you can see me"
127.0.0.1:6379> getrange key -3 -1
" me"
127.0.0.1:6379> getrange key 0 1000
"you can see me"
127.0.0.1:6379> getrange key -100 100
"you can see me"
127.0.0.1:6379>
SETRANGE
语法:
shell
SETRANGE key offset value
功能:
覆盖字符串的一部分,从指定的偏移开始
命令有效版本:2.2.0以后
时间复杂度:O(N)
返回值:替换后的string的长度
演示:
shell
127.0.0.1:6379> set key "hello world"
OK
127.0.0.1:6379> setrange key 6 "redis"
(integer) 11
127.0.0.1:6379> get key
"hello redis"
127.0.0.1:6379>
STRLEN
语法:
shell
STRLEN key
功能:
获取key对应的stirng的长度。当key存放的类型不是string时,报错。
命令有效版本:2.2.0以后
时间复杂度:O(1)
返回值:string的长度。或者当key不存在时,返回0。
演示:
shell
127.0.0.1:6379> set key "you can see me"
OK
127.0.0.1:6379> strlen key
(integer) 14
127.0.0.1:6379> strlen key2
(integer) 0
127.0.0.1:6379>
内部编码
字符串类型的内部编码有3种:
-
int :8字节的长整型。
-
embstr :小于等于39字节的字符串。
-
raw :大于39字节的字符串。
Redis会根据当前值的类型和长度动态决定使用哪种内部编码实现。
演示:
shell
127.0.0.1:6379> set int 123
OK
127.0.0.1:6379> object encoding int
"int"
127.0.0.1:6379> set embstr abcdef
OK
127.0.0.1:6379> object encoding embstr
"embstr"
127.0.0.1:6379> set raw aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
OK
127.0.0.1:6379> object encoding raw
"raw"
127.0.0.1:6379>
经典使用场景
缓存功能
使用Redis作为缓存层,热点数据后都存储在Redis当中,由于Redis具有支撑高并发的特性,所以缓存通常能起到加速读写降低后端压力的作用。

计数功能
使用Redis为视频网站的视频播放次数计数,用户每播放一次视频,相应的视频播放数加一。
共享会话 session
⼀个分布式Web服务将⽤⼾的Session信息(例如⽤⼾登录信息)保存在各⾃的服务器中,但这样会造成⼀个问题:出于负载均衡的考虑,分布式服务会将⽤⼾的访问请求均衡到不同的服务器上,并且通常⽆法保证⽤⼾每次请求都会被均衡到同⼀台服务器上,这样当⽤⼾刷新⼀次访问是可能会发现需要重新登录,这个问题是⽤⼾⽆法容忍的。

短信验证码
使用Redis存储一个定时5分钟的随机6位数字充当验证码。
总结
与字符串有关的命令有:
set、get、del、mset、mget、incr、decr、incrby、decrby、incrbyfloat、append、strlen、setrange、getrange
应用场景有:
缓存功能、计数功能、共享会话、短信验证码。