Redis 中所有的键的类型都是字符串类型,⼀个字符串的最⼤值不能超过 512 MB。
由于 Redis 内部存储字符串完全是按照⼆进制流的形式保存的,所以 Redis 是不处理字符集编码问题的,客⼾端传⼊的命令中使⽤的是什么字符集编码,就存储什么字符集编码。
例如输入你好,查询出来的却是\xe4\xbd\xa0\xe5\xa5\xbd
常见命令
set
将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,⽆论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。
语法:
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
返回值:
- 如果设置成功,返回 OK。
- 如果由于 SET 指定了 NX 或者 XX 但条件不满⾜,SET 不会执⾏,并返回 (nil)。
- NX ⸺只在 key 不存在时才进⾏设置,即如果 key 之前已经存在,设置不执⾏。
- XX ⸺只在 key 存在时才进⾏设置,即如果 key 之前不存在,设置不执⾏。
127.0.0.1:6379> keys *
1) "key1"
2) "key"
127.0.0.1:6379> set key1 1 nx
(nil)
127.0.0.1:6379> set key 1
OK
get
获取 key 对应的 value。如果 key 不存在,返回 nil。如果 value 的数据类型不是 string,会报错。
127.0.0.1:6379> lpush key2 1 2 3 4
(integer) 4
127.0.0.1:6379> get key2
(error) WRONGTYPE Operation against a key holding the wrong kind of value
语法:
get key
返回值:key 对应的 value,或者 nil 当 key 不存在。
127.0.0.1:6379> get key
"1"
127.0.0.1:6379> get key1
"1"
mset
⼀次性设置多个 key 的值。
语法:
MSET key value [key value ...]
返回值:永远是 OK
127.0.0.1:6379> mset key3 333 key4 444
OK
mget
⼀次性获取多个 key 的值。如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil。
语法:
MGET key [key ...]
返回值:对应 value 的列表
127.0.0.1:6379> mget key key1
1) "1"
2) "1"
使⽤ mget / mset 由于可以有效地减少了⽹络时间,所以性能相较更⾼。要注意,每次批量操作所发送的键的数量也不是⽆节制的,否则可能造成单⼀命令执⾏时间过⻓,导致 Redis 阻塞
setnx
setnx 设置 key-value 但只允许在 key 之前不存在的情况下。
语法:
setnx key value
返回值:1 表⽰设置成功。0 表⽰没有设置。
127.0.0.1:6379> setnx key6 666
(integer) 1
incr
将 key 对应的 string 表⽰的数字加⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
语法:
incr key
返回值:integer 类型的加完后的数值。
127.0.0.1:6379> incr key
(integer) 2
127.0.0.1:6379> incr key7
(integer) 1
incrby
将 key 对应的 string 表⽰的数字加上对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
语法:
INCRBY key decrement
返回值:integer 类型的加完后的数值。
127.0.0.1:6379> get key3
"333"
127.0.0.1:6379> incrby key3 333
(integer) 666
decr
将 key 对应的 string 表⽰的数字减⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
语法:
DECR key
返回值:integer 类型的减完后的数值。
127.0.0.1:6379> get key
"2"
127.0.0.1:6379> decr key
(integer) 1
decrby
将 key 对应的 string 表⽰的数字减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
语法:
DECRBY key decrement
返回值:integer 类型的减完后的数值。
127.0.0.1:6379> get key3
"666"
127.0.0.1:6379> decrby key3 333
(integer) 333
incrbyfloat
将 key 对应的 string 表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,或者不是⼀个浮点数,则报错。允许采⽤科学计数法表⽰浮点数。
语法:
INCRBYFLOAT key increment
返回值:加/减完后的数值。
127.0.0.1:6379> set key7 6.5
OK
127.0.0.1:6379> get key7
"6.5"
127.0.0.1:6379> incrbyfloat key7 0.5
"7"
127.0.0.1:6379> incrbyfloat key7 -1.5
"5.5"
append
如果 key 已经存在并且是⼀个 string,命令会将 value 追加到原有 string 的后边。如果 key 不存在,则效果等同于 SET 命令。
语法:
APPEND KEY VALUE
返回值:追加完成之后 string 的⻓度。
127.0.0.1:6379> set key8 abc
OK
127.0.0.1:6379> append key8 defg
(integer) 7
127.0.0.1:6379> get key8
"abcdefg"
getrange
返回 key 对应的 string 的⼦串,由 start 和 end 确定(左闭右闭)。可以使⽤负数表⽰倒数。-1 代表倒数第⼀个字符,-2 代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据 string 的⻓度调整成正确的值。
语法:
GETRANGE key start end
返回值:string 类型的⼦串
127.0.0.1:6379> get key8
"abcdefg"
127.0.0.1:6379> getrange key8 0 -1
"abcdefg"
127.0.0.1:6379> getrange key8 2 4
"cde"
setrange
覆盖字符串的⼀部分,从指定的偏移开始。
语法:
SETRANGE key offset value
返回值:替换后的 string 的⻓度。
127.0.0.1:6379> get key8
"abcdefg"
127.0.0.1:6379> setrange key8 3 abc
(integer) 7
127.0.0.1:6379> get key8
"abcabcg"
strlen
获取 key 对应的 string 的⻓度。当 key 存放的类似不是 string 时,报错。
语法:
STRLEN key
返回值:string 的⻓度。或者当 key 不存在时,返回 0。
127.0.0.1:6379> strlen key8
(integer) 7
小结:
命令 | 执行效果 | 时间复杂度 |
---|---|---|
set key value [key value…] | 设置 key 的值是 value | O(k), k 是键个数 |
get key | 获取 key 的值 | O(1) |
del key [key …] | 删除指定的 key | O(k), k 是键个数 |
mset key value [key value…] | 批量设置指定的 key 和 value | O(k), k 是键个数 |
mget key [key …] | 批量获取 key 的值 | O(k), k 是键个数 |
incr key | 指定的 key 的值 +1 | O(1) |
decr key | 指定的 key 的值 -1 | O(1) |
incrby key n | 指定的 key 的值 +n | O(1) |
decrby key n | 指定的 key 的值 -n | O(1) |
incrbyfloat key n | 指定的 key 的值 +n | O(1) |
append key value | 指定的 key 的值追加 value | O(1) |
strlen key | 获取指定 key 的值的⻓度 | O(1) |
setrange key offset value | 覆盖指定 key 的从 offset 开始的部分值 | O(n),n 是字符串⻓度, 通常视为 O(1) |
getrange key start end | 获取指定 key 的从 start 到 end 的部分值 | O(n),n 是字符串⻓度, 通常视为 O(1) |
内部编码
字符串类型的内部编码有 3 种:
- int:8 个字节的⻓整型。
- embstr:⼩于等于 39 个字节的字符串。
- raw:⼤于 39 个字节的字符串。
Redis 会根据当前值的类型和⻓度动态决定使⽤哪种内部编码实现。
使用场景
- 缓存(Cache)功能
Redis 作为缓冲层,起到加速读写和降低后端压⼒的作⽤。 - 计数(Counter)功能
视频的播放量计数点赞计数等 - 共享会话(Session)
redis存储session - 短信验证码
登录时创建验证码设置失效时间,限制用户获取验证码频率等待。