0
点赞
收藏
分享

微信扫一扫

Redis 常用指令

一、引言

在现代应用开发中,数据的快速读写和高效存储是确保系统性能的关键。Redis,作为一个开源的内存数据存储系统,以其极高的性能和丰富的数据结构被广泛应用于各种场景,如缓存、实时数据处理和消息队列等。它不仅能够存储字符串、哈希、列表、集合和有序集合等多种数据类型,还支持丰富的操作指令,极大地提高了开发者的灵活性和效率。

在实际开发中,掌握 Redis 的常用指令是高效利用这一强大工具的基础。无论是在构建高并发的 Web 应用,还是在处理大数据时,了解如何通过 Redis 的指令来操作数据、管理缓存、监控性能都是至关重要的。这些指令不仅简化了数据的存取过程,还提供了强大的功能,如事务、发布/订阅机制以及持久化选项,使得开发者可以更专注于业务逻辑的实现。

本篇博客将深入探讨 Redis 的常用指令,帮助读者更好地理解如何在不同场景下有效应用这些指令。我们将逐步介绍每个指令的用途、基本语法以及使用示例,让您在实际开发中能够迅速上手。同时,我们还会分享一些最佳实践,帮助您在使用 Redis 时避免常见的陷阱,从而提升系统的性能和可靠性。希望通过这篇博客,您能够全面掌握 Redis 的使用技巧,优化您的应用程序架构,为用户提供更加流畅的体验。

二、Redis 常用命令总结

2.1、全局命令总结

  1. keys:返回所有满足样式(pattern)的 key。支持如下统配样式:
  • h?llo 匹配 hellohallo hxllo(这里的 “?” 表示任意一个字符)
  • h*llo 匹配 hlloheeeello(这里的 “*” 表示任意数量的字符,包括零个字符)
  • h[ae]llo 匹配 hellohallo 但不匹配 hillo(这里的 “[ae]” 表示字符 a 或 e 中的任意一个)
  • h[^e]llo 匹配 hallohbllo,... 但不匹配 hello(这里的 “[^e]” 表示除了 e 之外的任意字符)
  • h[a-b]llo 匹配 hallohbllo(这里的 “[a-b]” 表示字符 a 到 b 之间的任意一个字符,包括a和b)
  1. exists:判断某个 key 是否存在。
  2. del:删除指定的 key。
  3. expire:为指定的 key 添加一个过期时间,单位是秒。
  4. ttl:查询某个 key 的过期时间,单位是秒。
  5. type:返回对应的 key 的数据类型。
  6. object encoding:查询 value 的内部编码。
  7. 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 的简单却强大,我们也可以通过不断积累,创造出更高效、更智能的系统,走向属于自己的技术巅峰。加油!

举报

相关推荐

0 条评论