Redis 的存储类型以及常用命令
Redis 的数据类型
Redis 的数据类型有 5 种,分别是 String,List,Set,Zset,Hash
String 类型
Redis 字符串存储字节序列,包括文本、序列化对象和二进制数组。因此,字符串是最基本的 Redis 数据类型。它们通常用于缓存,但它们支持额外的功能,允许实现计数器并执行逐位操作。
默认情况下,单个 Redis 字符串最多可以为 512 MB。
大多数字符串操作都是 O(1),这意味着它们非常高效。但是,请注意 SUBSTR、GETRANGE 和 SETRANGE 命令,它们可以是 O(n)。处理大字符串时,这些随机访问字符串命令可能会导致性能问题。
常用操作命令表格:
| 命令 | 说明 |
|---|---|
| set | 设置一个 key/value |
| get | 根据 key 获得对应的 value |
| mset | 一次设置多个 key value (mset key value key value..) |
| mget | 一次获得多个 key 的 value (mget key key …) |
| strlen | 获得对应 key 存储 value 的长度 |
| append | 为对应 key 的 value 追加内容 |
| getrange 索引 0 开始 | 截取 value 的内容 |
| setex | 设置一个 key 存活的有效期(秒) |
| psetex | 设置一个 key 存活的有效期(毫秒) |
| setnx | 存在不做任何操作,不存在添加 |
| msetnx 原子操作(只要有一个存在不做任何操作) | 可以同时设置多个 key,只有有一个存在都不保存 |
| decr | 进行数值类型的-1 操作 |
| decrby | 根据提供的数据进行减法操作 |
| Incr | 进行数值类型的+1 操作 |
| incrby | 根据提供的数据进行加法操作 |
| Incrbyfloat | 根据提供的数据加入浮点数 |
set
set 命令用于设置键以保存字符串值。若键已经保存了一个值,不管其类型如何,它都会被覆盖。成功的 SET 操作将丢弃与密钥相关联的任何先前生存时间。
语法格式
1 | |
选项
SET 命令支持一组修改其行为的选项:
- NX 仅当 key 不存在时才设置 key,与 XX 互斥。
- XX 仅当 key 存在时才设置 key,与 NX 互斥。
- EX 设置 key 的过期时间,以秒为单位。
- PX 设置 key 的过期时间,以毫秒为单位。
- EXAT 设置 key 过期的指定 Unix 时间,以秒为单位。
- PXAT 设置 key 过期的指定 Unix 时间,以毫秒为单位。
- KEEPTTL 保留与 key 关联的生存时间。
返回值
简单字符串回复:如果 SET 执行正确,则 OK。
空回复:(nil)如果由于用户指定了 NX 或 XX 选项而未执行 SET 操作,但不满足条件。
示例
1 | |
get
get 命令获取 key 的值。如果键不存在,则返回特殊值 nil。如果键处存储的值不是字符串,则返回错误,因为 GET 只处理字符串值。
语法格式
1 | |
返回值
返回 key 的值,或当 key 不存在时为 nil。
示例
1 | |
mset
mset 命令用于批次设置 key,一次设置多个 key value
语法格式
1 | |
返回值
始终正常,因为 MSET 不会失败。
示例
1 | |
mget
mget 命令用于一次获得 key 的 value
语法格式
1 | |
返回值
指定 key 的值列表。
示例
1 | |
strlen
strlen 命令获得对应 key 存储 value 的长度
语法格式
1 | |
返回值
key 的字符串长度,或 key 不存在时为 0。
示例
1 | |
append
append 命令为对应 key 的 value 追加内容,如果键已经存在并且是一个字符串,则此命令会在字符串末尾追加值。若键不存在,它将被创建并设置为空字符串,所以在这种特殊情况下,APPEND 将类似于 set。
语法格式
1 | |
返回值
追加操作后的字符串长度。
示例
1 | |
setex
setex 命令设置 key 保存字符串值,并设置 key 在给定秒数后超时。此命令相当于执行以下命令:
1 | |
SETEX 是原子级的,可以通过使用 MULTI/EXEC 块中的前两个命令来复制。它是作为给定操作序列的一个更快的替代品提供的,因为当 Redis 用作缓存时,此操作非常常见。秒无效时返回错误。
语法格式
1 | |
返回值
简单回复字符串
示例
1 | |
psetex
psetex 的工作方式与 setex 完全相同,唯一的区别是过期时间以毫秒而不是秒为单位。
语法格式
1 | |
示例
1 | |
setnx
如果键不存在,则将键设置为用户给定的字符串值。在这种情况下,它等于 SET。当键已经持有一个值时,不执行任何操作。SETNX 是“SET if Not exists”的缩写
语法格式
1 | |
返回值
整数回复,具体来说:
- 如果设置了键,则为 1
- 如果未设置密钥,则为 0
示例
1 | |
msetnx
将给定的键设置为其各自的值。即使只存在一个密钥,MSETNX 也不会执行任何操作。
由于这种语义,可以使用 MSETNX 来设置代表唯一逻辑对象的不同字段的不同键,以确保设置所有字段或根本不设置任何字段。
MSETNX 是原子的,因此所有给定的键都是一次性设置的。客户端无法看到某些密钥已更新,而其他密钥未更改。
语法格式
1 | |
返回值
整数回复,具体来说:
- 如果设置了所有键,则为 1。
- 如果未设置键(至少已存在一个密钥),则为 0。
示例
1 | |
decr
将存储在键上的数字减 1。如果键不存在,则在执行操作之前将其设置为 0。如果键包含错误类型的值或包含无法表示为整数的字符串,则返回错误。此操作仅限于 64 位有符号整数。
语法格式
1 | |
返回值
整数回复:减后的键值
示例
1 | |
decrby
将存储在键上的数字递减。如果键不存在,则在执行操作之前将其设置为 0。如果键包含错误类型的值或包含无法表示为整数的字符串,则返回错误。此操作仅限于 64 位有符号整数。
语法格式
1 | |
返回值
整数回复:减后的键值
示例
1 | |
incr
将存储在键上的数字增加一。如果键不存在,则在执行操作之前将其设置为 0。如果键包含错误类型的值或包含无法表示为整数的字符串,则返回错误。此操作仅限于 64 位有符号整数。
注意:这是一个字符串操作,因为 Redis 没有专用的整数类型。存储在键上的字符串被解释为以 10 为基数的 64 位有符号整数,以执行操作。
Redis 以整数表示形式存储整数,因此对于实际包含整数的字符串值,不需要存储整数的字符串表示形式。
语法格式
1 | |
返回值
整数回复:加后的键值
示例
1 | |
incrby
按增量递增存储在键上的数字。如果键不存在,则在执行操作之前将其设置为 0。如果键包含错误类型的值或包含无法表示为整数的字符串,则返回错误。此操作仅限于 64 位有符号整数。
语法格式
1 | |
返回值
整数回复:加后的键值
示例
1 | |
List 类型
单键多值 redis 列表是简单的字符串列表,按照插入顺序排序。 你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际上是使用双向链表实现的,对两端的操作性能很高,通过索引下标操作中间节点性能会较差。
常用的工作指令
| 命令 | 说明 |
|---|---|
| lpush | 将某个值加入到一个 key 列表头部 |
| lpushx | 同 lpush,但是必须要保证这个 key 存在 |
| rpush | 将某个值加入到一个 key 列表末尾 |
| rpushx | 同 rpush,但是必须要保证这个 key 存在 |
| lpop | 返回和移除列表左边的第一个元素 |
| rpop | 返回和移除列表右边的第一个元素 |
| lrange | 获取某一个下标区间内的元素(lrange 起始下标 终点下标) 0-1 表示返回所有元素 |
| llen | 获取列表元素个数 |
| lset | 设置某一个指定索引的值(索引必须存在) |
| lindex | 获取某一个指定索引位置的元素 |
| lrem | 删除重复元素 (lerm 要删除重复元素的个数 要删除的重复值) |
| ltrim | 保留列表中特定区间内的元素 |
| linsert | 在某一个元素之前,之后插入新元素(linsert [要插入的列表名] [before 或者 after] 要插入位置元素名 要插入的元素值) |
Set 类型
redis set 对外提供的功与 list 类似,是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要 存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择。
redis 的 set 是 string 类型的无序集合,他的底层实际是一个 value 为 null 的 hash 表,收益添加,删除,查 找复杂度都是 O(1)。 一个算法,如果时间复杂度是 O(1),那么随着数据的增加,查找数据的时间不变,也就是不管数据多 少,查找时间都是一样的。

Set 的常用命令列表
| 命令 | 说明 |
|---|---|
| sadd | 为集合添加元素 |
| smembers | 显示集合中所有元素 无序 |
| scard | 返回集合中元素的个数 |
| spop | 随机返回一个元素 并将元素在集合中删除 |
| smove | 从一个集合中向另一个集合移动元素 必须是同一种类型 |
| srem | 从集合中删除一个元素 |
| sismember | 判断一个集合中是否含有这个元素 |
| srandmember | 随机返回元素 |
| sdiff | 去掉第一个集合中其它集合含有的相同元素 |
| sinter | 求交集 |
| sunion | 求和集 |
ZSet
redis 有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分 到最高分的方式排序集合中的成员。
集合的成员是唯一的,但是评分是可以重复的。
因为元素是有序的,所以你可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
访问有序集合中的中间元素也是非常快的,因为你能够使用有序集合作为一个没有重复成员你的智能列表。
| 命令 | 说明 |
|---|---|
| zadd | 添加一个有序集合元素 |
| zcard | 返回集合的元素个数 |
| zrange 升序 zrevrange 降序 | 返回一个范围内的元素 |
| zrangebyscore | 按照分数查找一个范围内的元素 |
| zrank | 返回排名 |
| zrevrank | 倒序排名 |
| zscore | 显示某一个元素的分数 |
| zrem | 移除某一个元素 |
| zincrby | 给某个特定元素加分 |
Hash
Redis hash 是一个键值对集合。 Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
| 命令 | 说明 |
|---|---|
| hset | 设置一个key/value对 |
| hget | 获得一个key对应的value |
| hgetall | 获得所有的key/value对 |
| hdel | 删除某一个key/value对 |
| hexists | 判断一个key是否存在 |
| hkeys | 获得所有的key |
| hvals | 获得所有的value |
| hmset | 设置多个key/value |
| hmget | 获得多个key的value |
| hsetnx | 设置一个不存在的key的值 |
| hincrby | 为value进行加法运算 |
| hincrbyfloat | 为value加入浮点值 |