一、引言
在现代应用开发中,数据的快速读写和高效存储是确保系统性能的关键。Redis,作为一个开源的内存数据存储系统,以其极高的性能和丰富的数据结构被广泛应用于各种场景,如缓存、实时数据处理和消息队列等。它不仅能够存储字符串、哈希、列表、集合和有序集合等多种数据类型,还支持丰富的操作指令,极大地提高了开发者的灵活性和效率。
在实际开发中,掌握 Redis 的常用指令是高效利用这一强大工具的基础。无论是在构建高并发的 Web 应用,还是在处理大数据时,了解如何通过 Redis 的指令来操作数据、管理缓存、监控性能都是至关重要的。这些指令不仅简化了数据的存取过程,还提供了强大的功能,如事务、发布/订阅机制以及持久化选项,使得开发者可以更专注于业务逻辑的实现。
本篇博客将深入探讨 Redis 的常用指令,帮助读者更好地理解如何在不同场景下有效应用这些指令。我们将逐步介绍每个指令的用途、基本语法以及使用示例,让您在实际开发中能够迅速上手。同时,我们还会分享一些最佳实践,帮助您在使用 Redis 时避免常见的陷阱,从而提升系统的性能和可靠性。希望通过这篇博客,您能够全面掌握 Redis 的使用技巧,优化您的应用程序架构,为用户提供更加流畅的体验。
二、Redis 常用命令总结
2.1、全局命令总结
- keys:返回所有满足样式(pattern)的 key。支持如下统配样式:
h?llo
匹配hello
,hallo
和hxllo
(这里的 “?” 表示任意一个字符)h*llo
匹配hllo
和heeeello
(这里的 “*” 表示任意数量的字符,包括零个字符)h[ae]llo
匹配hello
和hallo
但不匹配hillo
(这里的 “[ae]” 表示字符 a 或 e 中的任意一个)h[^e]llo
匹配hallo
,hbllo
,... 但不匹配hello
(这里的 “[^e]” 表示除了 e 之外的任意字符)h[a-b]llo
匹配hallo
和hbllo
(这里的 “[a-b]” 表示字符 a 到 b 之间的任意一个字符,包括a和b)
- exists:判断某个 key 是否存在。
- del:删除指定的 key。
- expire:为指定的 key 添加一个过期时间,单位是秒。
- ttl:查询某个 key 的过期时间,单位是秒。
- type:返回对应的 key 的数据类型。
- object encoding:查询 value 的内部编码。
- setnx:在 key 不存在的情况下才允许插入 key-value。
2.2、字符串类型命令总结
命令 | 执行效果 | 时间复杂度 |
set key value | 设置 key 的值是 value | O(1) |
set key value [ex seconds|px milliseconds] [nx|xx] [keepttl] | 下面详细解释 | O(1) |
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 的 value +1 | O(1) |
decr key | 指定的 key 的 value -1 | O(1) |
incrby key n | 指定的 key 的 value +n | O(1) |
decrby key n | 指定的 key 的 value -n | O(1) |
incrbyfloat key n | 指定的 key 的 value +n | O(1) |
append key value | 指定的 key 的 value 追加 value | O(1) |
strlen key | 获取指定 key 的 value 的长度 | O(1) |
setrange key offset value | 覆盖指定 key 的 value 从 offset 开始的部分值 | O(n),n 是字符串长度, 通常视为 O(1) |
getrange key start end | 获取指定 key 的 value 从 start 到 end 的部分 | O(n),n 是字符串长度, 通常视为 O(1) |
2.3、set key value [ex seconds|px milliseconds] [nx|xx] [keepttl]
这种 set 命令是 Redis 中 set 命令的扩展形式,允许您在设置键值时指定额外的选项。具体含义如下:
- key:要设置的键。
- value:该键对应的值。
- [ex seconds]:可选参数,设置键的过期时间,单位是秒。
- [px milliseconds]:可选参数,设置键的过期时间,单位是毫秒。
- [nx]:可选参数,仅在键不存在时设置键值。
- [xx]:可选参数,仅在键已存在时更新键值。
- [keepttl]:可选参数,在更新键值时保留其剩余的过期时间。
通过这些选项,您可以更灵活地控制键的设置和过期行为。
2.4、哈希类型命令总结
命令 | 执行效果 | 时间复杂度 |
hset key field value | 设置值 | O(1) |
hget key field | 获取值 | O(1) |
hdel key field [field ...] | 删除 field | O(k),k 是 field 个数 |
hlen key | 计算 field 个数 | O(1) |
hgetall key | 获取全部 field - value | O(k),k 是 field 个数 |
hmget key field [field ...] | 批量获取指定 key 的 field-value | O(k),k 是 field 个数 |
hmset key field value [field value ...] | 批量获取 field-value | O(k),k 是 field 个数 |
hexists key field | 判断 field 是否存在 | O(1) |
hkeys key | 获取所有的 field | O(k),k 是 field 个数 |
hvals key | 获取所有的 value | O(k),k 是 value 个数 |
hsetnx key field value | 设置值,但必须在 field 不存在时才能设置成功 | O(1) |
hincrby key field n | field 对应的 value + n | O(1) |
hincrbyfloat key field n | field 对应的 value + n | O(1) |
hstrlen key field | 计算 value 的字符串长度 | O(1) |
2.5、列表类型命令总结
操作类型 | 命令 | 时间复杂度 |
添加 | rpush key value [value ...] | O(k),k 是元素个数 |
lpush key value [value ...] | O(k),k 是元素个数 | |
linsert key before | after pivot value | O(n),n 是 pivot 距离头尾的距离 | |
查找 | lrange key start end | O(s+n),s 是 start 偏移量,n 是 start 到 end 的范围 |
lindex key index | O(n),n 是索引的偏移量 | |
llen key | O(1) | |
删除 | lpop key | O(1) |
rpop key | O(1) | |
lrem key count value | O(k),k 是元素个数 | |
ltrim key start end | O(k),k 是元素个数 | |
修改 | lset key index value | O(n),n 是索引的偏移量 |
阻塞操作 | blpop brpop | O(1) |
2.6、集合类型命令总结
命令 | 执行效果 | 时间复杂度 |
sadd key element [element ...] | 将⼀个或者多个元素添加到 set 中。注意,重复的元素无法添加到 set 中。 | O(k),k 是元素个数 |
srem key element [element ...] | 从集合 key 中移除一个或多个指定的元素。 | O(k),k 是元素个数 |
scard key | 返回集合 key 中的元素个数。 | O(1) |
sismember key element | 检查元素是否存在于集合 key 中,返回 1 表示存在,0 表示不存在。 | O(1) |
srandmember key [count] | 从集合 key 中随机返回一个或多个元素,但不会将它们移除。如果提供了 count,则返回多个随机元素。 | O(n),n 是 count |
spop key [count] | 随机移除并返回集合 key 中的 count 个元素。 | O(n),n 是 count |
smembers key | 返回集合 key 中的所有元素。 | O(k),k 是元素个数 |
sinter key [key ...] | 返回一个或多个集合的交集。 | O(m * k),k 是几个集合中元素最小的个数,m 是键个数 |
sitnerstore destination key [key ...] | 获取给定 set 的交集中的元素并保存到目标 set 中。 | O(N * M),N 是最小的集合元素个数。M 是最大的集合元素个数。 |
sunion key [key ...] | 返回一个或多个集合的并集。 | O(k),k 是多个集合的元素个数总和 |
sunionstore destination key [key ...] | 获取给定 set 的并集中的元素并保存到目标 set 中。 | O(N),N 给定的所有集合的总的元素个数 |
sdiff key [key ...] | 获取给定 set 的差集中的元素。 | O(k),k 是多个集合的元素个数总和 |
sdiffstore destination key [key ...] | 获取给定 set 的差集中的元素并保存到⽬标 set 中。 | O(N),N 给定的所有集合的总的元素个数 |
2.7、有序列表类型命令总结
命令 | 执行效果 | 时间复杂度 |
zadd key score member [score member ...] | 下面详细解释。 | O(k * log(n)),k 是添加成员的个数,n 是当前有序集合的元素个数 |
zcard key | 获取 zset 中的元素个数。 | O(1) |
zscore key member | 返回指定元素的分数。 | O(1) |
zrank key member | 返回指定元素的排名,升序。 | O(log(n)),n 是当前有序集合的元素个数 |
zrevrank key member | 返回指定元素的排名,降序。 | O(log(n)),n 是当前有序集合的元素个数 |
zrem key member [member ...] | 删除指定元素。 | O(k * log(n)),k 是删除成员的个数,n 是当前有序集合的元素个数 |
zincrby key increment member | 为指定的元素的关联分数添加指定的分数值。 | O(log(n)),n 是当前有序集合的元素个数 |
zrange key start stop [withscores] | 返回指定区间里的元素,分数按照升序。带上 withscores 可以把分数也返回。 | O(k + log(n)),k 是获取成员的个数,n 是当前有序集合的元素个数 |
zrevrange key start stop [withscores] | 返回指定区间里的元素,分数按照降序。带上 withscores 可以把分数也返回。 | O(k + log(n)),k 是获取成员的个数,n 是当前有序集合的元素个数 |
zrangebyscore key min max [withscores] | 返回分数在 min 和 max 之间的元素,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。带上 withscores可以把分数也返回。 | O(k + log(n)),k 是获取成员的个数,n 是当前有序集合的元素个数 |
zrevrangebyscore key max min [withscores] | 根据指定的 min 和 max 的值指定范围,逆序返回集合中的元素。 | O(k + log(n)),k 是获取成员的个数,n 是当前有序集合的元素个数 |
zpopmax key [count] | 删除并返回分数最高的 count 个元素。 | O(log(N) * M) |
zpopmin key [count] | 删除并返回分数最低的 count 个元素。 | O(log(N) * M) |
bzpopmax key [count] timeout | zpopmax 的阻塞版本 | O(log(N)) |
bzpopmin key [count] timeout | zpopmin 的阻塞版本 | O(log(N)) |
zcount key min max | 返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过 '(' 排除。 | O(log(n)),n 是当前有序集合的元素个数 |
zremrangebyrank key start stop | 按照排序,升序删除指定范围的元素,左闭右闭。 | O(k + log(n)),k 是获取成员的个数,n 是当前有序集合的元素个数 |
zremrangebyscore key min max | 按照分数删除指定范围的元素,左闭右闭。 | O(k + log(n)),k 是获取成员的个数,n 是当前有序集合的元素个数 |
zinterstore destination numkeys key [key ...] [weights weight[weight ...]] [aggregate <sum| min | max>] | 求出给定有序集合中元素的交集并保存进目标有序集合中,在合并过程中以元素为单位进行合并,元素对应的分数按照不同的聚合方式和权重得到新的分数。 | O(n * k) + O(m * log(m)),n 是输入的集合最小的元素个数, k 是集合个数, m 是目标集合元素个数 |
zunionstore destination numkeys key [key ...] [weights weight[weight ...]] [aggregate < sum| min | max>] | 求出给定有序集合中元素的并集并保存进目标有序集合中,在合并过程中以元素为单位进行合并,元素对应的分数按照不同的聚合方式和权重得到新的分数。 | O(n) + O(m * log(m)),n 是输入集合总元素个数,m 是目标集合元素个数 |
2.8、zadd key score member [score member ...]
添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf 或 -inf 作为正负极限也是合法的。
ZADD 的相关选项:
- XX:仅仅用于更新已经存在的元素,不会添加新元素。
- NX:仅用于添加新元素,不会更新已经存在的元素。
- CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
- INCR:此时命令类似 zincrby 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。
【语法】zadd key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]
2.9、列表,集合,有序集合三者区别
数据结构 | 是否允许重复元素 | 是否有序 | 有序依据 | 应用场景 |
列表 | 是 | 是 | 索引下标 | 时间轴、消息队列等 |
集合 | 否 | 否 | 标签、社交等 | |
有序集合 | 否 | 是 | 分数 | 排行榜系统、社交等 |
三、总结
在本文中,我们系统地介绍了 Redis 常用命令及其具体应用,涵盖了字符串、哈希、集合、有序集合等不同数据类型的操作方式。同时,我们深入讨论了 Redis 的键管理、过期机制以及持久化策略,帮助开发者更好地掌握 Redis 的核心功能和使用场景。在应用层面,Redis 通过其高效的读写性能、丰富的数据结构、以及灵活的操作命令,成为了解决高并发和大规模数据访问问题的强有力工具。通过这些示例和分析,相信大家对 Redis 的使用有了更深入的了解,也能够在项目中更好地发挥 Redis 的优势。
四、结语
Redis 不仅是技术的体现,更是创新思维的工具。无论是提升系统性能,还是优化数据存储与处理,Redis 都为开发者打开了更多可能性的大门。未来的技术之路上,每一个挑战都是成长的契机。保持对技术的热情与专注,不断学习与实践,你终将在代码的世界中找到属于自己的辉煌。正如 Redis 的简单却强大,我们也可以通过不断积累,创造出更高效、更智能的系统,走向属于自己的技术巅峰。加油!