Redis命令大全:详细教程与实战 – wiki大全

My apologies. I do not have a write_file tool. I will output the article content directly, and you can save it to a file.


Redis命令大全:详细教程与实战

简介

Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息代理。由于其出色的性能(数据存储在内存中)和丰富的数据结构(如字符串、哈希、列表、集合、有序集合等),Redis 在现代 Web 应用开发中扮演着越来越重要的角色。

掌握 Redis 命令是高效使用 Redis 的基础。本文将为您详细介绍 Redis 的核心命令,并提供实战示例,帮助您从入门到精通。

Redis 核心概念

在使用 Redis 命令之前,了解其两个核心概念至关重要:

  1. 键 (Keys):Redis 是一个键值存储系统,所有数据都通过键来访问。键可以是任何二进制字符串,但通常建议使用有意义且易于理解的命名规范(如 user:1001:name)。

    • KEYS pattern: 查找所有符合给定模式的键。
    • EXISTS key: 检查给定键是否存在。
    • DEL key [key ...]: 删除一个或多个键。
    • EXPIRE key seconds: 设置键的过期时间,单位为秒。
    • TTL key: 查看键的剩余生存时间(Time To Live),-1 表示永不失效,-2 表示键不存在。
  2. 数据类型 (Data Types):Redis 支持五种主要的数据类型,每种数据类型都有一套专属的命令集。选择合适的数据类型对于优化存储和性能至关重要。

    • String (字符串): 最基本的数据类型,可以存储文本、数字或二进制数据。
    • Hash (哈希): 存储键值对的集合,适用于存储对象。
    • List (列表): 按照插入顺序排序的字符串元素集合,可以实现栈、队列等功能。
    • Set (集合): 无序、不重复的字符串元素集合。
    • Sorted Set (有序集合): 集合的基础上,每个成员关联一个分数 (score),成员按分数从小到大排序,分数相同时按字典顺序排序。

详细命令教程与实战

1. String (字符串)

字符串是 Redis 最基本的数据类型,一个键对应一个值。

命令 描述 示例
SET key value 设置指定键的值。 SET mykey "Hello Redis"
GET key 获取指定键的值。 GET mykey -> "Hello Redis"
MSET key value [key value ...] 同时设置多个键值对。 MSET key1 "v1" key2 "v2"
MGET key [key ...] 同时获取多个键的值。 MGET key1 key2 -> ["v1", "v2"]
INCR key 将键的值原子性地递增 1。 SET counter 10; INCR counter -> 11
DECR key 将键的值原子性地递减 1。 DECR counter -> 10
INCRBY key increment 将键的值原子性地递增指定数值。 INCRBY counter 5 -> 15
DECRBY key decrement 将键的值原子性地递减指定数值。 DECRBY counter 3 -> 12
APPEND key value 将给定值追加到键的末尾。 SET mykey "Hello"; APPEND mykey " World" -> "Hello World"
STRLEN key 获取键所储存的字符串值的长度。 GET mykey -> "Hello World"; STRLEN mykey -> 11

实战场景:
* 缓存: 存储 JSON 字符串或序列化对象。
* 计数器: 网站访问量、点赞数等。
* 限流: 结合 EXPIREINCR 实现每秒请求数限制。

2. Hash (哈希)

哈希表是键值对的集合。在 Redis 中,一个哈希键可以存储多个字段 (field) 和值 (value) 的映射。

命令 描述 示例
HSET key field value 将哈希表 key 中的字段 field 的值设置为 value HSET user:1001 name "Alice" age 30
HGET key field 获取哈希表 key 中字段 field 的值。 HGET user:1001 name -> "Alice"
HMSET key field value [field value ...] 同时将多个 field-value 对设置到哈希表中。 HMSET product:1002 name "Book" price 29.99
HMGET key field [field ...] 同时获取哈希表中一个或多个字段的值。 HMGET user:1001 name age -> ["Alice", "30"]
HGETALL key 获取哈希表中所有字段和值。 HGETALL user:1001 -> ["name", "Alice", "age", "30"]
HDEL key field [field ...] 删除哈希表 key 中的一个或多个指定字段。 HDEL user:1001 age
HLEN key 获取哈希表中字段的数量。 HLEN user:1001 -> 1 (因为age被删了)
HEXISTS key field 检查哈希表 key 中是否存在指定字段。 HEXISTS user:1001 name -> 1 (存在)

实战场景:
* 存储对象信息: 存储用户信息、商品信息等,每个字段对应对象的属性。
* 购物车: 以用户 ID 为键,商品 ID 和数量为字段值。

3. List (列表)

列表是一个双向链表,可以从两端添加或移除元素。元素是按插入顺序排序的。

命令 描述 示例
LPUSH key value [value ...] 将一个或多个值插入到列表的头部。 LPUSH mylist "a" "b" -> ["b", "a"]
RPUSH key value [value ...] 将一个或多个值插入到列表的尾部。 RPUSH mylist "c" "d" -> ["b", "a", "c", "d"]
LPOP key 移除并返回列表的第一个元素。 LPOP mylist -> "b", 列表变为 ["a", "c", "d"]
RPOP key 移除并返回列表的最后一个元素。 RPOP mylist -> "d", 列表变为 ["a", "c"]
LRANGE key start stop 获取列表指定范围内的元素。 LRANGE mylist 0 -1 -> ["a", "c"]
LLEN key 获取列表的长度。 LLEN mylist -> 2
LINSERT key BEFORE|AFTER pivot value pivot 元素之前或之后插入 value LINSERT mylist BEFORE "c" "x" -> ["a", "x", "c"]

实战场景:
* 消息队列: LPUSH 生产消息,RPOP 消费消息。
* 最新动态/时间线: 存储最新发布的内容。
* 排行榜: 存储最近的得分记录。

4. Set (集合)

集合是无序、不重复的字符串元素集合。

命令 描述 示例
SADD key member [member ...] 将一个或多个成员添加到集合中。 SADD myset "apple" "banana"
SMEMBERS key 返回集合中的所有成员。 SMEMBERS myset -> ["apple", "banana"]
SISMEMBER key member 判断成员是否是集合的成员。 SISMEMBER myset "apple" -> 1 (是)
SREM key member [member ...] 移除集合中的一个或多个成员。 SREM myset "banana"
SCARD key 获取集合的成员数。 SCARD myset -> 1
SPOP key [count] 随机移除并返回集合中的一个或多个成员。 SADD myset "orange" "grape"; SPOP myset -> "orange"
SUNION key [key ...] 返回给定所有集合的并集。 SADD set1 "a" "b"; SADD set2 "b" "c"; SUNION set1 set2 -> ["a", "b", "c"]
SINTER key [key ...] 返回给定所有集合的交集。 SINTER set1 set2 -> ["b"]
SDIFF key [key ...] 返回给定第一个集合与后面所有集合的差集。 SDIFF set1 set2 -> ["a"]

实战场景:
* 标签系统: 存储文章的标签。
* 共同好友/关注: 利用集合的交集、并集、差集操作。
* 抽奖: SPOP 随机抽取中奖用户。
* 统计独立 IP 访问: 每天将访问 IP 加入集合。

5. Sorted Set (有序集合)

有序集合是集合的升级版,每个成员都关联一个分数,集合中的成员根据分数进行排序。分数可以重复,成员不能重复。

命令 描述 示例
ZADD key score member [score member ...] 将一个或多个成员及其分数添加到有序集合中。 ZADD myzset 100 "Alice" 90 "Bob"
ZRANGE key start stop [WITHSCORES] 返回有序集合中指定索引范围内的成员。 ZRANGE myzset 0 -1 WITHSCORES -> ["Bob", "90", "Alice", "100"]
ZREVRANGE key start stop [WITHSCORES] 返回有序集合中指定索引范围内的成员(分数从大到小)。 ZREVRANGE myzset 0 -1 -> ["Alice", "Bob"]
ZRANK key member 返回有序集合中成员的排名(从 0 开始)。 ZRANK myzset "Bob" -> 0 (因为 Bob 分数最低)
ZSCORE key member 返回有序集合中成员的分数。 ZSCORE myzset "Alice" -> "100"
ZREM key member [member ...] 移除有序集合中的一个或多个成员。 ZREM myzset "Bob"
ZCARD key 获取有序集合的成员数。 ZCARD myzset -> 1

实战场景:
* 排行榜: 游戏得分排行榜、热门文章排行榜。
* 带有权重的任务队列: 优先级越高的任务分数越高。

高级主题 (简述)

1. 事务 (Transactions)

Redis 事务允许您将一组命令打包,然后一次性按顺序执行,期间不会被其他客户端的命令打断,保证了原子性。

  • MULTI: 标记事务块的开始。
  • EXEC: 执行所有事务块内的命令。
  • DISCARD: 取消事务,放弃执行事务块内的所有命令。
  • WATCH key [key ...]: 在事务执行前监视任意数量的键,如果在 EXEC 命令执行之前,被监视的键被其他命令修改了,那么事务将被打断。

2. 发布/订阅 (Publish/Subscribe)

发布/订阅模式允许客户端发送消息(publish)到频道(channel),其他订阅(subscribe)了该频道的客户端会收到消息。

  • PUBLISH channel message: 将消息发送到指定频道。
  • SUBSCRIBE channel [channel ...]: 订阅一个或多个频道。
  • PSUBSCRIBE pattern [pattern ...]: 订阅一个或多个模式匹配的频道。

3. 持久化 (Persistence)

Redis 提供了两种持久化机制,确保数据在服务器重启后不会丢失:

  • RDB (Redis Database): 快照持久化,在指定的时间间隔内将内存中的数据集快照写入磁盘。
  • AOF (Append Only File): 追加文件持久化,记录服务器接收到的所有写操作命令。

4. Lua 脚本 (Lua Scripting)

Redis 支持使用 Lua 脚本来执行复杂的操作,这可以减少网络延迟,并保证原子性。

  • EVAL script numkeys key [key ...] arg [arg ...]: 执行 Lua 脚本。

最佳实践与技巧

  • 键命名规范: 使用 :. 来组织键名,提高可读性和管理性(例如 app:module:id:field)。
  • 合理使用过期时间: 为不重要的缓存数据设置过期时间,避免内存过度占用。
  • 使用管道 (Pipelining): 将多个命令一次性发送给 Redis 服务器,减少网络往返时间(RTT),提高性能。
  • 选择合适的数据类型: 根据数据的特性和操作需求,选择最适合的 Redis 数据类型。例如,存储用户对象时,哈希通常比字符串更高效。
  • 避免大键: 存储过大的字符串、列表、集合等可能导致性能问题和阻塞。
  • 监控 Redis: 定期监控 Redis 的性能指标,如内存使用、CPU 使用、连接数等。

总结

Redis 凭借其高性能、丰富的数据结构和灵活的扩展性,已成为现代应用程序不可或缺的组件。本文详细介绍了 Redis 的主要命令,涵盖了从基本数据类型操作到高级功能的方方面面。通过深入理解和实践这些命令,您将能够更有效地利用 Redis 的强大功能,构建出高效、稳定的应用程序。

持续学习和实践是掌握 Redis 的关键。建议您结合实际项目,不断尝试和探索 Redis 的更多可能性。祝您在 Redis 的世界里游刃有余!

滚动至顶部