value 的类型
在演示对 value 的操作命令之前,需要首先介绍 value 的类型。我们说 Redis 的数据类型指的就是 value 的数据类型。以下说明的是 Redis 开源版支持的数据类型。
有五大基础的、常用的数据类型,它们是:
- string(字符串)
- hash(哈希)
- list(列表)
- set (集合)
- sorted set(zset,有序集合)
这五大数据类型在生产环境下使用最多,同时也涵盖了绝大部分的场景。
除了基础的数据类型之外,还支持一些特殊的数据类型,用在一些特殊场景上:
- stream(流)
- geospatial(一种使用经纬度地理空间的数据类型,和 ES 中的 geo_point 字段类型相似)
- bitmap(位图)
- bitfields(位域)
对 string 类型的操作命令
string 除了可以存放基本的文本外,还可以存放数值、二进制图片、音频、视频、序列化对象等。请注意!默认情况下,单个 string 最大为 512MB
以下演示的都是使用文本或数值。
set
和 get
# set 命令前面见过了,就是设置指定 key 的 value。
# 如果 key 不存在于当前库中,则创建一个新的 key-value
## 如果 key 已经存在于当前库中,则会将其值覆盖且无视数据类型
192.168.100.3:6379> exists cityname:1
(integer) 0
192.168.100.3:6379> set cityname:1 GZ
OK
192.168.100.3:6379> set cityname:1 new-value
OK
192.168.100.3:6379> get cityname:1
"new-value"
# set 命令除了基本的用法外,还支持一些额外的参数,用法为:
192.168.100.3:6379> help set
SET key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]
...
NX 和 XX 是可选参数,控制 key 的行为。NX 表示如果这个 key 不存在,则才能成功设置 value 的值,用于添加 key 与 value;XX 表示如果 key 已经存在,则才能成功设置 value 的值,用于更新 key 的 value,示例如下:
192.168.100.3:6379> exists cityname:10
(integer) 0
192.168.100.3:6379> set cityname:10 wh NX
OK
192.168.100.3:6379> set cityname:10 gz NX
(nil)
192.168.100.3:6379> get cityname:10
"wh"
192.168.100.3:6379> set cityname:10 gz XX
OK
EX 和 PX 用于设置 key 的过期时间,这是在创建 key-value 时设置过期时间,EX 的单位为秒,PX 的单位为毫秒。如果要在已经存在的 key 上设置过期时间,请使用 expire
命令 和 pexpire
命令,示例如下:
192.168.100.3:6379> exists cityname:15
(integer) 0
192.168.100.3:6379> set cityname:15 ShangHai NX EX 200
OK
192.168.100.3:6379> ttl cityname:15
(integer) 191
# 如果 key 的 value 有空格或其他特殊字符,请使用双引号或单引号包含 value。
192.168.100.3:6379> exists redis:first
(integer) 0
192.168.100.3:6379> set redis:first "Hello World" ex 200
OK
192.168.100.3:6379> ttl redis:first
(integer) 183
mset
、msetnx
、mget
如果要一次性写入多个 key-value ,请使用 mset
或 msetnx
命令
# 当多个 key 都不存在时(只要有一个存在,就无法写入到 DB),也可以考虑使用 msetnx ,这样会更加安全
## mget 命令用来获取多个 key 的 value
192.168.100.3:6379> mset k1 v1 k2 v2 k3 v3
OK
192.168.100.3:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
192.168.100.3:6379> msetnx k4 v4 k5 v5
OK
append
如果 key 是存在的, 对 key 的 value 进行追加,返回的是整个 value 的长度,如下示例:
192.168.100.3:6379> exists k4
(integer) 1
192.168.100.3:6379> get k4
"v4"
192.168.100.3:6379> append k4 newstring
(integer) 11
192.168.100.3:6379> get k4
"v4newstring"
# 如果要对 value 加空格的话
192.168.100.3:6379> append k4 " n1"
(integer) 14
192.168.100.3:6379> get k4
"v4newstring n1"
incr
和 decr
对数值 value 自增或自减,每次的幅度为 1。命令返回的是自增或自减后的数值结果
192.168.100.3:6379> set number:1 10 NX
OK
192.168.100.3:6379> incr number:1
(integer) 11
192.168.100.3:6379> decr number:1
(integer) 10
如果要指定自增或自减的幅度,可以使用 incrby
和 decrby
。请注意!幅度只可以是整数(正整数或负整数)
192.168.100.3:6379> incrby number:1 5
(integer) 15
192.168.100.3:6379> decrby number:1 2
(integer) 13
incrbyfloat
对数值 value 自增或自减,幅度可以是正整数、负整数、正小数、负小数。
192.168.100.3:6379> incrbyfloat number:1 -1.6
"11.4"
192.168.100.3:6379> incrbyfloat number:1 2
"13.4"
strlen
获取 key 的 value 的字符长度。一个字母、一个数字的长度为1
192.168.100.3:6379> strlen number:1
(integer) 4
getrange
截取字符串的子字符串,用法为——getrange key start end
start 和 end 表示偏移量,负数的偏移量表示从字符串的最后开始计数。0 偏移量表示第一个字符、-1 偏移量表示最后一个字符,比如:
192.168.100.3:6379> get k4
"v4newstring n1"
192.168.100.3:6379> GETRANGE k4 0 0
"v"
192.168.100.3:6379> GETRANGE k4 0 3
"v4ne"
192.168.100.3:6379> GETRANGE k4 0 -2
"v4newstring n"
192.168.100.3:6379> GETRANGE k4 -2 -1
"n1"
setrange
用用户指定的字符串替换 key 的一部分 value,用法为——setrange key offset value
offset 表示偏移量,0 偏移量表示从第一个字符开始替换,最长为 2^29 -1 (536870911)
# 比如要将"v4newstring n" 中的 new 替换为 NEW,可以执行以下命令:
## 返回的是字符长度
192.168.100.3:6379> setrange k4 2 NEW
(integer) 14
192.168.100.3:6379> get k4
"v4NEWstring n1"
# 字符串长度为14,即偏移量最大为13,如果偏移量设置为 17,会怎么样?在偏移量的 14、15、16处会使用 \x00 进行填充
192.168.100.3:6379> setrange k4 17 "123456"
(integer) 23
192.168.100.3:6379> get k4
"v4NEWstring n1\x00\x00\x00123456"