Redis设计与实现——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 <key>:监视指定键,若事务执行前键被修改,则事务终止(类似 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 命令,若命令出错(如键不存在),直接返回错误并终止脚本。

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

      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 <pattern> :按外部键的值排序(如 user:*:age)。
  • GET <pattern>:排序后返回外部键的值(可多次使用)。
  • LIMIT offset count :分页获取结果(类似 SQL 的 LIMIT)。
  • STORE <key>: 将排序结果存入新键(列表类型)。
排序的工作原理
  • 数据加载 :从列表、集合或有序集合中提取元素;若使用 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微秒)。

    • 示例

      lru 复制代码
      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 需为每个监控连接维护输出缓冲区,内存压力增大。
相关推荐
运维行者_9 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
国强_dev10 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
@insist12310 小时前
系统规划与管理师-信息系统规划核心工作要点解析
数据库·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
超级数据查看器10 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
数安3000天10 小时前
增量数据如何自动分类分级,避免目录“过期“?
大数据·数据库
桌面运维家11 小时前
如何用半缓存云桌面将服务器硬盘容量扩展至本地终端?
运维·服务器·缓存
南墙上的石头11 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
画中有画12 小时前
论向量数据库在项目中的应用
数据库
spider_xcxc12 小时前
Redis 数据库高质量实践指南(一)
运维·数据库·redis·oracle·云计算
l1t13 小时前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb