Redis设计与实现——Redis命令参考与高级特性

简介: Redis 是一个高性能的键值存储系统,支持丰富的数据类型(字符串、列表、哈希、集合等)和多种高级功能。本文档涵盖 Redis 的核心命令分类,包括数据类型操作、事务与脚本、持久化、集群管理、系统监控等。特别介绍了事务的原子性特性、Lua 脚本的执行方式及优势、排序机制、发布订阅模型以及慢查询日志和监视器工具的使用方法。适用于开发者快速掌握 Redis 常用命令及其应用场景,优化系统性能与可靠性。

Redis命令参考

数据类型相关命令

  • SET:设置键值,支持过期时间、不存在/存在条件。
  • GET:获取键值,若键不存在返回 nil
  • INCR/DECR:将键的整数值增1/减1,键不存在时初始化为0。
  • MSET/MGET:批量设置/获取多个键值。
  • LPUSH/RPUSH:从列表左/右侧插入元素。
  • LPOP/RPOP:移除并返回列表左/右侧第一个元素。
  • LRANGE:获取列表指定范围的元素。
  • HSET/HGET:设置/获取哈希字段值。
  • HGETALL:获取哈希所有字段和值。
  • HINCRBY:哈希字段整数值增加指定数值。
  • SADD/SREM:添加/移除集合元素。
  • SMEMBERS:返回集合所有元素(慎用大集合)。
  • SINTER/SUNION:返回多个集合的交集/并集。
  • ZADD:添加带分值的成员到有序集合。
  • ZRANGE/ZREVRANGE:按分值升序/降序返回有序集合成员。
  • ZINCRBY:增加有序集合成员的分值。

事务与脚本

  • MULTI:开启事务,后续命令入队。
  • EXEC:执行事务队列中的所有命令。
  • WATCH/UNWATCH:监视键变化,若被修改则事务中止。
  • EVAL:执行Lua脚本,支持原子性操作。
  • EVALSHA:通过SHA1执行缓存的脚本。
  • SCRIPT LOAD:加载脚本到缓存,返回SHA1摘要。

持久化与备份

  • SAVE:同步生成RDB快照,阻塞主线程。
  • BGSAVE:异步生成RDB快照,子进程执行。
  • LASTSAVE:返回最后一次成功生成RDB的时间戳。
  • BGREWRITEAOF:异步重写AOF文件,优化体积。
  • APPEND:追加值到键(底层AOF操作)。

集群与高可用

  • SLAVEOF/REPLICAOF:将当前节点设置为指定主节点的从节点。
  • CLUSTER INFO:返回集群基本信息(状态、槽分配)。
  • CLUSTER NODES:列出集群所有节点的详细信息。
  • CLUSTER ADDSLOTS:将指定哈希槽分配给当前节点。
  • SENTINEL MASTERS:列出被监控的主节点信息。
  • SENTINEL GET-MASTER-ADDR-BY-NAME:获取主节点地址。

系统管理与监控

  • CLIENT LIST:列出所有客户端连接信息。
  • CLIENT KILL:关闭指定客户端连接。
  • INFO:返回服务器状态信息(内存、CPU、复制等)。
  • SLOWLOG:查看慢查询日志。
  • MONITOR:实时监控所有命令(生产环境慎用)。

高级功能

  • SUBSCRIBE/PUBLISH/UNSUBSCRIBE:订阅/发布/取消订阅频道消息。
  • GEOADD:添加地理位置坐标。
  • GEODIST:计算两地距离。
  • GEORADIUS:返回指定半径内的位置。

其他实用命令

  • KEYS/SCAN:查找匹配模式的键(SCAN 非阻塞迭代)。
  • TTL/PTTL:获取键的剩余过期时间(秒/毫秒)。
  • EXPIRE/PEXPIRE:设置键的过期时间(秒/毫秒)。
  • TYPE:返回键的数据类型。
  • DEL:删除指定键。

事务

事务的核心命令

  • MULTI:标记事务开始,后续命令按顺序入队,暂不执行。
  • EXEC:执行事务队列中的所有命令,返回各命令的结果。
  • DISCARD:取消事务,清空命令队列。
  • WATCH \:监视指定键,若事务执行前键被修改,则事务终止(类似 CAS 机制)。
  • UNWATCH:取消所有 WATCH 监控。

事务的特性

  • 原子性EXEC 执行时,所有命令按顺序一次性执行,不会被其他客户端命令打断。
  • 无回滚:若命令入队时语法错误,事务直接拒绝执行;运行时错误(如对字符串执行 INCR)会继续执行后续命令。
  • 隔离性:事务执行期间不会被其他客户端操作干扰(单线程模型保证)。
  • 无持久性:是否持久化取决于 Redis 的持久化配置(RDB/AOF)。

适用场景

  • 批量操作原子性:如批量更新计数器、配置项。
  • 简单 CAS 操作:结合 WATCH 实现乐观锁,避免竞态条件(如库存扣减、余额转账)。
  • 非回滚型任务:无需回滚的连续操作(如日志记录、状态标记)。

生产环境建议

  • 避免长事务:事务队列命令过多会阻塞其他客户端,影响性能。
  • 优先使用 Lua:复杂逻辑用 Lua 脚本替代事务,减少网络开销。
  • 合理使用 WATCH:监控最少数量的键,降低冲突概率。

Lua脚本

Lua 脚本的核心优势

  • 原子性:脚本整体执行,期间不会被其他命令中断,保证数据一致性。
  • 减少网络开销:合并多个操作到单个脚本,减少客户端与服务端的通信次数。
  • 复杂逻辑支持:支持条件判断、循环、变量等编程结构,灵活处理业务逻辑。
  • 高性能:脚本在服务端执行,避免多次网络往返,提升吞吐量。

Lua 脚本的执行方式

  • EVAL 命令格式EVAL <script> <numkeys> [KEYS...] [ARGV...]

    • script:Lua 脚本代码。
    • numkeys:键参数的数量(KEYS 数组长度)。
    • KEYS:键名列表(避免硬编码,通过参数传递)。
    • ARGV:额外参数列表(如数值、标志位)。
  • 缓存脚本执行

    • 预加载脚本SCRIPT LOAD "return redis.call('GET', KEYS[1])"
    • 通过 SHA1 执行EVALSHA abcdef12345... 1 user:1

Lua 脚本与 Redis 命令的交互

  • 调用 Redis 命令

    • redis.call():执行 Redis 命令,若命令出错(如键不存在),直接返回错误并终止脚本。

      local value = redis.call('GET', KEYS[1])
      
    • redis.pcall():执行 Redis 命令,出错时返回 Lua 错误表,脚本继续执行。

      local ok, result = pcall(redis.call, 'GET', KEYS[1])
      
  • 参数传递与返回值

    • 键和参数分离KEYSARGV 是 Lua 表(数组),索引从 1 开始;严格区分键和参数,避免逻辑混乱。

    • 返回值处理:脚本最终返回值会被转换为 Redis 协议格式(Lua表转为多行回复);支持返回nil对应(Redis的 NULL 回复)。

Lua 脚本的使用原则

  • 原子性与阻塞

    • 长时间脚本阻塞:脚本执行期间阻塞其他操作,需避免复杂循环或大量计算;单个脚本执行时间控制在ms级,必要时拆分逻辑。
  • 沙盒环境限制

    • 禁用危险操作:无法访问文件系统、网络或调用外部命令;禁止定义全局变量(需使用 local 声明局部变量)。
  • 脚本复用性

    • 参数化设计:键和参数通过 KEYS/ARGV 传递,避免硬编码,提高脚本通用性。

    • 版本兼容性:不同 Redis 版本支持的 Lua 库函数可能不同(如 redis.breakpoint() 仅限调试模式)。

排序

排序参数详解

  • ASC/DESC:升序(默认)或降序排序。
  • ALPHA:按字典序排序字符串元素。
  • BY \:按外部键的值排序(如 user:*:age)。
  • GET \:排序后返回外部键的值(可多次使用)。
  • LIMIT offset count:分页获取结果(类似 SQL 的 LIMIT)。
  • STORE \: 将排序结果存入新键(列表类型)。

排序的工作原理

  • 数据加载:从列表、集合或有序集合中提取元素;若使用 BYGET,加载外部键的值到内存。
  • 排序执行:默认按数值比较(ALPHA 启用字符串比较);使用快速排序算法,时间复杂度 O(N log N)
  • 结果处理:应用 LIMIT 分页;按 GET 返回指定数据或直接返回元素;若指定 STORE,将结果保存为新列表。

发布与订阅

核心机制

  • 角色
    • 发布者(Publisher):通过 PUBLISH <channel> <message> 发送消息到频道。
    • 订阅者(Subscriber):通过 SUBSCRIBE <channel> 订阅频道,或 PSUBSCRIBE <pattern> 按模式匹配订阅(如 news.*)。
    • 退订UNSUBSCRIBEPUNSUBSCRIBE 取消订阅。
  • 消息传递:消息从发布者直接推送到所有订阅者,无中间存储;消息不可回溯,订阅者断开后重连会丢失未连接期间的消息。

关键命令与行为

  • SUBSCRIBE channel1:订阅指定频道。
  • PSUBSCRIBE news.*:按模式订阅所有以 news. 开头的频道。
  • PUBLISH channel1 "Hello":向 channel1 发布消息 "Hello"。
  • UNSUBSCRIBE:退订所有频道。

慢查询日志

核心配置参数

  • slowlog-log-slower-than

    • 作用:定义慢查询的时间阈值(单位:微秒,1秒=1,000,000微秒)。

    • 示例

      config set slowlog-log-slower-than 10000  # 记录超过10毫秒的命令
      
  • slowlog-max-len

    • 作用:设置慢查询日志的最大条目数(内存中存储,先进先出)。

    • 示例

      config set slowlog-max-len 500  # 最多保存500条慢查询记录
      

查看与分析慢查询日志

  • SLOWLOG GET [n]:查看最新的n条记录(默认全部)。
  • SLOWLOG LEN`:查看当前日志条目数。
  • SLOWLOG RESET:清空慢查询日志。

监视器

MONITOR 的功能与使用

  • 启用监控:客户端执行 MONITOR 后,Redis 会将该连接转为监控模式,实时打印所有命令及其参数:
  • 输出格式
    • 时间戳:命令执行的精确时间(秒.微秒)。
    • 客户端信息:数据库编号、客户端 IP 和端口。
    • 命令内容:完整的命令及参数。

MONITOR 的性能影响

  • 高并发写入: 每个命令都会触发 MONITOR 输出,占用大量 CPU 和带宽,可能拖慢 Redis 整体性能。
  • 监控客户端网络延迟:MONITOR 输出量大时,可能阻塞客户端连接,导致其他操作延迟。
  • 内存消耗:Redis 需为每个监控连接维护输出缓冲区,内存压力增大。
相关文章
|
29天前
|
存储 缓存 NoSQL
Redis中的常用命令-get&set&keys&exists&expire&ttl&type的详细解析
总的来说,这些Redis命令提供了处理存储在内存中的键值对的便捷方式。通过理解和运用它们,你可以更有效地在Redis中操作数据,使其更好地服务于你的应用。
202 17
|
1月前
|
消息中间件 NoSQL Linux
Redis的基本介绍和安装方式(包括Linux和Windows版本),以及常用命令的演示
Redis(Remote Dictionary Server)是一个高性能的开源键值存储数据库。它支持字符串、列表、散列、集合等多种数据类型,具有持久化、发布/订阅等高级功能。由于其出色的性能和广泛的使用场景,Redis在应用程序中常作为高速缓存、消息队列等用途。
296 16
|
1月前
|
JSON NoSQL Redis
在Rocky9系统上安装并使用redis-dump和redis-load命令的指南
以上步骤是在Rocky9上使用redis-dump和redis-load命令顺利出行的秘籍。如果在实行的过程中,发现了新的冒险和挑战,那么就像一个勇敢的航海家,本着探索未知的决心,解决问题并前进。
60 14
|
1月前
|
消息中间件 NoSQL Unix
Redis的基本特性以及其基础命令用法
这只是冰山一角,Redis的强大功能和简洁的操作方法值得我们深入了解和掌握,是复杂数据问题解决的有力工具。所以,来一场有趣的Redis冒险吧!
104 6
|
6月前
|
NoSQL 应用服务中间件 API
Redis是如何建立连接和处理命令的
本文主要讲述 Redis 是如何监听客户端发出的set、get等命令的。
1402 160
|
3月前
|
缓存 NoSQL Redis
Redis如何优化频繁命令往返造成的性能瓶颈?
频繁的命令往返是Redis性能优化中需要重点关注的问题。通过使用Pipeline、Lua脚本、事务、合并命令、连接池以及合理设置网络超时,可以有效减少网络往返次数,优化Redis的性能。这些优化措施不仅提升了Redis的处理能力,还能确保系统在高并发情况下的稳定性和可靠性。
84 14
|
4月前
|
消息中间件 存储 NoSQL
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
210 30
|
8月前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
177 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
8月前
|
缓存 NoSQL 测试技术
Redis如何解决频繁的命令往返造成的性能瓶颈!
Redis如何解决频繁的命令往返造成的性能瓶颈!
103 1
|
8月前
|
缓存 NoSQL Redis
Redis命令:列表模糊删除详解
Redis命令:列表模糊删除详解
217 3