DukeDuke
主页
项目文档
技术文档
  • 单机版
  • 微服务
  • 代办项目
  • 优鲜项目
项目管理
关于我们
主页
项目文档
技术文档
  • 单机版
  • 微服务
  • 代办项目
  • 优鲜项目
项目管理
关于我们
  • 技术文档

    • 网络原理

      • 交换机
      • 路由器
      • TCP/IP协议
      • HTTP 与 HTTPS
    • 软件架构

      • 什么是软件架构
      • 分层架构
      • 微服务架构
      • 事件驱动架构
      • 领域驱动设计(DDD)
      • 架构图
      • 高并发系统
    • Vue3

      • Vue3简介
      • Vue3响应式系统
      • Vue3组合式API
      • Vue3生命周期
      • Vue3模板语法
      • Vue3组件系统
      • Vue3 路由系统
      • Vue3 状态管理
      • Vue3 性能优化
      • Vue3 TypeScript 支持
      • Vue3 项目实战
      • VUE 面试题大全
      • Node.js 安装
    • JAVA

      • JVM

        • 认识JVM
        • JVM类加载器
        • 运行时数据区
        • 执行引擎
        • 本地方法接口
        • 本地方法库
        • JVM垃圾回收
        • JVM性能监控
        • JVM调优
      • 设计模式
        • 单例模式
        • 工厂模式
        • 策略模式
        • 适配器模式
        • 建造者模式
        • 原型模式
        • 装饰器模式
        • 代理模式
        • 外观模式
        • 享元模式
        • 组合模式
        • 桥接模式
      • Java多线程

        • Java 线程基础详解
        • Java 线程池详解
        • Java ThreadLocal 详解
        • Java volatile 详解
        • Java 线程间通信详解
        • Java 线程安全详解
        • Java 线程调度详解
        • Java 线程优先级详解

        • Java 线程中断详解
        • Java 线程死锁详解
      • Java反射
      • Java 面试题

        • Java 基础概念面试题
        • Java 面向对象编程面试题
        • Java 集合框架面试题
        • Java 多线程与并发面试题
        • JVM 与内存管理面试题
        • Java I/O 与 NIO 面试题
        • Java 异常处理面试题
        • Java 反射与注解面试题
        • Java Spring 框架面试题
        • Java 数据库与 JDBC 面试题
        • Java 性能优化面试题
        • Java 实际项目经验面试题
        • Java 高级特性面试题
        • Java 面试准备建议
    • Python

      • Python简介
      • Python安装
      • Python hello world
      • Python基础语法
      • Python数据类型
      • Python数字
      • Python字符串
      • Python列表
      • Python元组
      • Python字典
      • Python日期时间
      • Python文件操作
      • Python异常处理
      • Python函数
      • Python类
      • Python模块
      • Python包
      • Python多线程
      • Python面向对象
      • Python爬虫
      • Django web框架
      • Python 面试题

        • Python 面试题导航
        • Python 基础概念
        • Python 面向对象编程
        • Python 数据结构
        • Python 高级特性
        • Python 框架
        • Python 性能优化
        • Python 项目经验
    • Spring

      • Spring
      • Springboot
      • Spring Security 安全框架
      • SpringBoot 中的事件详解
      • SpringBoot 中的定时任务详解
      • SpringBoot 自动装配原理与源码解释
    • Mybatis

      • Mybatis
      • Mybatis-Plus
    • 数据库

      • Redis

        • Redis简介
        • Redis(单机)安装
        • Redis配置
        • Redis数据结构
        • RDB、AOF 和混合持久化机制
        • Redis内存管理
        • Redis缓存一致性
        • Redis缓存穿透
        • Redis缓存击穿
        • Redis缓存雪崩
        • Redis Lua脚本
        • Redis主从复制
        • Redis哨兵模式
        • Redis集群
        • Redis数据分片
        • Redis CPU使用率过高
        • Redis面试题
      • MySQL

        • MySQL简介
        • MySQL安装
        • MySQL配置
        • MYSQL日常维护
        • MYSQL优化-慢查询
        • MYSQL优化-索引
        • MYSQL数据库设计规范
    • 消息队列

      • RocketMQ
      • Kafka
      • RabbitMQ
      • 消息队列面试题
    • 微服务

      • SpringCloud 微服务
      • Eureka 注册中心
      • Nacos 注册中心
      • Gateway 网关
      • Feign 服务调用
      • Sentinel 限流 与 熔断
      • Seata 分布式事务
      • CAP 理论
      • Redis 分布式锁
      • 高并发系统设计
    • ELK日志分析系统

      • Elasticsearch 搜索引擎
      • Logstash 数据处理
      • Kibana 可视化
      • ELK 实战
    • 开放API

      • 开放API设计
      • 开放API示例项目
    • 人工智能

      • 人工智能简介
      • 机器学习

      • 深度学习

      • 自然语言处理

      • 计算机视觉

        • CUDA与cuDNN详细安装
        • Conda 安装
        • Pytorch 深度学习框架
        • yolo 目标检测
        • TensorRT 深度学习推理优化引擎
        • TensorFlow 机器学习
        • CVAT 图像标注
        • Windows 下安装 CUDA、cuDNN、TensorRT、TensorRT-YOLO 环境
        • Windows10+CUDA+cuDNN+TensorRT+TensorRT-YOLO 部署高性能YOLO11推理
    • 大数据

      • 大数据简介
      • Hadoop 数据存储
      • Flume 数据采集
      • Sqoop 数据导入导出
      • Hive 数据仓库
      • Spark 数据处理
      • Flink 数据处理
      • Kafka 数据采集
      • HBase 数据存储
      • Elasticsearch 搜索引擎
    • 图像处理

      • 图像处理简介
      • 医学图像web呈现
      • 医学图像处理
      • 切片细胞分离问题
    • 服务器&运维

      • Linux 系统

        • Linux 系统管理
        • Linux 网络管理
        • Linux 文件管理
        • Linux 命令大全
      • Nginx Web 服务器

        • Nginx 安装 与 配置
        • Nginx 负载均衡
        • Nginx SSL证书配置
        • Nginx Keepalived 高可用
      • Docker 容器

        • Docker 简介
        • Docker 安装与配置
        • Docker 命令
        • Docker 部署 Nginx
        • Docker 部署 MySQL
        • Docker 部署 Redis
      • 服务器

        • 塔式服务器
        • 机架式服务器
        • 刀片服务器
      • Git 版本控制
      • Jenkins 持续集成
      • Jmeter 性能测试
      • Let's Encrypt 免费SSL证书
    • 简历

      • 项目经理简历
      • 开发工程师简历

Redis 命令详解

Redis 是一个开源的、基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。本文档详细介绍 Redis 的常用命令及其作用。

文档说明

本文档按照以下结构组织每个 Redis 命令:

  1. 命令作用:详细说明命令的功能和用途
  2. 命令语法:完整的语法格式和参数说明
  3. 命令特性:描述命令的特殊性质和行为特点
  4. 使用示例:提供实际的使用示例
  5. 注意事项:重要的使用注意点和最佳实践

目录

  • 连接和认证命令
  • 字符串命令
  • 哈希命令
  • 列表命令
  • 集合命令
  • 有序集合命令
  • 键管理命令
  • 服务器管理命令
  • 事务命令
  • 发布订阅命令
  • 高级命令

连接和认证命令

AUTH

命令作用: AUTH 命令用于客户端身份验证,确保只有知道正确密码的客户端才能访问 Redis 服务器。这是 Redis 安全机制的重要组成部分,防止未授权访问。

命令语法:

AUTH password

参数说明:

  • password:Redis 服务器配置的认证密码

命令特性:

  • 必须在连接建立后、执行其他命令前进行认证
  • 认证成功后,当前连接会话将保持认证状态
  • 如果密码错误,服务器会返回错误并拒绝后续命令
  • 支持在运行时动态修改密码,新连接需要使用新密码

使用示例:

# 使用密码认证
AUTH mypassword

# 认证成功后的响应
OK

# 密码错误时的响应
(error) ERR invalid password

注意事项:

  • 确保密码足够复杂,避免使用弱密码
  • 在生产环境中必须启用认证机制
  • 密码修改后需要重启客户端连接

PING

命令作用: PING 命令用于测试客户端与 Redis 服务器之间的连接是否正常。这是一个轻量级的健康检查命令,常用于监控和诊断网络连接状态。

命令语法:

PING [message]

参数说明:

  • message(可选):自定义消息内容,如果提供则返回该消息

命令特性:

  • 不消耗任何内存,执行速度极快
  • 可以带参数或不带参数使用
  • 返回结果简单明确,便于程序判断连接状态
  • 常用于负载均衡器的健康检查

使用示例:

# 基本用法,返回 PONG
PING
# 返回: PONG

# 带消息参数,返回原消息
PING hello
# 返回: hello

# 在脚本中检查连接
if redis.ping() == "PONG":
    print("连接正常")

注意事项:

  • 定期使用 PING 命令检查连接状态
  • 在网络不稳定的环境中,PING 可以帮助检测连接中断
  • 某些 Redis 客户端库会自动发送 PING 命令保持连接活跃

SELECT

命令作用: SELECT 命令用于切换当前客户端连接的数据库索引。Redis 默认提供 16 个数据库(索引 0-15),每个数据库都是独立的命名空间,可以存储不同的数据集。

命令语法:

SELECT index

参数说明:

  • index:数据库索引号,范围 0-15(默认配置)

命令特性:

  • 切换数据库后,所有后续命令都在新选择的数据库中执行
  • 每个数据库都有独立的键空间,互不干扰
  • 默认连接时使用数据库 0
  • 数据库索引超出范围会返回错误
  • 切换数据库不会影响已建立的连接

使用示例:

# 切换到数据库 0(默认)
SELECT 0

# 切换到数据库 1
SELECT 1

# 在数据库 1 中设置键值
SET name "张三"

# 切换回数据库 0
SELECT 0

# 数据库 0 中没有 name 键
GET name
# 返回: (nil)

注意事项:

  • 在生产环境中建议使用不同的数据库分离不同的应用数据
  • 某些 Redis 集群模式不支持 SELECT 命令
  • 数据库切换是客户端级别的,不影响其他连接

QUIT

命令作用: QUIT 命令用于优雅地关闭当前客户端与 Redis 服务器的连接。这是一个标准的连接终止命令,确保连接被正确关闭并释放相关资源。

命令语法:

QUIT

参数说明:

  • 无参数

命令特性:

  • 立即关闭当前连接
  • 服务器会发送 OK 响应确认关闭
  • 连接关闭后无法继续发送命令
  • 会触发服务器端的连接清理工作
  • 比直接断开网络连接更优雅

使用示例:

# 关闭当前连接
QUIT
# 返回: OK
# 连接随后关闭

注意事项:

  • 在应用程序中应该使用 QUIT 而不是直接关闭 socket
  • 某些客户端库会自动处理连接关闭
  • 连接池中的连接通常由池管理器负责关闭

字符串命令

SET

命令作用: SET 命令是 Redis 中最基础的数据存储命令,用于设置键值对。它支持多种选项来控制键的行为,如过期时间、条件设置等,是构建缓存、会话存储等应用的核心命令。

命令语法:

SET key value [EX seconds] [PX milliseconds] [NX|XX] [KEEPTTL]

参数说明:

  • key:要设置的键名
  • value:要设置的值
  • EX seconds:设置过期时间(秒)
  • PX milliseconds:设置过期时间(毫秒)
  • NX:仅当键不存在时设置(Not eXists)
  • XX:仅当键存在时设置(eXists)
  • KEEPTTL:保留原键的过期时间

命令特性:

  • 原子性操作,要么全部成功要么全部失败
  • 如果键已存在,会覆盖原值
  • 支持字符串、数字、JSON 等任意数据
  • 可以同时设置过期时间
  • 支持条件设置,避免覆盖现有数据

使用示例:

# 基本设置
SET name "张三"

# 设置带过期时间(1小时)
SET session:user123 "active" EX 3600

# 设置带毫秒过期时间
SET temp:data "value" PX 5000

# 仅当键不存在时设置(实现分布式锁)
SET lock:resource "locked" NX EX 30

# 仅当键存在时更新
SET user:1001:name "新名字" XX

# 保留原键的过期时间
SET user:1001:name "新名字" KEEPTTL

注意事项:

  • 大值会消耗更多内存,注意内存使用
  • 过期时间精度为秒级,毫秒级更精确
  • NX/XX 选项常用于实现分布式锁和条件更新
  • 字符串最大长度为 512MB

GET

命令作用: GET 命令用于获取指定键对应的字符串值。这是读取 Redis 数据最常用的命令,配合 SET 命令实现基本的键值存储功能。

命令语法:

GET key

参数说明:

  • key:要获取的键名

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 只能获取字符串类型的值
  • 键不存在时返回 nil
  • 不会修改键的过期时间
  • 支持获取任意长度的字符串

使用示例:

# 获取基本值
GET name
# 返回: "张三"

# 获取不存在的键
GET nonexistent
# 返回: (nil)

# 获取数字字符串
GET counter
# 返回: "10"

# 在应用中使用
user_data = redis.get("user:1001:profile")
if user_data:
    profile = json.loads(user_data)

注意事项:

  • 只能获取字符串类型,其他类型需要使用对应命令
  • 大值会影响网络传输性能
  • 建议对 JSON 等结构化数据进行序列化存储

MSET

命令作用: MSET 命令用于原子性地设置多个键值对。相比多次调用 SET 命令,MSET 可以减少网络往返次数,提高性能,并且保证所有键值对要么全部设置成功,要么全部失败。

命令语法:

MSET key value [key value ...]

参数说明:

  • key:键名
  • value:对应的值
  • 可以设置任意数量的键值对

命令特性:

  • 原子性操作,所有键值对同时设置
  • 如果任何键已存在,会被覆盖
  • 不支持过期时间设置
  • 减少网络往返,提高性能
  • 参数数量必须为偶数

使用示例:

# 设置多个键值对
MSET name "张三" age "25" city "北京" email "zhangsan@example.com"

# 设置用户配置
MSET user:1001:theme "dark" user:1001:language "zh-CN" user:1001:timezone "Asia/Shanghai"

# 批量初始化数据
MSET counter:page:views 0 counter:user:signups 0 counter:orders 0

注意事项:

  • 参数数量必须是偶数(键值对)
  • 不支持过期时间,需要单独设置
  • 大值会影响命令执行时间
  • 建议在批量操作时使用

MGET

命令作用: MGET 命令用于一次性获取多个键的值。相比多次调用 GET 命令,MGET 可以减少网络往返次数,提高批量读取性能,是优化 Redis 查询性能的重要命令。

命令语法:

MGET key [key ...]

参数说明:

  • key:要获取的键名,可以指定多个

命令特性:

  • 原子性操作,一次性获取所有键
  • 不存在的键返回 nil
  • 保持键的原始顺序
  • 减少网络往返,提高性能
  • 支持获取任意数量的键

使用示例:

# 获取多个键的值
MGET name age city email
# 返回: ["张三", "25", "北京", "zhangsan@example.com"]

# 获取用户配置
MGET user:1001:theme user:1001:language user:1001:timezone

# 批量获取计数器
MGET counter:page:views counter:user:signups counter:orders
# 返回: ["1000", "50", "25"]

# 处理结果
values = redis.mget("key1", "key2", "key3")
for i, value in enumerate(values):
    if value:
        print(f"key{i+1}: {value}")

注意事项:

  • 不存在的键在结果中显示为 nil
  • 结果数组与输入键的顺序一致
  • 建议在需要批量读取时使用
  • 大值会影响传输性能

INCR

命令作用: INCR 命令用于将键的值原子性地增加 1。这是 Redis 中实现计数器的核心命令,常用于页面访问统计、用户点赞数、库存计数等场景。

命令语法:

INCR key

参数说明:

  • key:要递增的键名

命令特性:

  • 原子性操作,避免并发问题
  • 如果键不存在,会先设置为 0 再递增
  • 只能对整数进行操作
  • 返回递增后的值
  • 时间复杂度 O(1)

使用示例:

# 基本递增
INCR page:views
# 返回: 1

# 再次递增
INCR page:views
# 返回: 2

# 对不存在的键递增
INCR new:counter
# 返回: 1

# 在应用中使用
def increment_page_views(page_id):
    return redis.incr(f"page:views:{page_id}")

# 实现分布式计数器
def get_next_id():
    return redis.incr("global:id:counter")

注意事项:

  • 只能对整数进行操作,非整数会报错
  • 值超出 64 位整数范围会报错
  • 常用于实现分布式计数器
  • 配合 EXPIRE 可以实现带过期时间的计数器

DECR

命令作用: DECR 命令用于将键的值原子性地减少 1。与 INCR 相反,DECR 用于递减操作,常用于库存扣减、倒计时等场景。

命令语法:

DECR key

参数说明:

  • key:要递减的键名

命令特性:

  • 原子性操作,避免并发问题
  • 如果键不存在,会先设置为 0 再递减
  • 只能对整数进行操作
  • 返回递减后的值
  • 支持负数结果

使用示例:

# 基本递减
SET stock:item1 10
DECR stock:item1
# 返回: 9

# 继续递减
DECR stock:item1
# 返回: 8

# 对不存在的键递减
DECR new:counter
# 返回: -1

# 实现库存扣减
def decrement_stock(item_id):
    current = redis.decr(f"stock:{item_id}")
    if current < 0:
        # 库存不足,回滚
        redis.incr(f"stock:{item_id}")
        return False
    return True

注意事项:

  • 只能对整数进行操作
  • 支持负数结果
  • 常用于库存管理和倒计时
  • 需要处理负数情况

INCRBY

命令作用: INCRBY 命令用于将键的值原子性地增加指定的数值。相比 INCR 只能增加 1,INCRBY 可以增加任意整数,提供更灵活的计数功能。

命令语法:

INCRBY key increment

参数说明:

  • key:要递增的键名
  • increment:要增加的数值(整数)

命令特性:

  • 原子性操作,避免并发问题
  • 支持正数和负数增量
  • 如果键不存在,会先设置为 0 再递增
  • 返回递增后的值
  • 支持大数值操作

使用示例:

# 增加指定数值
SET score:player1 100
INCRBY score:player1 50
# 返回: 150

# 使用负数减少
INCRBY score:player1 -20
# 返回: 130

# 对不存在的键操作
INCRBY new:counter 100
# 返回: 100

# 实现积分系统
def add_points(user_id, points):
    return redis.incrby(f"points:{user_id}", points)

# 批量增加
def batch_increment(counters, increment):
    pipe = redis.pipeline()
    for counter in counters:
        pipe.incrby(counter, increment)
    return pipe.execute()

注意事项:

  • 增量值必须是整数
  • 支持负数实现递减效果
  • 值超出范围会报错
  • 常用于积分、分数等系统

DECRBY

命令作用: DECRBY 命令用于将键的值原子性地减少指定的数值。与 INCRBY 相反,DECRBY 用于递减操作,提供灵活的递减计数功能。

命令语法:

DECRBY key decrement

参数说明:

  • key:要递减的键名
  • decrement:要减少的数值(整数)

命令特性:

  • 原子性操作,避免并发问题
  • 支持正数和负数减量
  • 如果键不存在,会先设置为 0 再递减
  • 返回递减后的值
  • 支持大数值操作

使用示例:

# 减少指定数值
SET balance:user1 1000
DECRBY balance:user1 100
# 返回: 900

# 使用负数增加
DECRBY balance:user1 -50
# 返回: 950

# 对不存在的键操作
DECRBY new:counter 50
# 返回: -50

# 实现余额扣减
def deduct_balance(user_id, amount):
    current = redis.decrby(f"balance:{user_id}", amount)
    if current < 0:
        # 余额不足,回滚
        redis.incrby(f"balance:{user_id}", amount)
        return False
    return True

注意事项:

  • 减量值必须是整数
  • 支持负数实现递增效果
  • 需要处理负数结果
  • 常用于余额、库存管理

APPEND

命令作用: APPEND 命令用于在指定键的值后面追加字符串内容。如果键不存在,会先创建键并设置值为空字符串,然后追加内容。常用于日志记录、消息拼接等场景。

命令语法:

APPEND key value

参数说明:

  • key:要追加的键名
  • value:要追加的字符串内容

命令特性:

  • 原子性操作,避免并发问题
  • 如果键不存在,会先创建空字符串
  • 返回追加后的字符串长度
  • 只能对字符串类型操作
  • 时间复杂度 O(1)

使用示例:

# 基本追加
SET greeting "Hello"
APPEND greeting " World"
# 返回: 11 (字符串长度)
GET greeting
# 返回: "Hello World"

# 对不存在的键追加
APPEND new:log "First log entry"
# 返回: 16
GET new:log
# 返回: "First log entry"

# 继续追加
APPEND new:log " - Second entry"
# 返回: 30

# 实现日志记录
def log_event(event_type, message):
    timestamp = datetime.now().isoformat()
    log_entry = f"[{timestamp}] {event_type}: {message}\n"
    return redis.append("system:log", log_entry)

注意事项:

  • 只能对字符串类型操作
  • 大值会影响内存使用
  • 常用于日志和消息拼接
  • 考虑使用列表类型存储大量追加数据

STRLEN

命令作用: STRLEN 命令用于获取指定键对应的字符串值的长度(字节数)。这是一个轻量级的查询命令,常用于数据验证、长度限制检查等场景。

命令语法:

STRLEN key

参数说明:

  • key:要查询长度的键名

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 只能查询字符串类型的长度
  • 键不存在时返回 0
  • 返回字节数,不是字符数
  • 不修改键的值

使用示例:

# 查询字符串长度
SET name "张三"
STRLEN name
# 返回: 6 (UTF-8 编码下中文字符占3字节)

# 查询英文长度
SET message "Hello World"
STRLEN message
# 返回: 11

# 查询不存在的键
STRLEN nonexistent
# 返回: 0

# 在应用中使用
def validate_input(key, max_length):
    current_length = redis.strlen(key)
    if current_length > max_length:
        return False
    return True

# 检查数据完整性
def check_data_size(data_key):
    size = redis.strlen(data_key)
    if size == 0:
        return "数据为空"
    elif size > 1024 * 1024:  # 1MB
        return "数据过大"
    else:
        return f"数据大小: {size} 字节"

注意事项:

  • 返回的是字节数,不是字符数
  • 中文字符在 UTF-8 编码下占 3 字节
  • 只能查询字符串类型
  • 常用于数据验证和监控

哈希命令

HSET

命令作用: HSET 命令用于设置哈希(Hash)数据结构中的字段值。哈希是 Redis 中用于存储对象属性的理想数据结构,特别适合存储用户信息、配置项等具有多个属性的数据。HSET 支持同时设置多个字段,提供高效的批量操作能力。

命令语法:

HSET key field value [field value ...]

参数说明:

  • key:哈希的键名
  • field:字段名
  • value:字段值
  • 可以同时设置多个字段值对

命令特性:

  • 原子性操作,所有字段同时设置
  • 如果字段已存在,会覆盖原值
  • 如果哈希不存在,会自动创建
  • 返回新设置的字段数量
  • 支持任意数量的字段值对

使用示例:

# 设置单个字段
HSET user:1001 name "张三"
# 返回: 1

# 设置多个字段
HSET user:1001 name "张三" age 25 email "zhangsan@example.com"
# 返回: 3

# 更新已存在的字段
HSET user:1001 age 26
# 返回: 0 (没有新字段)

# 在应用中使用
def create_user_profile(user_id, profile_data):
    fields = []
    for key, value in profile_data.items():
        fields.extend([key, str(value)])
    return redis.hset(f"user:{user_id}", *fields)

注意事项:

  • 字段值会被转换为字符串存储
  • 大量字段会影响内存使用
  • 建议使用有意义的字段名
  • 配合过期时间使用可以自动清理数据

HGET

命令作用: HGET 命令用于获取哈希中指定字段的值。这是读取哈希数据最常用的命令,配合 HSET 实现哈希的基本读写操作。

命令语法:

HGET key field

参数说明:

  • key:哈希的键名
  • field:要获取的字段名

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 字段不存在时返回 nil
  • 只能获取单个字段
  • 不修改哈希数据
  • 支持任意长度的字段名和值

使用示例:

# 获取单个字段
HGET user:1001 name
# 返回: "张三"

# 获取不存在的字段
HGET user:1001 phone
# 返回: (nil)

# 在应用中使用
def get_user_name(user_id):
    return redis.hget(f"user:{user_id}", "name")

# 检查字段是否存在
def has_user_field(user_id, field):
    value = redis.hget(f"user:{user_id}", field)
    return value is not None

注意事项:

  • 只能获取单个字段,批量获取使用 HMGET
  • 字段不存在返回 nil
  • 建议先检查字段是否存在
  • 配合其他命令实现复杂查询

HMSET

命令作用: HMSET 命令用于同时设置多个哈希字段值。虽然功能与 HSET 相同,但 HMSET 是较老的命令,Redis 4.0.0 后建议使用 HSET 替代。HMSET 仍然被支持,但新代码应该使用 HSET。

命令语法:

HMSET key field value [field value ...]

参数说明:

  • key:哈希的键名
  • field:字段名
  • value:字段值
  • 可以设置多个字段值对

命令特性:

  • 与 HSET 功能完全相同
  • 已标记为废弃,建议使用 HSET
  • 原子性操作
  • 返回 OK 表示成功
  • 向后兼容性良好

使用示例:

# 设置多个字段(旧方式)
HMSET user:1001 name "张三" age 25 email "zhangsan@example.com"
# 返回: OK

# 建议使用 HSET(新方式)
HSET user:1001 name "张三" age 25 email "zhangsan@example.com"
# 返回: 3

注意事项:

  • 建议使用 HSET 替代 HMSET
  • 功能完全相同,只是返回值不同
  • 新项目应该使用 HSET
  • 现有代码可以逐步迁移

HMGET

命令作用: HMGET 命令用于一次性获取哈希中多个字段的值。相比多次调用 HGET 命令,HMGET 可以减少网络往返次数,提高批量读取性能,是优化哈希查询的重要命令。

命令语法:

HMGET key field [field ...]

参数说明:

  • key:哈希的键名
  • field:要获取的字段名,可以指定多个

命令特性:

  • 原子性操作,一次性获取所有字段
  • 不存在的字段返回 nil
  • 保持字段的原始顺序
  • 减少网络往返,提高性能
  • 支持获取任意数量的字段

使用示例:

# 获取多个字段
HMGET user:1001 name age email
# 返回: ["张三", "25", "zhangsan@example.com"]

# 包含不存在的字段
HMGET user:1001 name phone email
# 返回: ["张三", (nil), "zhangsan@example.com"]

# 在应用中使用
def get_user_profile(user_id, fields):
    values = redis.hmget(f"user:{user_id}", *fields)
    return dict(zip(fields, values))

# 获取用户基本信息
profile = get_user_profile(1001, ["name", "age", "email"])
# 返回: {"name": "张三", "age": "25", "email": "zhangsan@example.com"}

注意事项:

  • 不存在的字段在结果中显示为 nil
  • 结果数组与输入字段的顺序一致
  • 建议在需要批量读取时使用
  • 配合字典处理结果更方便

HGETALL

命令作用: HGETALL 命令用于获取哈希中所有字段和值的列表。这个命令会返回一个包含所有字段值对的数组,常用于需要完整哈希数据的场景,如数据导出、缓存预热等。

命令语法:

HGETALL key

参数说明:

  • key:哈希的键名

命令特性:

  • 返回所有字段值对的数组
  • 数组格式为 [field1, value1, field2, value2, ...]
  • 哈希不存在时返回空数组
  • 时间复杂度 O(N),N 为字段数量
  • 会消耗较多内存和网络带宽

使用示例:

# 获取所有字段和值
HGETALL user:1001
# 返回: ["name", "张三", "age", "25", "email", "zhangsan@example.com"]

# 哈希不存在时
HGETALL nonexistent
# 返回: []

# 在应用中使用
def get_user_dict(user_id):
    data = redis.hgetall(f"user:{user_id}")
    # 将数组转换为字典
    result = {}
    for i in range(0, len(data), 2):
        result[data[i]] = data[i+1]
    return result

# 使用 HGETALL 获取完整用户信息
user_data = get_user_dict(1001)
# 返回: {"name": "张三", "age": "25", "email": "zhangsan@example.com"}

注意事项:

  • 大哈希会消耗大量内存和网络带宽
  • 建议在字段数量较少时使用
  • 考虑使用 HSCAN 遍历大哈希
  • 结果需要转换为字典格式使用

HDEL

命令作用: HDEL 命令用于删除哈希中指定的字段。这是一个原子性操作,可以同时删除多个字段,常用于清理不需要的数据或实现字段级别的数据管理。

命令语法:

HDEL key field [field ...]

参数说明:

  • key:哈希的键名
  • field:要删除的字段名,可以指定多个

命令特性:

  • 原子性操作,所有字段同时删除
  • 返回实际删除的字段数量
  • 不存在的字段会被忽略
  • 如果所有字段都被删除,哈希键也会被删除
  • 支持删除任意数量的字段

使用示例:

# 删除单个字段
HDEL user:1001 email
# 返回: 1

# 删除多个字段
HDEL user:1001 phone address
# 返回: 2

# 删除不存在的字段
HDEL user:1001 nonexistent
# 返回: 0

# 在应用中使用
def remove_user_fields(user_id, fields):
    return redis.hdel(f"user:{user_id}", *fields)

# 清理敏感信息
removed_count = remove_user_fields(1001, ["password", "ssn", "credit_card"])
print(f"删除了 {removed_count} 个字段")

注意事项:

  • 删除不存在的字段不会报错
  • 返回实际删除的字段数量
  • 删除所有字段后哈希键也会被删除
  • 建议批量删除提高性能

HEXISTS

命令作用: HEXISTS 命令用于检查哈希中指定字段是否存在。这是一个轻量级的查询命令,常用于条件判断、数据验证等场景,避免获取不存在的字段值。

命令语法:

HEXISTS key field

参数说明:

  • key:哈希的键名
  • field:要检查的字段名

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 返回 1 表示字段存在,0 表示不存在
  • 不修改哈希数据
  • 哈希不存在时返回 0
  • 只检查单个字段

使用示例:

# 检查字段是否存在
HEXISTS user:1001 name
# 返回: 1

# 检查不存在的字段
HEXISTS user:1001 phone
# 返回: 0

# 检查不存在的哈希
HEXISTS nonexistent field
# 返回: 0

# 在应用中使用
def has_user_field(user_id, field):
    return redis.hexists(f"user:{user_id}", field) == 1

# 条件性获取字段
if has_user_field(1001, "email"):
    email = redis.hget("user:1001", "email")
    print(f"用户邮箱: {email}")
else:
    print("用户未设置邮箱")

注意事项:

  • 只检查单个字段,批量检查需要多次调用
  • 建议在获取字段值前先检查存在性
  • 配合其他命令实现复杂逻辑
  • 常用于数据验证和条件判断

HKEYS

命令作用: HKEYS 命令用于获取哈希中所有字段名的列表。这个命令只返回字段名,不返回字段值,常用于获取哈希的结构信息、字段遍历等场景。

命令语法:

HKEYS key

参数说明:

  • key:哈希的键名

命令特性:

  • 返回所有字段名的数组
  • 哈希不存在时返回空数组
  • 时间复杂度 O(N),N 为字段数量
  • 不返回字段值,节省网络带宽
  • 字段名按插入顺序返回

使用示例:

# 获取所有字段名
HKEYS user:1001
# 返回: ["name", "age", "email"]

# 哈希不存在时
HKEYS nonexistent
# 返回: []

# 在应用中使用
def get_user_field_names(user_id):
    return redis.hkeys(f"user:{user_id}")

# 遍历用户字段
field_names = get_user_field_names(1001)
for field in field_names:
    value = redis.hget(f"user:1001", field)
    print(f"{field}: {value}")

# 检查字段是否存在
def has_required_fields(user_id, required_fields):
    existing_fields = set(redis.hkeys(f"user:{user_id}"))
    return all(field in existing_fields for field in required_fields)

注意事项:

  • 大哈希会返回大量字段名
  • 只返回字段名,不返回字段值
  • 考虑使用 HSCAN 遍历大哈希
  • 常用于字段遍历和结构分析

HVALS

命令作用: HVALS 命令用于获取哈希中所有字段值的列表。这个命令只返回字段值,不返回字段名,常用于获取哈希的所有值、数据统计等场景。

命令语法:

HVALS key

参数说明:

  • key:哈希的键名

命令特性:

  • 返回所有字段值的数组
  • 哈希不存在时返回空数组
  • 时间复杂度 O(N),N 为字段数量
  • 不返回字段名,节省网络带宽
  • 字段值按插入顺序返回

使用示例:

# 获取所有字段值
HVALS user:1001
# 返回: ["张三", "25", "zhangsan@example.com"]

# 哈希不存在时
HVALS nonexistent
# 返回: []

# 在应用中使用
def get_user_values(user_id):
    return redis.hvals(f"user:{user_id}")

# 统计字段值
values = get_user_values(1001)
print(f"用户有 {len(values)} 个字段")

# 检查是否包含特定值
def has_value(user_id, target_value):
    values = redis.hvals(f"user:{user_id}")
    return target_value in values

# 获取所有数值字段
def get_numeric_values(user_id):
    values = redis.hvals(f"user:{user_id}")
    numeric_values = []
    for value in values:
        try:
            numeric_values.append(int(value))
        except ValueError:
            pass
    return numeric_values

注意事项:

  • 大哈希会返回大量字段值
  • 只返回字段值,不返回字段名
  • 考虑使用 HSCAN 遍历大哈希
  • 常用于数据统计和值分析

HLEN

命令作用: HLEN 命令用于获取哈希中字段的数量。这是一个轻量级的统计命令,常用于数据监控、容量检查、业务逻辑判断等场景。

命令语法:

HLEN key

参数说明:

  • key:哈希的键名

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 返回字段数量(整数)
  • 哈希不存在时返回 0
  • 不修改哈希数据
  • 提供快速的数量统计

使用示例:

# 获取字段数量
HLEN user:1001
# 返回: 3

# 哈希不存在时
HLEN nonexistent
# 返回: 0

# 在应用中使用
def get_user_field_count(user_id):
    return redis.hlen(f"user:{user_id}")

# 检查用户信息完整性
def is_user_profile_complete(user_id, required_field_count):
    actual_count = redis.hlen(f"user:{user_id}")
    return actual_count >= required_field_count

# 监控哈希大小
def monitor_hash_size(key, max_size):
    current_size = redis.hlen(key)
    if current_size > max_size:
        print(f"警告: {key} 字段数量过多: {current_size}")
    return current_size

# 批量检查多个用户
def check_users_completeness(user_ids, min_fields):
    results = {}
    for user_id in user_ids:
        field_count = redis.hlen(f"user:{user_id}")
        results[user_id] = field_count >= min_fields
    return results

注意事项:

  • 只返回字段数量,不返回字段名或值
  • 哈希不存在时返回 0
  • 常用于数据完整性检查
  • 配合其他命令实现复杂逻辑

列表命令

LPUSH

命令作用: LPUSH 命令用于在列表的左侧(头部)插入一个或多个元素。这是实现栈(LIFO - Last In First Out)数据结构的关键命令,常用于消息队列、任务队列、历史记录等场景。

命令语法:

LPUSH key element [element ...]

参数说明:

  • key:列表的键名
  • element:要插入的元素,可以指定多个

命令特性:

  • 原子性操作,所有元素同时插入
  • 新元素插入到列表头部(索引 0)
  • 如果列表不存在,会自动创建
  • 返回插入后列表的长度
  • 支持插入任意数量的元素

使用示例:

# 插入单个元素
LPUSH tasks "task1"
# 返回: 1

# 插入多个元素
LPUSH tasks "task2" "task3" "task4"
# 返回: 4

# 查看列表内容
LRANGE tasks 0 -1
# 返回: ["task4", "task3", "task2", "task1"]

# 在应用中使用
def add_task(task_name):
    return redis.lpush("task:queue", task_name)

# 批量添加任务
def add_tasks(task_list):
    return redis.lpush("task:queue", *task_list)

# 实现消息队列
def send_message(channel, message):
    return redis.lpush(f"messages:{channel}", message)

注意事项:

  • 元素按插入顺序的逆序存储
  • 大量元素会影响内存使用
  • 常用于实现栈和消息队列
  • 配合 LPOP 实现先进后出

RPUSH

命令作用: RPUSH 命令用于在列表的右侧(尾部)插入一个或多个元素。这是实现队列(FIFO - First In First Out)数据结构的关键命令,常用于任务队列、消息队列、日志记录等场景。

命令语法:

RPUSH key element [element ...]

参数说明:

  • key:列表的键名
  • element:要插入的元素,可以指定多个

命令特性:

  • 原子性操作,所有元素同时插入
  • 新元素插入到列表尾部
  • 如果列表不存在,会自动创建
  • 返回插入后列表的长度
  • 支持插入任意数量的元素

使用示例:

# 插入单个元素
RPUSH logs "log1"
# 返回: 1

# 插入多个元素
RPUSH logs "log2" "log3" "log4"
# 返回: 4

# 查看列表内容
LRANGE logs 0 -1
# 返回: ["log1", "log2", "log3", "log4"]

# 在应用中使用
def add_log(log_message):
    return redis.rpush("system:logs", log_message)

# 批量添加日志
def add_logs(log_messages):
    return redis.rpush("system:logs", *log_messages)

# 实现任务队列
def enqueue_task(task_data):
    return redis.rpush("task:queue", json.dumps(task_data))

注意事项:

  • 元素按插入顺序存储
  • 大量元素会影响内存使用
  • 常用于实现队列和日志系统
  • 配合 LPOP 实现先进先出

LPOP

命令作用: LPOP 命令用于从列表的左侧(头部)弹出并返回一个或多个元素。这是实现栈和队列操作的关键命令,常用于任务处理、消息消费等场景。

命令语法:

LPOP key [count]

参数说明:

  • key:列表的键名
  • count(可选):要弹出的元素数量,默认为 1

命令特性:

  • 原子性操作,元素被移除并返回
  • 从列表头部弹出元素
  • 列表为空时返回 nil
  • 支持弹出多个元素
  • 时间复杂度 O(N),N 为弹出元素数量

使用示例:

# 弹出单个元素
LPOP tasks
# 返回: "task4"

# 弹出多个元素
LPOP tasks 2
# 返回: ["task3", "task2"]

# 列表为空时
LPOP empty_list
# 返回: (nil)

# 在应用中使用
def get_next_task():
    return redis.lpop("task:queue")

# 批量处理任务
def process_tasks(batch_size=10):
    tasks = redis.lpop("task:queue", batch_size)
    if tasks:
        for task in tasks:
            process_single_task(task)
    return len(tasks) if tasks else 0

# 实现消息消费
def consume_message():
    message = redis.lpop("messages:channel1")
    if message:
        handle_message(message)
    return message

注意事项:

  • 元素被永久移除
  • 列表为空时返回 nil
  • 支持批量弹出提高性能
  • 常用于任务队列和消息处理

RPOP

命令作用: RPOP 命令用于从列表的右侧(尾部)弹出并返回一个或多个元素。这是实现队列操作的关键命令,常用于任务处理、消息消费等场景。

命令语法:

RPOP key [count]

参数说明:

  • key:列表的键名
  • count(可选):要弹出的元素数量,默认为 1

命令特性:

  • 原子性操作,元素被移除并返回
  • 从列表尾部弹出元素
  • 列表为空时返回 nil
  • 支持弹出多个元素
  • 时间复杂度 O(N),N 为弹出元素数量

使用示例:

# 弹出单个元素
RPOP logs
# 返回: "log4"

# 弹出多个元素
RPOP logs 2
# 返回: ["log3", "log2"]

# 列表为空时
RPOP empty_list
# 返回: (nil)

# 在应用中使用
def get_latest_log():
    return redis.rpop("system:logs")

# 清理旧日志
def cleanup_old_logs(count=100):
    old_logs = redis.rpop("system:logs", count)
    return len(old_logs) if old_logs else 0

# 实现任务处理
def process_task():
    task = redis.rpop("task:queue")
    if task:
        execute_task(task)
    return task

注意事项:

  • 元素被永久移除
  • 列表为空时返回 nil
  • 支持批量弹出提高性能
  • 常用于队列处理和日志清理

LRANGE

命令作用: LRANGE 命令用于获取列表中指定范围的元素。这是一个只读操作,不会修改列表内容,常用于数据查询、分页显示、数据导出等场景。

命令语法:

LRANGE key start stop

参数说明:

  • key:列表的键名
  • start:起始索引(包含)
  • stop:结束索引(包含)

命令特性:

  • 支持负数索引,-1 表示最后一个元素
  • 不修改列表内容
  • 列表不存在时返回空数组
  • 时间复杂度 O(S+N),S 为起始位置,N 为元素数量
  • 支持获取任意范围的元素

使用示例:

# 获取所有元素
LRANGE mylist 0 -1
# 返回: ["item1", "item2", "item3", "item4"]

# 获取前3个元素
LRANGE mylist 0 2
# 返回: ["item1", "item2", "item3"]

# 获取最后2个元素
LRANGE mylist -2 -1
# 返回: ["item3", "item4"]

# 获取中间元素
LRANGE mylist 1 2
# 返回: ["item2", "item3"]

# 在应用中使用
def get_recent_logs(count=10):
    return redis.lrange("system:logs", -count, -1)

# 分页获取数据
def get_page_data(page, page_size):
    start = (page - 1) * page_size
    end = start + page_size - 1
    return redis.lrange("data:list", start, end)

# 获取列表统计信息
def get_list_stats(key):
    total = redis.llen(key)
    if total > 0:
        first = redis.lrange(key, 0, 0)[0]
        last = redis.lrange(key, -1, -1)[0]
        return {"total": total, "first": first, "last": last}
    return {"total": 0}

注意事项:

  • 支持负数索引
  • 不修改列表内容
  • 大范围查询会影响性能
  • 常用于数据查询和分页

LLEN

命令作用: LLEN 命令用于获取列表的长度(元素数量)。这是一个轻量级的统计命令,常用于数据监控、容量检查、业务逻辑判断等场景。

命令语法:

LLEN key

参数说明:

  • key:列表的键名

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 返回列表长度(整数)
  • 列表不存在时返回 0
  • 不修改列表内容
  • 提供快速的数量统计

使用示例:

# 获取列表长度
LLEN mylist
# 返回: 4

# 列表不存在时
LLEN nonexistent
# 返回: 0

# 在应用中使用
def get_queue_length():
    return redis.llen("task:queue")

# 检查队列是否为空
def is_queue_empty():
    return redis.llen("task:queue") == 0

# 监控队列大小
def monitor_queue_size(max_size=1000):
    current_size = redis.llen("task:queue")
    if current_size > max_size:
        print(f"警告: 队列大小超过限制: {current_size}")
    return current_size

# 批量检查多个队列
def check_queues_status(queue_keys):
    status = {}
    for key in queue_keys:
        status[key] = redis.llen(key)
    return status

注意事项:

  • 只返回长度,不返回元素内容
  • 列表不存在时返回 0
  • 常用于容量监控和状态检查
  • 配合其他命令实现复杂逻辑

LINDEX

命令作用: LINDEX 命令用于获取列表中指定索引位置的元素。这是一个只读操作,不会修改列表内容,常用于随机访问、数据查询等场景。

命令语法:

LINDEX key index

参数说明:

  • key:列表的键名
  • index:元素索引位置

命令特性:

  • 支持负数索引,-1 表示最后一个元素
  • 不修改列表内容
  • 索引超出范围时返回 nil
  • 时间复杂度 O(N),N 为索引位置
  • 只返回单个元素

使用示例:

# 获取第一个元素
LINDEX mylist 0
# 返回: "item1"

# 获取最后一个元素
LINDEX mylist -1
# 返回: "item4"

# 获取中间元素
LINDEX mylist 2
# 返回: "item3"

# 索引超出范围
LINDEX mylist 10
# 返回: (nil)

# 在应用中使用
def get_first_task():
    return redis.lindex("task:queue", 0)

def get_last_log():
    return redis.lindex("system:logs", -1)

# 随机访问数据
def get_data_at_position(position):
    return redis.lindex("data:list", position)

# 检查特定位置的数据
def check_data_at_index(index, expected_value):
    actual_value = redis.lindex("data:list", index)
    return actual_value == expected_value

注意事项:

  • 支持负数索引
  • 索引超出范围返回 nil
  • 不修改列表内容
  • 常用于随机访问和查询

LINSERT

命令作用: LINSERT 命令用于在列表中指定元素的前面或后面插入新元素。这是一个精确插入操作,常用于数据维护、列表更新等场景。

命令语法:

LINSERT key BEFORE|AFTER pivot element

参数说明:

  • key:列表的键名
  • BEFORE|AFTER:插入位置,BEFORE 表示在指定元素前面,AFTER 表示在后面
  • pivot:参考元素
  • element:要插入的新元素

命令特性:

  • 原子性操作
  • 如果参考元素不存在,返回 -1
  • 返回插入后列表的长度
  • 只插入单个元素
  • 时间复杂度 O(N),N 为列表长度

使用示例:

# 在指定元素前面插入
LINSERT mylist BEFORE "item2" "newitem"
# 返回: 5

# 在指定元素后面插入
LINSERT mylist AFTER "item2" "anotheritem"
# 返回: 6

# 参考元素不存在
LINSERT mylist BEFORE "nonexistent" "item"
# 返回: -1

# 在应用中使用
def insert_before_task(task_queue, reference_task, new_task):
    return redis.linsert(task_queue, "BEFORE", reference_task, new_task)

def insert_after_task(task_queue, reference_task, new_task):
    return redis.linsert(task_queue, "AFTER", reference_task, new_task)

# 维护有序列表
def maintain_sorted_list(key, new_value, reference_value):
    result = redis.linsert(key, "AFTER", reference_value, new_value)
    if result == -1:
        # 参考元素不存在,添加到末尾
        redis.rpush(key, new_value)
    return result

注意事项:

  • 参考元素不存在时返回 -1
  • 只插入单个元素
  • 时间复杂度较高,大列表慎用
  • 常用于数据维护和列表更新

LREM

命令作用: LREM 命令用于从列表中删除指定数量的匹配元素。这是一个精确删除操作,可以控制删除的数量和方向,常用于数据清理、列表维护等场景。

命令语法:

LREM key count element

参数说明:

  • key:列表的键名
  • count:删除数量
    • count > 0:从头部开始删除指定数量的匹配元素
    • count < 0:从尾部开始删除指定数量的匹配元素
    • count = 0:删除所有匹配的元素
  • element:要删除的元素

命令特性:

  • 原子性操作
  • 返回实际删除的元素数量
  • 支持指定删除数量
  • 支持从不同方向删除
  • 时间复杂度 O(N),N 为列表长度

使用示例:

# 从头部删除1个匹配元素
LREM mylist 1 "item2"
# 返回: 1

# 从尾部删除1个匹配元素
LREM mylist -1 "item3"
# 返回: 1

# 删除所有匹配元素
LREM mylist 0 "item1"
# 返回: 2

# 在应用中使用
def remove_task(task_queue, task_name, count=1):
    return redis.lrem(task_queue, count, task_name)

def remove_all_old_logs(log_key, old_log_pattern):
    return redis.lrem(log_key, 0, old_log_pattern)

# 清理重复数据
def cleanup_duplicates(key, value):
    # 先删除所有匹配的元素
    removed = redis.lrem(key, 0, value)
    # 再添加一个
    if removed > 0:
        redis.rpush(key, value)
    return removed

# 批量清理
def batch_cleanup(key, values_to_remove):
    total_removed = 0
    for value in values_to_remove:
        removed = redis.lrem(key, 0, value)
        total_removed += removed
    return total_removed

注意事项:

  • 返回实际删除的元素数量
  • 支持指定删除数量
  • 时间复杂度较高,大列表慎用
  • 常用于数据清理和维护

集合命令

SADD

命令作用: SADD 命令用于向集合(Set)中添加一个或多个成员。集合是 Redis 中用于存储唯一元素的数据结构,自动去重,常用于标签系统、用户分组、去重统计等场景。

命令语法:

SADD key member [member ...]

参数说明:

  • key:集合的键名
  • member:要添加的成员,可以指定多个

命令特性:

  • 原子性操作,所有成员同时添加
  • 自动去重,重复成员只保留一个
  • 如果集合不存在,会自动创建
  • 返回新添加的成员数量(不包括重复的)
  • 支持添加任意数量的成员

使用示例:

# 添加单个成员
SADD tags "redis"
# 返回: 1

# 添加多个成员
SADD tags "database" "nosql" "cache"
# 返回: 3

# 添加重复成员
SADD tags "redis" "database"
# 返回: 0 (没有新成员)

# 在应用中使用
def add_user_tags(user_id, tags):
    return redis.sadd(f"user:{user_id}:tags", *tags)

# 实现标签系统
def tag_article(article_id, tags):
    return redis.sadd(f"article:{article_id}:tags", *tags)

# 去重数据收集
def collect_unique_values(key, values):
    return redis.sadd(key, *values)

注意事项:

  • 自动去重,无需手动检查
  • 大量成员会影响内存使用
  • 常用于标签和分类系统
  • 配合其他集合命令实现复杂逻辑

SREM

命令作用: SREM 命令用于从集合中删除指定的成员。这是一个原子性操作,可以同时删除多个成员,常用于数据清理、成员管理等场景。

命令语法:

SREM key member [member ...]

参数说明:

  • key:集合的键名
  • member:要删除的成员,可以指定多个

命令特性:

  • 原子性操作,所有成员同时删除
  • 返回实际删除的成员数量
  • 不存在的成员会被忽略
  • 如果所有成员都被删除,集合键也会被删除
  • 支持删除任意数量的成员

使用示例:

# 删除单个成员
SREM tags "redis"
# 返回: 1

# 删除多个成员
SREM tags "database" "nosql"
# 返回: 2

# 删除不存在的成员
SREM tags "nonexistent"
# 返回: 0

# 在应用中使用
def remove_user_tags(user_id, tags):
    return redis.srem(f"user:{user_id}:tags", *tags)

# 清理过期标签
def cleanup_old_tags(tag_key, old_tags):
    return redis.srem(tag_key, *old_tags)

# 批量移除成员
def batch_remove_members(key, members):
    return redis.srem(key, *members)

注意事项:

  • 删除不存在的成员不会报错
  • 返回实际删除的成员数量
  • 删除所有成员后集合键也会被删除
  • 建议批量删除提高性能

SMEMBERS

命令作用: SMEMBERS 命令用于获取集合中所有成员的列表。这是一个只读操作,不会修改集合内容,常用于数据查询、成员遍历、数据导出等场景。

命令语法:

SMEMBERS key

参数说明:

  • key:集合的键名

命令特性:

  • 返回所有成员的数组
  • 集合不存在时返回空数组
  • 时间复杂度 O(N),N 为成员数量
  • 不修改集合内容
  • 成员顺序不固定

使用示例:

# 获取所有成员
SMEMBERS tags
# 返回: ["cache", "database", "nosql"]

# 集合不存在时
SMEMBERS nonexistent
# 返回: []

# 在应用中使用
def get_user_tags(user_id):
    return redis.smembers(f"user:{user_id}:tags")

# 获取所有标签
def get_all_tags():
    return redis.smembers("global:tags")

# 检查集合内容
def has_members(key):
    members = redis.smembers(key)
    return len(members) > 0

# 数据导出
def export_set_data(key):
    members = redis.smembers(key)
    return {"key": key, "members": list(members), "count": len(members)}

注意事项:

  • 大集合会消耗大量内存和网络带宽
  • 成员顺序不固定
  • 考虑使用 SSCAN 遍历大集合
  • 常用于数据查询和导出

SISMEMBER

命令作用: SISMEMBER 命令用于检查指定成员是否存在于集合中。这是一个轻量级的查询命令,常用于条件判断、成员验证等场景。

命令语法:

SISMEMBER key member

参数说明:

  • key:集合的键名
  • member:要检查的成员

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 返回 1 表示成员存在,0 表示不存在
  • 不修改集合内容
  • 集合不存在时返回 0
  • 只检查单个成员

使用示例:

# 检查成员是否存在
SISMEMBER tags "redis"
# 返回: 1

# 检查不存在的成员
SISMEMBER tags "python"
# 返回: 0

# 检查不存在的集合
SISMEMBER nonexistent "member"
# 返回: 0

# 在应用中使用
def has_tag(user_id, tag):
    return redis.sismember(f"user:{user_id}:tags", tag) == 1

# 权限检查
def has_permission(user_id, permission):
    return redis.sismember(f"user:{user_id}:permissions", permission) == 1

# 条件性操作
def process_if_member(key, member, callback):
    if redis.sismember(key, member) == 1:
        return callback(member)
    return None

注意事项:

  • 只检查单个成员
  • 集合不存在时返回 0
  • 建议在添加成员前先检查
  • 常用于权限验证和条件判断

SCARD

命令作用: SCARD 命令用于获取集合中成员的数量。这是一个轻量级的统计命令,常用于数据监控、容量检查、业务逻辑判断等场景。

命令语法:

SCARD key

参数说明:

  • key:集合的键名

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 返回成员数量(整数)
  • 集合不存在时返回 0
  • 不修改集合内容
  • 提供快速的数量统计

使用示例:

# 获取成员数量
SCARD tags
# 返回: 3

# 集合不存在时
SCARD nonexistent
# 返回: 0

# 在应用中使用
def get_tag_count(user_id):
    return redis.scard(f"user:{user_id}:tags")

# 检查集合是否为空
def is_set_empty(key):
    return redis.scard(key) == 0

# 监控集合大小
def monitor_set_size(key, max_size=1000):
    current_size = redis.scard(key)
    if current_size > max_size:
        print(f"警告: {key} 成员数量过多: {current_size}")
    return current_size

# 批量检查多个集合
def check_sets_status(set_keys):
    status = {}
    for key in set_keys:
        status[key] = redis.scard(key)
    return status

注意事项:

  • 只返回数量,不返回成员内容
  • 集合不存在时返回 0
  • 常用于容量监控和状态检查
  • 配合其他命令实现复杂逻辑

SINTER

命令作用: SINTER 命令用于计算多个集合的交集,返回同时存在于所有指定集合中的成员。这是集合运算的核心命令,常用于数据分析、权限验证、标签匹配等场景。

命令语法:

SINTER key [key ...]

参数说明:

  • key:集合的键名,可以指定多个

命令特性:

  • 原子性操作,一次性计算所有交集
  • 返回交集成员的数组
  • 如果任何集合不存在,返回空数组
  • 时间复杂度 O(N*M),N 为最小集合大小,M 为集合数量
  • 支持计算任意数量的集合

使用示例:

# 计算两个集合的交集
SINTER set1 set2
# 返回: ["common1", "common2"]

# 计算多个集合的交集
SINTER set1 set2 set3
# 返回: ["common"]

# 包含不存在的集合
SINTER set1 nonexistent
# 返回: []

# 在应用中使用
def find_common_tags(user_ids):
    tag_keys = [f"user:{user_id}:tags" for user_id in user_ids]
    return redis.sinter(*tag_keys)

# 权限交集
def get_common_permissions(user_ids):
    perm_keys = [f"user:{user_id}:permissions" for user_id in user_ids]
    return redis.sinter(*perm_keys)

# 标签匹配
def find_articles_with_tags(tags):
    article_keys = [f"tag:{tag}:articles" for tag in tags]
    return redis.sinter(*article_keys)

注意事项:

  • 任何集合不存在都返回空数组
  • 大集合计算会影响性能
  • 常用于数据分析和权限验证
  • 考虑使用管道优化多个集合操作

SUNION

命令作用: SUNION 命令用于计算多个集合的并集,返回存在于任何指定集合中的成员。这是集合运算的重要命令,常用于数据合并、标签聚合等场景。

命令语法:

SUNION key [key ...]

参数说明:

  • key:集合的键名,可以指定多个

命令特性:

  • 原子性操作,一次性计算所有并集
  • 返回并集成员的数组
  • 自动去重,重复成员只保留一个
  • 时间复杂度 O(N),N 为所有集合成员总数
  • 支持计算任意数量的集合

使用示例:

# 计算两个集合的并集
SUNION set1 set2
# 返回: ["member1", "member2", "member3", "member4"]

# 计算多个集合的并集
SUNION set1 set2 set3
# 返回: ["member1", "member2", "member3", "member4", "member5"]

# 包含不存在的集合
SUNION set1 nonexistent
# 返回: ["member1", "member2"]

# 在应用中使用
def get_all_user_tags(user_ids):
    tag_keys = [f"user:{user_id}:tags" for user_id in user_ids]
    return redis.sunion(*tag_keys)

# 合并权限
def get_all_permissions(user_ids):
    perm_keys = [f"user:{user_id}:permissions" for user_id in user_ids]
    return redis.sunion(*perm_keys)

# 标签聚合
def aggregate_tags(tag_sets):
    return redis.sunion(*tag_sets)

注意事项:

  • 自动去重,无需手动处理
  • 大集合计算会影响性能
  • 常用于数据合并和聚合
  • 考虑使用管道优化多个集合操作

SDIFF

命令作用: SDIFF 命令用于计算多个集合的差集,返回存在于第一个集合但不存在于其他集合中的成员。这是集合运算的重要命令,常用于数据过滤、权限排除等场景。

命令语法:

SDIFF key [key ...]

参数说明:

  • key:集合的键名,可以指定多个
  • 第一个集合是基准集合,其他集合用于排除

命令特性:

  • 原子性操作,一次性计算所有差集
  • 返回差集成员的数组
  • 如果基准集合不存在,返回空数组
  • 时间复杂度 O(N),N 为所有集合成员总数
  • 支持计算任意数量的集合

使用示例:

# 计算两个集合的差集
SDIFF set1 set2
# 返回: ["member1", "member2"]

# 计算多个集合的差集
SDIFF set1 set2 set3
# 返回: ["member1"]

# 基准集合不存在
SDIFF nonexistent set2
# 返回: []

# 在应用中使用
def get_unique_tags(user_id, exclude_users):
    user_tags = f"user:{user_id}:tags"
    exclude_keys = [f"user:{exclude_id}:tags" for exclude_id in exclude_users]
    return redis.sdiff(user_tags, *exclude_keys)

# 权限排除
def get_exclusive_permissions(user_id, exclude_users):
    user_perms = f"user:{user_id}:permissions"
    exclude_keys = [f"user:{exclude_id}:permissions" for exclude_id in exclude_users]
    return redis.sdiff(user_perms, *exclude_keys)

# 数据过滤
def filter_data(base_set, exclude_sets):
    return redis.sdiff(base_set, *exclude_sets)

注意事项:

  • 第一个集合是基准,其他集合用于排除
  • 基准集合不存在时返回空数组
  • 大集合计算会影响性能
  • 常用于数据过滤和权限排除

有序集合命令

ZADD

命令作用: ZADD 命令用于向有序集合(Sorted Set)中添加一个或多个成员。有序集合是 Redis 中唯一既支持按分数排序又支持按成员查询的数据结构,常用于排行榜、优先级队列、范围查询等场景。

命令语法:

ZADD key [NX|XX] [CH] [INCR] score member [score member ...]

参数说明:

  • key:有序集合的键名
  • score:成员的分数(双精度浮点数)
  • member:成员名称
  • NX:仅当成员不存在时添加
  • XX:仅当成员存在时更新
  • CH:返回修改的成员数量
  • INCR:增加分数而不是设置分数

命令特性:

  • 原子性操作,所有成员同时添加
  • 成员按分数自动排序
  • 相同分数的成员按字典序排序
  • 支持条件添加和更新
  • 支持分数增量操作

使用示例:

# 基本添加
ZADD leaderboard 100 "player1" 200 "player2" 150 "player3"
# 返回: 3

# 条件添加(仅当成员不存在)
ZADD leaderboard NX 300 "player4"
# 返回: 1

# 条件更新(仅当成员存在)
ZADD leaderboard XX 250 "player1"
# 返回: 0

# 增量操作
ZADD leaderboard INCR 50 "player2"
# 返回: "250"

# 在应用中使用
def add_player_score(leaderboard, player, score):
    return redis.zadd(leaderboard, {player: score})

def update_player_score(leaderboard, player, score):
    return redis.zadd(leaderboard, "XX", {player: score})

def increment_score(leaderboard, player, increment):
    return redis.zadd(leaderboard, "INCR", increment, player)

注意事项:

  • 分数支持双精度浮点数
  • 相同分数的成员按字典序排序
  • 条件操作可以提高性能
  • 常用于排行榜和优先级队列

ZREM

命令作用: ZREM 命令用于从有序集合中删除指定的成员。这是一个原子性操作,可以同时删除多个成员,常用于数据清理、成员管理等场景。

命令语法:

ZREM key member [member ...]

参数说明:

  • key:有序集合的键名
  • member:要删除的成员,可以指定多个

命令特性:

  • 原子性操作,所有成员同时删除
  • 返回实际删除的成员数量
  • 不存在的成员会被忽略
  • 如果所有成员都被删除,有序集合键也会被删除
  • 支持删除任意数量的成员

使用示例:

# 删除单个成员
ZREM leaderboard "player1"
# 返回: 1

# 删除多个成员
ZREM leaderboard "player2" "player3"
# 返回: 2

# 删除不存在的成员
ZREM leaderboard "nonexistent"
# 返回: 0

# 在应用中使用
def remove_player(leaderboard, player):
    return redis.zrem(leaderboard, player)

def remove_players(leaderboard, players):
    return redis.zrem(leaderboard, *players)

# 清理过期数据
def cleanup_expired_players(leaderboard, expired_players):
    return redis.zrem(leaderboard, *expired_players)

注意事项:

  • 删除不存在的成员不会报错
  • 返回实际删除的成员数量
  • 删除所有成员后有序集合键也会被删除
  • 建议批量删除提高性能

ZRANGE

命令作用: ZRANGE 命令用于按排名获取有序集合中的成员。这是一个只读操作,不会修改有序集合内容,常用于排行榜查询、分页显示等场景。

命令语法:

ZRANGE key start stop [WITHSCORES]

参数说明:

  • key:有序集合的键名
  • start:起始排名(包含)
  • stop:结束排名(包含)
  • WITHSCORES:同时返回分数

命令特性:

  • 支持负数排名,-1 表示最后一名
  • 不修改有序集合内容
  • 有序集合不存在时返回空数组
  • 时间复杂度 O(log(N)+M),N 为成员数量,M 为返回数量
  • 按分数升序排列

使用示例:

# 获取所有成员
ZRANGE leaderboard 0 -1
# 返回: ["player1", "player3", "player2"]

# 获取前3名
ZRANGE leaderboard 0 2
# 返回: ["player1", "player3", "player2"]

# 获取带分数的成员
ZRANGE leaderboard 0 -1 WITHSCORES
# 返回: ["player1", "100", "player3", "150", "player2", "200"]

# 在应用中使用
def get_top_players(leaderboard, count=10):
    return redis.zrange(leaderboard, 0, count-1, withscores=True)

def get_players_by_rank(leaderboard, start, stop):
    return redis.zrange(leaderboard, start, stop)

def get_player_rankings(leaderboard):
    return redis.zrange(leaderboard, 0, -1, withscores=True)

注意事项:

  • 支持负数排名
  • 按分数升序排列
  • 不修改有序集合内容
  • 常用于排行榜查询

ZREVRANGE

命令作用: ZREVRANGE 命令用于按排名倒序获取有序集合中的成员。与 ZRANGE 相反,ZREVRANGE 按分数降序排列,常用于获取排行榜前几名等场景。

命令语法:

ZREVRANGE key start stop [WITHSCORES]

参数说明:

  • key:有序集合的键名
  • start:起始排名(包含)
  • stop:结束排名(包含)
  • WITHSCORES:同时返回分数

命令特性:

  • 支持负数排名,-1 表示最后一名
  • 不修改有序集合内容
  • 有序集合不存在时返回空数组
  • 时间复杂度 O(log(N)+M),N 为成员数量,M 为返回数量
  • 按分数降序排列

使用示例:

# 获取所有成员(降序)
ZREVRANGE leaderboard 0 -1
# 返回: ["player2", "player3", "player1"]

# 获取前3名
ZREVRANGE leaderboard 0 2
# 返回: ["player2", "player3", "player1"]

# 获取带分数的成员
ZREVRANGE leaderboard 0 -1 WITHSCORES
# 返回: ["player2", "200", "player3", "150", "player1", "100"]

# 在应用中使用
def get_leaderboard(leaderboard, count=10):
    return redis.zrevrange(leaderboard, 0, count-1, withscores=True)

def get_top_players(leaderboard, count=5):
    return redis.zrevrange(leaderboard, 0, count-1)

def get_player_rankings_desc(leaderboard):
    return redis.zrevrange(leaderboard, 0, -1, withscores=True)

注意事项:

  • 按分数降序排列
  • 支持负数排名
  • 不修改有序集合内容
  • 常用于获取排行榜前几名

ZRANK

命令作用: ZRANK 命令用于获取成员在有序集合中的排名。排名从 0 开始,按分数升序排列,常用于查询成员位置、排名统计等场景。

命令语法:

ZRANK key member

参数说明:

  • key:有序集合的键名
  • member:要查询的成员

命令特性:

  • 时间复杂度 O(log(N)),执行速度较快
  • 返回排名(整数),从 0 开始
  • 成员不存在时返回 nil
  • 按分数升序排列
  • 相同分数的成员按字典序排列

使用示例:

# 获取成员排名
ZRANK leaderboard "player2"
# 返回: 2

# 成员不存在
ZRANK leaderboard "nonexistent"
# 返回: (nil)

# 在应用中使用
def get_player_rank(leaderboard, player):
    rank = redis.zrank(leaderboard, player)
    return rank + 1 if rank is not None else None  # 转换为从1开始的排名

def get_player_position(leaderboard, player):
    rank = redis.zrank(leaderboard, player)
    if rank is not None:
        total = redis.zcard(leaderboard)
        return {"rank": rank + 1, "total": total, "percentile": (rank / total) * 100}
    return None

def is_player_in_top(leaderboard, player, top_n):
    rank = redis.zrank(leaderboard, player)
    return rank is not None and rank < top_n

注意事项:

  • 排名从 0 开始
  • 成员不存在时返回 nil
  • 按分数升序排列
  • 常用于排名查询和统计

ZSCORE

命令作用: ZSCORE 命令用于获取成员在有序集合中的分数。这是一个轻量级的查询命令,常用于分数查询、数据验证等场景。

命令语法:

ZSCORE key member

参数说明:

  • key:有序集合的键名
  • member:要查询的成员

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 返回分数(字符串)
  • 成员不存在时返回 nil
  • 不修改有序集合内容
  • 支持双精度浮点数分数

使用示例:

# 获取成员分数
ZSCORE leaderboard "player2"
# 返回: "200"

# 成员不存在
ZSCORE leaderboard "nonexistent"
# 返回: (nil)

# 在应用中使用
def get_player_score(leaderboard, player):
    score = redis.zscore(leaderboard, player)
    return float(score) if score is not None else None

def check_player_score(leaderboard, player, min_score):
    score = redis.zscore(leaderboard, player)
    if score is not None:
        return float(score) >= min_score
    return False

def get_player_info(leaderboard, player):
    score = redis.zscore(leaderboard, player)
    rank = redis.zrank(leaderboard, player)
    if score is not None and rank is not None:
        return {"player": player, "score": float(score), "rank": rank + 1}
    return None

注意事项:

  • 返回字符串格式的分数
  • 成员不存在时返回 nil
  • 需要转换为数值类型使用
  • 常用于分数查询和验证

ZCARD

命令作用: ZCARD 命令用于获取有序集合中成员的数量。这是一个轻量级的统计命令,常用于数据监控、容量检查、业务逻辑判断等场景。

命令语法:

ZCARD key

参数说明:

  • key:有序集合的键名

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 返回成员数量(整数)
  • 有序集合不存在时返回 0
  • 不修改有序集合内容
  • 提供快速的数量统计

使用示例:

# 获取成员数量
ZCARD leaderboard
# 返回: 3

# 有序集合不存在时
ZCARD nonexistent
# 返回: 0

# 在应用中使用
def get_leaderboard_size(leaderboard):
    return redis.zcard(leaderboard)

def is_leaderboard_empty(leaderboard):
    return redis.zcard(leaderboard) == 0

def monitor_leaderboard_size(leaderboard, max_size=1000):
    current_size = redis.zcard(leaderboard)
    if current_size > max_size:
        print(f"警告: {leaderboard} 成员数量过多: {current_size}")
    return current_size

def get_leaderboard_stats(leaderboard):
    size = redis.zcard(leaderboard)
    if size > 0:
        top_player = redis.zrevrange(leaderboard, 0, 0, withscores=True)
        return {"size": size, "top_player": top_player[0] if top_player else None}
    return {"size": 0, "top_player": None}

注意事项:

  • 只返回数量,不返回成员内容
  • 有序集合不存在时返回 0
  • 常用于容量监控和状态检查
  • 配合其他命令实现复杂逻辑

键管理命令

EXISTS

命令作用: EXISTS 命令用于检查一个或多个键是否存在于 Redis 数据库中。这是一个轻量级的查询命令,常用于条件判断、数据验证、缓存检查等场景。

命令语法:

EXISTS key [key ...]

参数说明:

  • key:要检查的键名,可以指定多个

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 返回存在的键数量(整数)
  • 支持检查多个键
  • 不修改键的内容
  • 键不存在时返回 0

使用示例:

# 检查单个键
EXISTS name
# 返回: 1

# 检查多个键
EXISTS name age city
# 返回: 2

# 检查不存在的键
EXISTS nonexistent
# 返回: 0

# 在应用中使用
def check_cache_keys(keys):
    return redis.exists(*keys)

def is_user_data_cached(user_id):
    return redis.exists(f"user:{user_id}:profile") == 1

def check_required_keys(required_keys):
    existing_count = redis.exists(*required_keys)
    return existing_count == len(required_keys)

def get_available_keys(keys):
    results = []
    for key in keys:
        if redis.exists(key) == 1:
            results.append(key)
    return results

注意事项:

  • 返回存在的键数量,不是布尔值
  • 支持检查多个键
  • 常用于条件判断和缓存检查
  • 配合其他命令实现复杂逻辑

DEL

命令作用: DEL 命令用于删除一个或多个键。这是一个原子性操作,可以同时删除多个键,常用于数据清理、缓存失效、数据迁移等场景。

命令语法:

DEL key [key ...]

参数说明:

  • key:要删除的键名,可以指定多个

命令特性:

  • 原子性操作,所有键同时删除
  • 返回实际删除的键数量
  • 不存在的键会被忽略
  • 支持删除任意数量的键
  • 删除后键及其数据永久消失

使用示例:

# 删除单个键
DEL name
# 返回: 1

# 删除多个键
DEL name age city
# 返回: 3

# 删除不存在的键
DEL nonexistent
# 返回: 0

# 在应用中使用
def clear_user_cache(user_id):
    keys = [f"user:{user_id}:profile", f"user:{user_id}:settings"]
    return redis.delete(*keys)

def cleanup_expired_data(expired_keys):
    return redis.delete(*expired_keys)

def batch_delete_keys(key_patterns):
    total_deleted = 0
    for pattern in key_patterns:
        keys = redis.keys(pattern)
        if keys:
            deleted = redis.delete(*keys)
            total_deleted += deleted
    return total_deleted

注意事项:

  • 删除操作不可逆
  • 返回实际删除的键数量
  • 不存在的键不会报错
  • 建议批量删除提高性能

EXPIRE

命令作用: EXPIRE 命令用于设置键的过期时间(秒)。这是 Redis 中实现自动数据清理的重要机制,常用于缓存管理、会话控制、临时数据存储等场景。

命令语法:

EXPIRE key seconds

参数说明:

  • key:要设置过期时间的键名
  • seconds:过期时间(秒),必须为正整数

命令特性:

  • 原子性操作
  • 返回 1 表示设置成功,0 表示键不存在
  • 过期时间精度为秒级
  • 键过期后会自动删除
  • 可以重复设置过期时间

使用示例:

# 设置过期时间(1小时)
EXPIRE name 3600
# 返回: 1

# 设置短期过期时间(5分钟)
EXPIRE temp_data 300
# 返回: 1

# 对不存在的键设置过期时间
EXPIRE nonexistent 60
# 返回: 0

# 在应用中使用
def set_cache_with_expiry(key, value, seconds):
    redis.set(key, value)
    return redis.expire(key, seconds)

def extend_session(session_id, additional_seconds):
    return redis.expire(f"session:{session_id}", additional_seconds)

def set_temporary_data(key, data, ttl):
    redis.set(key, data)
    return redis.expire(key, ttl)

注意事项:

  • 过期时间必须为正整数
  • 键不存在时返回 0
  • 可以重复设置过期时间
  • 常用于缓存和会话管理

TTL

命令作用: TTL 命令用于获取键的剩余生存时间(秒)。这是一个轻量级的查询命令,常用于监控、调试、业务逻辑判断等场景。

命令语法:

TTL key

参数说明:

  • key:要查询的键名

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 返回剩余时间(秒)
  • 键不存在时返回 -2
  • 键存在但没有过期时间时返回 -1
  • 不修改键的内容

使用示例:

# 获取剩余时间
TTL name
# 返回: 3599

# 键不存在
TTL nonexistent
# 返回: -2

# 键存在但没有过期时间
TTL permanent_key
# 返回: -1

# 在应用中使用
def check_cache_ttl(key):
    ttl = redis.ttl(key)
    if ttl == -2:
        return "键不存在"
    elif ttl == -1:
        return "永不过期"
    else:
        return f"剩余 {ttl} 秒"

def is_cache_expiring_soon(key, threshold=300):
    ttl = redis.ttl(key)
    return ttl > 0 and ttl < threshold

def get_cache_status(key):
    ttl = redis.ttl(key)
    if ttl == -2:
        return {"status": "not_found", "ttl": None}
    elif ttl == -1:
        return {"status": "permanent", "ttl": None}
    else:
        return {"status": "expiring", "ttl": ttl}

注意事项:

  • 返回剩余时间(秒)
  • 键不存在时返回 -2
  • 永不过期的键返回 -1
  • 常用于监控和调试

PERSIST

命令作用: PERSIST 命令用于移除键的过期时间,使键变为永不过期。这是一个原子性操作,常用于数据持久化、取消自动清理等场景。

命令语法:

PERSIST key

参数说明:

  • key:要移除过期时间的键名

命令特性:

  • 原子性操作
  • 返回 1 表示成功移除,0 表示键不存在或没有过期时间
  • 移除后键变为永不过期
  • 不修改键的内容
  • 只能移除过期时间,不能设置

使用示例:

# 移除过期时间
PERSIST name
# 返回: 1

# 对没有过期时间的键操作
PERSIST permanent_key
# 返回: 0

# 对不存在的键操作
PERSIST nonexistent
# 返回: 0

# 在应用中使用
def make_data_permanent(key):
    return redis.persist(key)

def convert_temp_to_permanent(key):
    if redis.exists(key) == 1:
        return redis.persist(key)
    return 0

def handle_important_data(key):
    # 检查是否即将过期
    ttl = redis.ttl(key)
    if ttl > 0 and ttl < 60:  # 剩余时间少于1分钟
        return redis.persist(key)
    return 0

注意事项:

  • 只能移除过期时间,不能设置
  • 键不存在时返回 0
  • 没有过期时间的键返回 0
  • 常用于数据持久化

RENAME

命令作用: RENAME 命令用于重命名键。这是一个原子性操作,如果新键名已存在,会覆盖原键,常用于数据迁移、键名规范化等场景。

命令语法:

RENAME key newkey

参数说明:

  • key:原键名
  • newkey:新键名

命令特性:

  • 原子性操作
  • 如果新键名已存在,会覆盖原键
  • 原键不存在时返回错误
  • 新键名不能与原键名相同
  • 保持原键的所有属性和数据

使用示例:

# 重命名键
RENAME oldname newname
# 返回: OK

# 新键名已存在
RENAME name age
# 返回: OK (age 被覆盖)

# 原键不存在
RENAME nonexistent newname
# 返回: (error) ERR no such key

# 在应用中使用
def rename_user_data(old_user_id, new_user_id):
    old_key = f"user:{old_user_id}:profile"
    new_key = f"user:{new_user_id}:profile"
    return redis.rename(old_key, new_key)

def standardize_key_name(key, new_name):
    if redis.exists(key) == 1:
        return redis.rename(key, new_name)
    return False

def migrate_data(old_key, new_key):
    if redis.exists(old_key) == 1:
        return redis.rename(old_key, new_key)
    return False

注意事项:

  • 原键不存在时返回错误
  • 新键名已存在会覆盖
  • 新键名不能与原键名相同
  • 常用于数据迁移和重命名

TYPE

命令作用: TYPE 命令用于获取键的数据类型。这是一个轻量级的查询命令,常用于数据验证、类型检查、调试等场景。

命令语法:

TYPE key

参数说明:

  • key:要查询的键名

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 返回数据类型名称
  • 键不存在时返回 "none"
  • 不修改键的内容
  • 支持所有 Redis 数据类型

使用示例:

# 查询字符串类型
TYPE name
# 返回: string

# 查询列表类型
TYPE mylist
# 返回: list

# 查询哈希类型
TYPE user:1
# 返回: hash

# 键不存在
TYPE nonexistent
# 返回: none

# 在应用中使用
def validate_data_type(key, expected_type):
    actual_type = redis.type(key)
    return actual_type == expected_type

def get_key_info(key):
    if redis.exists(key) == 1:
        return {
            "key": key,
            "type": redis.type(key),
            "ttl": redis.ttl(key)
        }
    return None

def process_by_type(key):
    data_type = redis.type(key)
    if data_type == "string":
        return redis.get(key)
    elif data_type == "list":
        return redis.lrange(key, 0, -1)
    elif data_type == "hash":
        return redis.hgetall(key)
    # ... 其他类型处理
    return None

注意事项:

  • 返回数据类型名称
  • 键不存在时返回 "none"
  • 常用于数据验证和类型检查
  • 配合其他命令实现复杂逻辑

KEYS

命令作用: KEYS 命令用于查找匹配指定模式的所有键。这是一个强大的查询命令,常用于数据探索、批量操作、调试等场景。

命令语法:

KEYS pattern

参数说明:

  • pattern:匹配模式,支持通配符
    • *:匹配任意字符
    • ?:匹配单个字符
    • [abc]:匹配括号内的任意字符
    • [a-z]:匹配字符范围

命令特性:

  • 时间复杂度 O(N),N 为数据库中的键数量
  • 返回匹配的键数组
  • 支持多种通配符模式
  • 不修改键的内容
  • 在生产环境中慎用

使用示例:

# 查找所有键
KEYS *
# 返回: ["name", "age", "city", "user:1", "user:2"]

# 查找特定前缀的键
KEYS user:*
# 返回: ["user:1", "user:2"]

# 查找特定模式的键
KEYS user:1:*
# 返回: ["user:1:profile", "user:1:settings"]

# 使用字符范围
KEYS user:[1-9]
# 返回: ["user:1", "user:2", "user:3"]

# 在应用中使用
def find_user_keys(user_id):
    return redis.keys(f"user:{user_id}:*")

def cleanup_old_sessions():
    session_keys = redis.keys("session:*")
    for key in session_keys:
        if redis.ttl(key) == -1:  # 永不过期
            redis.expire(key, 3600)  # 设置1小时过期
    return len(session_keys)

def get_cache_stats():
    cache_keys = redis.keys("cache:*")
    total_size = 0
    for key in cache_keys:
        total_size += redis.memory_usage(key)
    return {"count": len(cache_keys), "total_size": total_size}

注意事项:

  • 时间复杂度 O(N),大数据库会影响性能
  • 在生产环境中建议使用 SCAN
  • 支持多种通配符模式
  • 常用于数据探索和批量操作

服务器管理命令

INFO

命令作用: INFO 命令用于获取 Redis 服务器的详细信息和统计数据。这是监控 Redis 服务器状态、性能分析和故障排查的重要命令,常用于运维监控、性能调优等场景。

命令语法:

INFO [section]

参数说明:

  • section(可选):指定要获取的信息部分
    • server:服务器信息
    • clients:客户端信息
    • memory:内存使用情况
    • persistence:持久化信息
    • stats:统计信息
    • replication:主从复制信息
    • cpu:CPU 使用情况
    • commandstats:命令统计
    • cluster:集群信息
    • keyspace:键空间信息

命令特性:

  • 返回详细的服务器信息
  • 支持按部分获取信息
  • 不修改服务器状态
  • 信息实时更新
  • 包含大量监控指标

使用示例:

# 获取所有信息
INFO
# 返回: 完整的服务器信息

# 获取内存信息
INFO memory
# 返回: 内存使用情况

# 获取统计信息
INFO stats
# 返回: 服务器统计信息

# 在应用中使用
def get_redis_info():
    return redis.info()

def get_memory_usage():
    info = redis.info("memory")
    return {
        "used_memory": info["used_memory"],
        "used_memory_human": info["used_memory_human"],
        "maxmemory": info["maxmemory"]
    }

def get_connection_count():
    info = redis.info("clients")
    return info["connected_clients"]

def monitor_redis_health():
    info = redis.info()
    return {
        "uptime": info["uptime_in_seconds"],
        "connected_clients": info["connected_clients"],
        "used_memory": info["used_memory_human"],
        "keyspace_hits": info["keyspace_hits"],
        "keyspace_misses": info["keyspace_misses"]
    }

注意事项:

  • 返回大量信息,注意网络传输
  • 支持按部分获取,减少传输量
  • 常用于监控和故障排查
  • 信息格式为键值对

CONFIG GET

命令作用: CONFIG GET 命令用于获取 Redis 服务器的配置参数。这是一个只读操作,不会修改配置,常用于配置检查、参数验证等场景。

命令语法:

CONFIG GET parameter

参数说明:

  • parameter:要获取的配置参数名
    • 支持通配符 * 获取所有参数
    • 支持部分匹配,如 max* 获取所有以 max 开头的参数

命令特性:

  • 只读操作,不修改配置
  • 支持通配符匹配
  • 返回参数名和值的数组
  • 包含所有可配置参数
  • 实时获取当前配置

使用示例:

# 获取特定参数
CONFIG GET maxmemory
# 返回: ["maxmemory", "0"]

# 获取所有参数
CONFIG GET "*"
# 返回: 所有配置参数的数组

# 获取匹配的参数
CONFIG GET max*
# 返回: 所有以 max 开头的参数

# 在应用中使用
def get_redis_config():
    config = redis.config_get("*")
    return dict(zip(config[::2], config[1::2]))

def check_memory_config():
    config = redis.config_get("maxmemory")
    return int(config[1]) if config[1] != "0" else None

def validate_config(required_params):
    config = redis.config_get("*")
    config_dict = dict(zip(config[::2], config[1::2]))
    missing = [param for param in required_params if param not in config_dict]
    return missing == []

def get_config_value(param_name):
    config = redis.config_get(param_name)
    return config[1] if config else None

注意事项:

  • 只读操作,不修改配置
  • 支持通配符匹配
  • 返回数组格式,需要转换为字典
  • 常用于配置检查和验证

CONFIG SET

命令作用: CONFIG SET 命令用于动态设置 Redis 服务器的配置参数。这是一个强大的管理命令,可以在不重启服务器的情况下修改配置,常用于性能调优、参数调整等场景。

命令语法:

CONFIG SET parameter value

参数说明:

  • parameter:要设置的配置参数名
  • value:要设置的值

命令特性:

  • 动态修改配置,无需重启
  • 立即生效
  • 支持大部分配置参数
  • 某些参数需要重启才能生效
  • 返回 OK 表示设置成功

使用示例:

# 设置内存限制
CONFIG SET maxmemory 100mb
# 返回: OK

# 设置超时时间
CONFIG SET timeout 300
# 返回: OK

# 设置日志级别
CONFIG SET loglevel notice
# 返回: OK

# 在应用中使用
def set_memory_limit(size_mb):
    return redis.config_set("maxmemory", f"{size_mb}mb")

def configure_timeout(seconds):
    return redis.config_set("timeout", str(seconds))

def optimize_redis():
    configs = {
        "maxmemory-policy": "allkeys-lru",
        "tcp-keepalive": "60",
        "timeout": "300"
    }
    results = {}
    for param, value in configs.items():
        try:
            result = redis.config_set(param, value)
            results[param] = result
        except Exception as e:
            results[param] = str(e)
    return results

def set_log_level(level):
    return redis.config_set("loglevel", level)

注意事项:

  • 某些参数需要重启才能生效
  • 设置错误的值会返回错误
  • 动态修改可能影响性能
  • 常用于性能调优和参数调整

FLUSHDB

命令作用: FLUSHDB 命令用于清空当前数据库中的所有键。这是一个危险的操作,会永久删除所有数据,常用于测试环境、数据清理等场景。

命令语法:

FLUSHDB [ASYNC]

参数说明:

  • ASYNC(可选):异步清空,不阻塞服务器

命令特性:

  • 清空当前数据库的所有键
  • 操作不可逆
  • 支持同步和异步模式
  • 不影响其他数据库
  • 返回 OK 表示清空成功

使用示例:

# 同步清空
FLUSHDB
# 返回: OK

# 异步清空
FLUSHDB ASYNC
# 返回: OK

# 在应用中使用
def clear_current_database():
    return redis.flushdb()

def clear_database_async():
    return redis.flushdb(async=True)

def reset_test_environment():
    # 清空测试数据
    redis.flushdb()
    # 重新初始化测试数据
    initialize_test_data()
    return "测试环境已重置"

def cleanup_database():
    # 检查数据库大小
    size = redis.dbsize()
    if size > 10000:  # 如果键数量过多
        return redis.flushdb()
    return "数据库大小正常,无需清空"

注意事项:

  • 操作不可逆,会永久删除数据
  • 在生产环境中慎用
  • 支持异步模式,避免阻塞
  • 常用于测试环境清理

FLUSHALL

命令作用: FLUSHALL 命令用于清空所有数据库中的所有键。这是一个极其危险的操作,会永久删除所有数据,常用于测试环境、数据迁移等场景。

命令语法:

FLUSHALL [ASYNC]

参数说明:

  • ASYNC(可选):异步清空,不阻塞服务器

命令特性:

  • 清空所有数据库的所有键
  • 操作不可逆
  • 支持同步和异步模式
  • 影响所有数据库
  • 返回 OK 表示清空成功

使用示例:

# 同步清空所有数据库
FLUSHALL
# 返回: OK

# 异步清空所有数据库
FLUSHALL ASYNC
# 返回: OK

# 在应用中使用
def clear_all_databases():
    return redis.flushall()

def clear_all_databases_async():
    return redis.flushall(async=True)

def reset_redis_server():
    # 清空所有数据
    redis.flushall()
    # 重新初始化配置
    initialize_redis_config()
    return "Redis 服务器已重置"

def emergency_cleanup():
    # 紧急情况下的数据清理
    try:
        result = redis.flushall()
        return f"紧急清理完成: {result}"
    except Exception as e:
        return f"清理失败: {e}"

注意事项:

  • 操作不可逆,会永久删除所有数据
  • 在生产环境中极其危险
  • 支持异步模式,避免阻塞
  • 常用于测试环境或紧急情况

DBSIZE

命令作用: DBSIZE 命令用于获取当前数据库中的键数量。这是一个轻量级的统计命令,常用于数据监控、容量检查、业务逻辑判断等场景。

命令语法:

DBSIZE

参数说明:

  • 无参数

命令特性:

  • 时间复杂度 O(1),执行速度极快
  • 返回键数量(整数)
  • 不修改数据库内容
  • 只统计当前数据库
  • 提供快速的数量统计

使用示例:

# 获取键数量
DBSIZE
# 返回: 1500

# 在应用中使用
def get_database_size():
    return redis.dbsize()

def check_database_health():
    size = redis.dbsize()
    if size > 100000:
        return {"status": "warning", "message": "数据库键数量过多", "size": size}
    elif size > 50000:
        return {"status": "caution", "message": "数据库键数量较多", "size": size}
    else:
        return {"status": "normal", "message": "数据库大小正常", "size": size}

def monitor_database_growth():
    current_size = redis.dbsize()
    # 记录到监控系统
    log_metric("database_size", current_size)
    return current_size

def get_database_stats():
    size = redis.dbsize()
    info = redis.info("memory")
    return {
        "key_count": size,
        "memory_usage": info["used_memory_human"],
        "memory_peak": info["used_memory_peak_human"]
    }

注意事项:

  • 只统计当前数据库
  • 返回键数量,不是字节数
  • 常用于容量监控和状态检查
  • 配合其他命令实现复杂逻辑

事务命令

MULTI

命令作用: MULTI 命令用于开始一个 Redis 事务。事务是 Redis 中实现原子性操作的重要机制,允许将多个命令打包成一个原子操作,要么全部执行成功,要么全部不执行。

命令语法:

MULTI

参数说明:

  • 无参数

命令特性:

  • 开始事务模式
  • 后续命令进入队列,不立即执行
  • 返回 OK 表示事务开始
  • 支持嵌套事务(Redis 6.0+)
  • 与 EXEC、DISCARD 配合使用

使用示例:

# 开始事务
MULTI
# 返回: OK

# 在应用中使用
def start_transaction():
    return redis.multi()

def batch_operations():
    # 开始事务
    redis.multi()
    # 添加多个操作
    redis.set("key1", "value1")
    redis.set("key2", "value2")
    redis.incr("counter")
    # 执行事务
    return redis.exec()

def conditional_transaction():
    # 开始事务
    redis.multi()
    # 条件性操作
    if redis.exists("user:1001"):
        redis.hset("user:1001", "last_login", "2024-01-01")
    # 执行事务
    return redis.exec()

注意事项:

  • 事务开始后命令进入队列
  • 需要配合 EXEC 或 DISCARD 使用
  • 支持嵌套事务
  • 常用于批量操作和原子性保证

EXEC

命令作用: EXEC 命令用于执行事务中的所有命令。这是事务的核心命令,将队列中的所有命令原子性地执行,要么全部成功,要么全部失败。

命令语法:

EXEC

参数说明:

  • 无参数

命令特性:

  • 原子性执行所有队列中的命令
  • 返回每个命令的执行结果数组
  • 如果任何命令执行失败,整个事务失败
  • 执行后自动退出事务模式
  • 支持部分命令失败的情况

使用示例:

# 执行事务
MULTI
SET name "张三"
SET age 25
EXEC
# 返回: [True, True]

# 在应用中使用
def execute_transaction():
    redis.multi()
    redis.set("user:1001:name", "张三")
    redis.set("user:1001:age", "25")
    redis.hset("user:1001:profile", "city", "北京")
    return redis.exec()

def atomic_counter_update():
    redis.multi()
    redis.incr("page:views")
    redis.incr("total:views")
    redis.expire("page:views", 3600)
    return redis.exec()

def batch_user_creation(users):
    redis.multi()
    for user in users:
        redis.hset(f"user:{user['id']}", mapping=user)
    return redis.exec()

注意事项:

  • 原子性执行所有命令
  • 返回每个命令的执行结果
  • 部分命令失败可能导致整个事务失败
  • 执行后自动退出事务模式

DISCARD

命令作用: DISCARD 命令用于取消事务,清空命令队列。这是一个安全机制,允许在事务执行前取消所有操作,常用于错误处理、条件判断等场景。

命令语法:

DISCARD

参数说明:

  • 无参数

命令特性:

  • 取消当前事务
  • 清空命令队列
  • 返回 OK 表示取消成功
  • 自动退出事务模式
  • 不执行任何命令

使用示例:

# 取消事务
MULTI
SET name "张三"
DISCARD
# 返回: OK

# 在应用中使用
def conditional_transaction(condition):
    redis.multi()
    redis.set("key1", "value1")
    redis.set("key2", "value2")

    if not condition:
        # 条件不满足,取消事务
        return redis.discard()
    else:
        # 条件满足,执行事务
        return redis.exec()

def safe_batch_operations(operations):
    redis.multi()
    for op in operations:
        if op["type"] == "set":
            redis.set(op["key"], op["value"])
        elif op["type"] == "delete":
            redis.delete(op["key"])

    # 检查是否有错误
    if has_errors(operations):
        return redis.discard()
    else:
        return redis.exec()

def rollback_transaction():
    # 发生错误时回滚
    return redis.discard()

注意事项:

  • 取消事务,不执行任何命令
  • 清空命令队列
  • 自动退出事务模式
  • 常用于错误处理和条件判断

WATCH

命令作用: WATCH 命令用于监视一个或多个键,实现乐观锁机制。当被监视的键被其他客户端修改时,事务会失败,常用于并发控制和数据一致性保证。

命令语法:

WATCH key [key ...]

参数说明:

  • key:要监视的键名,可以指定多个

命令特性:

  • 监视键的变化
  • 支持监视多个键
  • 键被修改时事务失败
  • 与 MULTI/EXEC 配合使用
  • 实现乐观锁机制

使用示例:

# 监视单个键
WATCH mykey
MULTI
SET mykey "newvalue"
EXEC
# 如果 mykey 被其他客户端修改,EXEC 返回 nil

# 监视多个键
WATCH key1 key2 key3
MULTI
SET key1 "value1"
SET key2 "value2"
EXEC

# 在应用中使用
def optimistic_update(key, new_value):
    # 监视键
    redis.watch(key)
    # 获取当前值
    current_value = redis.get(key)

    # 开始事务
    redis.multi()
    redis.set(key, new_value)

    # 执行事务
    result = redis.exec()
    if result is None:
        return "键被其他客户端修改,事务失败"
    else:
        return "更新成功"

def atomic_counter_increment(counter_key, increment):
    redis.watch(counter_key)
    current_value = int(redis.get(counter_key) or 0)

    redis.multi()
    redis.set(counter_key, str(current_value + increment))

    result = redis.exec()
    if result is None:
        return "并发冲突,操作失败"
    else:
        return "操作成功"

def safe_data_transfer(from_key, to_key, amount):
    redis.watch(from_key, to_key)

    from_value = int(redis.get(from_key) or 0)
    to_value = int(redis.get(to_key) or 0)

    if from_value < amount:
        redis.unwatch()
        return "余额不足"

    redis.multi()
    redis.set(from_key, str(from_value - amount))
    redis.set(to_key, str(to_value + amount))

    result = redis.exec()
    if result is None:
        return "并发冲突,转账失败"
    else:
        return "转账成功"

注意事项:

  • 监视键的变化
  • 键被修改时事务失败
  • 支持监视多个键
  • 常用于并发控制
  • 需要配合 MULTI/EXEC 使用

发布订阅命令

PUBLISH

命令作用: PUBLISH 命令用于向指定的频道发布消息。这是 Redis 发布订阅系统的核心命令,常用于消息通知、事件广播、实时通信等场景。

命令语法:

PUBLISH channel message

参数说明:

  • channel:频道名称
  • message:要发布的消息内容

命令特性:

  • 向指定频道发布消息
  • 返回接收到消息的订阅者数量
  • 消息会发送给所有订阅该频道的客户端
  • 支持任意长度的消息
  • 不持久化消息

使用示例:

# 发布消息
PUBLISH news "Hello World"
# 返回: 3 (有3个订阅者)

# 发布到不存在的频道
PUBLISH empty_channel "test"
# 返回: 0 (没有订阅者)

# 在应用中使用
def publish_news(title, content):
    message = f"{title}: {content}"
    return redis.publish("news", message)

def notify_users(event_type, data):
    message = json.dumps({"type": event_type, "data": data})
    return redis.publish("notifications", message)

def broadcast_system_message(message):
    return redis.publish("system", message)

def publish_to_multiple_channels(channels, message):
    results = {}
    for channel in channels:
        results[channel] = redis.publish(channel, message)
    return results

注意事项:

  • 返回订阅者数量
  • 消息不持久化
  • 支持任意长度的消息
  • 常用于实时通信和事件通知

SUBSCRIBE

命令作用: SUBSCRIBE 命令用于订阅一个或多个频道。这是 Redis 发布订阅系统的核心命令,客户端订阅频道后会接收到该频道的所有消息。

命令语法:

SUBSCRIBE channel [channel ...]

参数说明:

  • channel:要订阅的频道名称,可以指定多个

命令特性:

  • 订阅指定频道
  • 支持订阅多个频道
  • 客户端进入订阅模式
  • 会接收到频道的所有消息
  • 需要配合 UNSUBSCRIBE 取消订阅

使用示例:

# 订阅单个频道
SUBSCRIBE news
# 返回: ["subscribe", "news", 1]

# 订阅多个频道
SUBSCRIBE news sports weather
# 返回: ["subscribe", "news", 1]
# 返回: ["subscribe", "sports", 2]
# 返回: ["subscribe", "weather", 3]

# 在应用中使用
def subscribe_to_news():
    pubsub = redis.pubsub()
    pubsub.subscribe("news")
    return pubsub

def subscribe_to_multiple_channels(channels):
    pubsub = redis.pubsub()
    pubsub.subscribe(*channels)
    return pubsub

def listen_for_messages(channel):
    pubsub = redis.pubsub()
    pubsub.subscribe(channel)

    for message in pubsub.listen():
        if message["type"] == "message":
            print(f"收到消息: {message['data']}")

    return pubsub

注意事项:

  • 客户端进入订阅模式
  • 支持订阅多个频道
  • 需要配合 UNSUBSCRIBE 取消订阅
  • 常用于实时消息接收

UNSUBSCRIBE

命令作用: UNSUBSCRIBE 命令用于取消订阅一个或多个频道。这是 Redis 发布订阅系统的重要命令,允许客户端动态管理订阅关系。

命令语法:

UNSUBSCRIBE [channel [channel ...]]

参数说明:

  • channel(可选):要取消订阅的频道名称,可以指定多个
  • 不指定频道时取消所有订阅

命令特性:

  • 取消订阅指定频道
  • 支持取消订阅多个频道
  • 不指定频道时取消所有订阅
  • 返回取消订阅的频道数量
  • 客户端退出订阅模式

使用示例:

# 取消订阅单个频道
UNSUBSCRIBE news
# 返回: ["unsubscribe", "news", 0]

# 取消订阅多个频道
UNSUBSCRIBE news sports
# 返回: ["unsubscribe", "news", 1]
# 返回: ["unsubscribe", "sports", 0]

# 取消所有订阅
UNSUBSCRIBE
# 返回: ["unsubscribe", "news", 0]
# 返回: ["unsubscribe", "sports", 0]
# 返回: ["unsubscribe", "weather", 0]

# 在应用中使用
def unsubscribe_from_news():
    pubsub = redis.pubsub()
    pubsub.subscribe("news")
    # 处理消息...
    return pubsub.unsubscribe("news")

def unsubscribe_from_multiple_channels(channels):
    pubsub = redis.pubsub()
    pubsub.subscribe(*channels)
    # 处理消息...
    return pubsub.unsubscribe(*channels)

def stop_listening():
    pubsub = redis.pubsub()
    pubsub.subscribe("news", "sports")
    # 处理消息...
    return pubsub.unsubscribe()  # 取消所有订阅

注意事项:

  • 支持取消订阅多个频道
  • 不指定频道时取消所有订阅
  • 返回取消订阅的频道数量
  • 常用于动态管理订阅关系

PSUBSCRIBE

命令作用: PSUBSCRIBE 命令用于订阅匹配指定模式的所有频道。这是 Redis 发布订阅系统的高级功能,支持模式匹配订阅,常用于动态频道管理。

命令语法:

PSUBSCRIBE pattern [pattern ...]

参数说明:

  • pattern:匹配模式,支持通配符
    • *:匹配任意字符
    • ?:匹配单个字符
    • [abc]:匹配括号内的任意字符
    • [a-z]:匹配字符范围

命令特性:

  • 订阅匹配模式的所有频道
  • 支持多个模式匹配
  • 客户端进入订阅模式
  • 会接收到匹配频道的所有消息
  • 需要配合 PUNSUBSCRIBE 取消订阅

使用示例:

# 订阅匹配模式
PSUBSCRIBE news.*
# 返回: ["psubscribe", "news.*", 1]

# 订阅多个模式
PSUBSCRIBE news.* sports.*
# 返回: ["psubscribe", "news.*", 1]
# 返回: ["psubscribe", "sports.*", 2]

# 在应用中使用
def subscribe_to_news_categories():
    pubsub = redis.pubsub()
    pubsub.psubscribe("news.*")
    return pubsub

def subscribe_to_user_channels():
    pubsub = redis.pubsub()
    pubsub.psubscribe("user:*")
    return pubsub

def listen_for_system_events():
    pubsub = redis.pubsub()
    pubsub.psubscribe("system:*")

    for message in pubsub.listen():
        if message["type"] == "pmessage":
            channel = message["channel"]
            pattern = message["pattern"]
            data = message["data"]
            print(f"频道 {channel} 匹配模式 {pattern}: {data}")

    return pubsub

def subscribe_to_multiple_patterns(patterns):
    pubsub = redis.pubsub()
    pubsub.psubscribe(*patterns)
    return pubsub

注意事项:

  • 支持模式匹配订阅
  • 支持多个模式匹配
  • 需要配合 PUNSUBSCRIBE 取消订阅
  • 常用于动态频道管理

高级命令

SCAN

命令作用: SCAN 命令用于迭代遍历数据库中的键,是 KEYS 命令的安全替代方案。SCAN 是一个非阻塞的、渐进式的迭代命令,不会阻塞 Redis 服务器,适合在生产环境中使用。

命令语法:

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

参数说明:

  • cursor:游标,从 0 开始,返回 0 表示遍历完成
  • MATCH pattern:匹配模式,支持通配符
  • COUNT count:每次返回的键数量(建议值)
  • TYPE type:只返回指定类型的键

命令特性:

  • 非阻塞操作,不会阻塞 Redis 服务器
  • 渐进式迭代,每次返回少量键
  • 支持模式匹配和类型过滤
  • 返回的键可能重复,需要客户端去重
  • 在遍历过程中键可能被修改或删除

使用示例:

# 基本用法
SCAN 0
# 返回: ["0", ["key1", "key2", "key3"]]

# 匹配模式
SCAN 0 MATCH user:*
# 返回: ["0", ["user:1", "user:2"]]

# 指定返回数量
SCAN 0 COUNT 100
# 返回: ["0", ["key1", "key2", "key3", "key4", "key5"]]

# 只返回字符串类型
SCAN 0 TYPE string
# 返回: ["0", ["string_key1", "string_key2"]]

# 组合使用
SCAN 0 MATCH user:* COUNT 50 TYPE string
# 返回: ["0", ["user:1", "user:2"]]

# 在应用中使用
def scan_all_keys():
    cursor = 0
    all_keys = []
    while True:
        cursor, keys = redis.scan(cursor)
        all_keys.extend(keys)
        if cursor == 0:
            break
    return all_keys

def scan_keys_by_pattern(pattern):
    cursor = 0
    matching_keys = []
    while True:
        cursor, keys = redis.scan(cursor, match=pattern)
        matching_keys.extend(keys)
        if cursor == 0:
            break
    return matching_keys

def scan_keys_by_type(data_type):
    cursor = 0
    typed_keys = []
    while True:
        cursor, keys = redis.scan(cursor, type=data_type)
        typed_keys.extend(keys)
        if cursor == 0:
            break
    return typed_keys

def safe_scan_with_deduplication(pattern="*"):
    cursor = 0
    seen_keys = set()
    unique_keys = []

    while True:
        cursor, keys = redis.scan(cursor, match=pattern)
        for key in keys:
            if key not in seen_keys:
                seen_keys.add(key)
                unique_keys.append(key)
        if cursor == 0:
            break

    return unique_keys

注意事项:

  • 返回的键可能重复,需要客户端去重
  • 在遍历过程中键可能被修改或删除
  • 建议在客户端实现去重逻辑
  • 比 KEYS 命令更安全,适合生产环境

SSCAN

命令作用: SSCAN 命令用于迭代遍历集合中的成员。这是 SCAN 命令的集合版本,提供安全的集合成员遍历功能,不会阻塞 Redis 服务器。

命令语法:

SSCAN key cursor [MATCH pattern] [COUNT count]

参数说明:

  • key:集合的键名
  • cursor:游标,从 0 开始,返回 0 表示遍历完成
  • MATCH pattern:匹配模式,支持通配符
  • COUNT count:每次返回的成员数量(建议值)

命令特性:

  • 非阻塞操作,不会阻塞 Redis 服务器
  • 渐进式迭代,每次返回少量成员
  • 支持模式匹配过滤
  • 返回的成员可能重复,需要客户端去重
  • 在遍历过程中成员可能被修改或删除

使用示例:

# 遍历集合所有成员
SSCAN myset 0
# 返回: ["0", ["member1", "member2", "member3"]]

# 匹配模式
SSCAN myset 0 MATCH user:*
# 返回: ["0", ["user:1", "user:2"]]

# 指定返回数量
SSCAN myset 0 COUNT 100
# 返回: ["0", ["member1", "member2", "member3", "member4", "member5"]]

# 在应用中使用
def scan_set_members(key):
    cursor = 0
    all_members = []
    while True:
        cursor, members = redis.sscan(key, cursor)
        all_members.extend(members)
        if cursor == 0:
            break
    return all_members

def scan_set_members_by_pattern(key, pattern):
    cursor = 0
    matching_members = []
    while True:
        cursor, members = redis.sscan(key, cursor, match=pattern)
        matching_members.extend(members)
        if cursor == 0:
            break
    return matching_members

注意事项:

  • 返回的成员可能重复,需要客户端去重
  • 在遍历过程中成员可能被修改或删除
  • 建议在客户端实现去重逻辑
  • 比 SMEMBERS 命令更安全,适合大集合

HSCAN

命令作用: HSCAN 命令用于迭代遍历哈希中的字段。这是 SCAN 命令的哈希版本,提供安全的哈希字段遍历功能,不会阻塞 Redis 服务器。

命令语法:

HSCAN key cursor [MATCH pattern] [COUNT count]

参数说明:

  • key:哈希的键名
  • cursor:游标,从 0 开始,返回 0 表示遍历完成
  • MATCH pattern:匹配模式,支持通配符
  • COUNT count:每次返回的字段数量(建议值)

命令特性:

  • 非阻塞操作,不会阻塞 Redis 服务器
  • 渐进式迭代,每次返回少量字段
  • 支持模式匹配过滤
  • 返回的字段可能重复,需要客户端去重
  • 在遍历过程中字段可能被修改或删除

使用示例:

# 遍历哈希所有字段
HSCAN user:1 0
# 返回: ["0", ["name", "张三", "age", "25", "email", "zhangsan@example.com"]]

# 匹配字段名模式
HSCAN user:1 0 MATCH name*
# 返回: ["0", ["name", "张三"]]

# 指定返回数量
HSCAN user:1 0 COUNT 50
# 返回: ["0", ["name", "张三", "age", "25", "email", "zhangsan@example.com"]]

# 在应用中使用
def scan_hash_fields(key):
    cursor = 0
    all_fields = []
    while True:
        cursor, fields = redis.hscan(key, cursor)
        all_fields.extend(fields)
        if cursor == 0:
            break
    return all_fields

def scan_hash_fields_by_pattern(key, pattern):
    cursor = 0
    matching_fields = []
    while True:
        cursor, fields = redis.hscan(key, cursor, match=pattern)
        matching_fields.extend(fields)
        if cursor == 0:
            break
    return matching_fields

注意事项:

  • 返回的字段可能重复,需要客户端去重
  • 在遍历过程中字段可能被修改或删除
  • 建议在客户端实现去重逻辑
  • 比 HGETALL 命令更安全,适合大哈希

ZSCAN

命令作用: ZSCAN 命令用于迭代遍历有序集合中的成员。这是 SCAN 命令的有序集合版本,提供安全的有序集合成员遍历功能,不会阻塞 Redis 服务器。

命令语法:

ZSCAN key cursor [MATCH pattern] [COUNT count]

参数说明:

  • key:有序集合的键名
  • cursor:游标,从 0 开始,返回 0 表示遍历完成
  • MATCH pattern:匹配模式,支持通配符
  • COUNT count:每次返回的成员数量(建议值)

命令特性:

  • 非阻塞操作,不会阻塞 Redis 服务器
  • 渐进式迭代,每次返回少量成员
  • 支持模式匹配过滤
  • 返回的成员可能重复,需要客户端去重
  • 在遍历过程中成员可能被修改或删除

使用示例:

# 遍历有序集合所有成员
ZSCAN leaderboard 0
# 返回: ["0", ["player1", "100", "player2", "200", "player3", "150"]]

# 匹配模式
ZSCAN leaderboard 0 MATCH player*
# 返回: ["0", ["player1", "100", "player2", "200", "player3", "150"]]

# 指定返回数量
ZSCAN leaderboard 0 COUNT 100
# 返回: ["0", ["player1", "100", "player2", "200", "player3", "150"]]

# 在应用中使用
def scan_sorted_set_members(key):
    cursor = 0
    all_members = []
    while True:
        cursor, members = redis.zscan(key, cursor)
        all_members.extend(members)
        if cursor == 0:
            break
    return all_members

def scan_sorted_set_members_by_pattern(key, pattern):
    cursor = 0
    matching_members = []
    while True:
        cursor, members = redis.zscan(key, cursor, match=pattern)
        matching_members.extend(members)
        if cursor == 0:
            break
    return matching_members

注意事项:

  • 返回的成员可能重复,需要客户端去重
  • 在遍历过程中成员可能被修改或删除
  • 建议在客户端实现去重逻辑
  • 比 ZRANGE 命令更安全,适合大有序集合 ZSCAN leaderboard 0

匹配成员名模式

ZSCAN leaderboard 0 MATCH player*

指定返回数量

ZSCAN leaderboard 0 COUNT 100


### EVAL

**语法**: `EVAL script numkeys key [key ...] arg [arg ...]`
**作用**: 执行 Lua 脚本
**参数**:

- `script`: Lua 脚本内容
- `numkeys`: 键的数量
- `key`: 键名
- `arg`: 参数

**示例**:

```redis
# 简单的 Lua 脚本
EVAL "return redis.call('GET', KEYS[1])" 1 mykey

# 带参数的脚本
EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 mykey "hello"

# 复杂脚本:原子性操作
EVAL "
local current = redis.call('GET', KEYS[1])
if current == false then
    return redis.call('SET', KEYS[1], ARGV[1])
else
    return redis.call('INCR', KEYS[1])
end
" 1 counter 1

EVALSHA

语法: EVALSHA sha1 numkeys key [key ...] arg [arg ...]作用: 使用脚本的 SHA1 值执行 Lua 脚本 示例:

# 先加载脚本
SCRIPT LOAD "return redis.call('GET', KEYS[1])"

# 使用 SHA1 执行
EVALSHA a1b2c3d4e5f6... 1 mykey

SCRIPT LOAD

语法: SCRIPT LOAD script作用: 加载 Lua 脚本到服务器 示例:

SCRIPT LOAD "return redis.call('GET', KEYS[1])"

SCRIPT EXISTS

语法: SCRIPT EXISTS script [script ...]作用: 检查脚本是否已加载 示例:

SCRIPT EXISTS a1b2c3d4e5f6... b2c3d4e5f6a1...

SCRIPT FLUSH

语法: SCRIPT FLUSH [ASYNC|SYNC]作用: 清空所有已加载的脚本 示例:

SCRIPT FLUSH
SCRIPT FLUSH ASYNC

BITCOUNT

语法: BITCOUNT key [start end]作用: 计算字符串中设置位的数量 示例:

# 设置位图
SETBIT mybitmap 0 1
SETBIT mybitmap 1 1
SETBIT mybitmap 2 0
SETBIT mybitmap 3 1

# 计算设置位的数量
BITCOUNT mybitmap

# 计算指定范围的位数
BITCOUNT mybitmap 0 1

BITOP

语法: BITOP operation destkey key [key ...]作用: 对多个字符串进行位运算 操作:

  • AND: 按位与
  • OR: 按位或
  • XOR: 按位异或
  • NOT: 按位非

示例:

# 设置两个位图
SETBIT bitmap1 0 1
SETBIT bitmap1 1 0
SETBIT bitmap2 0 0
SETBIT bitmap2 1 1

# 按位与运算
BITOP AND result bitmap1 bitmap2

# 按位或运算
BITOP OR result bitmap1 bitmap2

SETBIT

语法: SETBIT key offset value作用: 设置字符串指定位置的位值 示例:

# 设置第 0 位为 1
SETBIT mybitmap 0 1

# 设置第 100 位为 0
SETBIT mybitmap 100 0

GETBIT

语法: GETBIT key offset作用: 获取字符串指定位置的位值 示例:

# 获取第 0 位的值
GETBIT mybitmap 0

# 获取第 100 位的值
GETBIT mybitmap 100

BITPOS

语法: BITPOS key bit [start] [end]作用: 查找第一个设置为指定值的位的位置 示例:

# 查找第一个设置为 1 的位
BITPOS mybitmap 1

# 在指定范围内查找
BITPOS mybitmap 1 0 10

PFADD

语法: PFADD key element [element ...]作用: 向 HyperLogLog 添加元素 示例:

# 添加元素到 HyperLogLog
PFADD visitors user1 user2 user3

# 添加单个元素
PFADD visitors user4

PFCOUNT

语法: PFCOUNT key [key ...]作用: 计算 HyperLogLog 的近似基数 示例:

# 计算单个 HyperLogLog 的基数
PFCOUNT visitors

# 计算多个 HyperLogLog 的并集基数
PFCOUNT visitors1 visitors2 visitors3

PFMERGE

语法: PFMERGE destkey sourcekey [sourcekey ...]作用: 合并多个 HyperLogLog 示例:

# 合并两个 HyperLogLog
PFMERGE all_visitors visitors1 visitors2

# 合并多个 HyperLogLog
PFMERGE total visitors1 visitors2 visitors3

GEOADD

语法: GEOADD key longitude latitude member [longitude latitude member ...]作用: 添加地理位置信息 示例:

# 添加城市坐标
GEOADD cities 116.3974 39.9093 "北京"
GEOADD cities 121.4737 31.2304 "上海"
GEOADD cities 113.2644 23.1291 "广州"

GEODIST

语法: GEODIST key member1 member2 [unit]作用: 计算两个地理位置之间的距离 单位: m(米), km(千米), mi(英里), ft(英尺) 示例:

# 计算北京到上海的距离(千米)
GEODIST cities "北京" "上海" km

# 计算北京到广州的距离(米)
GEODIST cities "北京" "广州" m

GEORADIUS

语法: GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC]作用: 查找指定半径内的地理位置 示例:

# 查找北京 500km 内的城市
GEORADIUS cities 116.3974 39.9093 500 km

# 带坐标和距离信息
GEORADIUS cities 116.3974 39.9093 500 km WITHCOORD WITHDIST

# 限制返回数量
GEORADIUS cities 116.3974 39.9093 1000 km COUNT 5

GEORADIUSBYMEMBER

语法: GEORADIUSBYMEMBER key member radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC]作用: 查找指定成员周围指定半径内的地理位置 示例:

# 查找北京周围 500km 内的城市
GEORADIUSBYMEMBER cities "北京" 500 km

# 带坐标和距离信息
GEORADIUSBYMEMBER cities "北京" 500 km WITHCOORD WITHDIST

GEOPOS

语法: GEOPOS key member [member ...]作用: 获取地理位置的坐标 示例:

# 获取单个城市的坐标
GEOPOS cities "北京"

# 获取多个城市的坐标
GEOPOS cities "北京" "上海" "广州"

GEOHASH

语法: GEOHASH key member [member ...]作用: 获取地理位置的 Geohash 值 示例:

# 获取城市的 Geohash 值
GEOHASH cities "北京" "上海"

常用命令组合示例

缓存模式

# 设置缓存
SET user:1001:profile '{"name":"张三","age":25}' EX 3600

# 获取缓存
GET user:1001:profile

# 检查缓存是否存在
EXISTS user:1001:profile

计数器模式

# 页面访问计数
INCR page:views:homepage

# 用户点赞计数
INCRBY post:123:likes 1

# 获取计数
GET page:views:homepage

排行榜模式

# 添加分数
ZADD leaderboard 100 "player1" 200 "player2" 150 "player3"

# 获取前3名
ZREVRANGE leaderboard 0 2 WITHSCORES

# 获取玩家排名
ZRANK leaderboard "player1"

消息队列模式

# 生产者:添加消息
LPUSH task:queue "task1" "task2" "task3"

# 消费者:获取消息
RPOP task:queue

# 查看队列长度
LLEN task:queue

位图统计模式

# 用户签到统计
SETBIT user:signin:2024:01:01 1001 1
SETBIT user:signin:2024:01:01 1002 1
SETBIT user:signin:2024:01:01 1003 1

# 统计签到人数
BITCOUNT user:signin:2024:01:01

# 检查用户是否签到
GETBIT user:signin:2024:01:01 1001

HyperLogLog 统计模式

# 统计页面访问用户数
PFADD page:home:visitors user1 user2 user3
PFADD page:home:visitors user2 user4 user5

# 获取独立访客数
PFCOUNT page:home:visitors

# 合并多个页面的访客统计
PFMERGE total:visitors page:home:visitors page:about:visitors

地理位置服务模式

# 添加商店位置
GEOADD stores 116.3974 39.9093 "王府井店"
GEOADD stores 121.4737 31.2304 "南京路店"

# 查找附近 5km 内的商店
GEORADIUS stores 116.4 39.9 5 km WITHCOORD WITHDIST

# 计算两个商店的距离
GEODIST stores "王府井店" "南京路店" km

Lua 脚本原子操作模式

# 原子性计数器(带过期时间)
EVAL "
local current = redis.call('GET', KEYS[1])
if current == false then
    redis.call('SET', KEYS[1], 1)
    redis.call('EXPIRE', KEYS[1], ARGV[1])
    return 1
else
    return redis.call('INCR', KEYS[1])
end
" 1 page:views:homepage 3600

# 分布式锁实现
EVAL "
if redis.call('GET', KEYS[1]) == ARGV[1] then
    return redis.call('DEL', KEYS[1])
else
    return 0
end
" 1 lock:resource "unique_value"

SCAN 安全遍历模式

# 安全遍历所有用户键
SCAN 0 MATCH user:* COUNT 100

# 遍历特定类型的键
SCAN 0 TYPE string COUNT 50

# 遍历哈希字段
HSCAN user:1001 0 MATCH name* COUNT 10

注意事项

  1. 性能考虑: 避免使用 KEYS * 命令,在生产环境中使用 SCAN 命令
  2. 内存管理: 合理设置过期时间,避免内存泄漏
  3. 事务限制: Redis 事务不支持回滚,只能取消
  4. 数据类型: 选择合适的数据类型可以提高性能和减少内存使用
  5. 命令复杂度: 注意命令的时间复杂度,避免阻塞操作
  6. SCAN 命令: 使用 SCAN 系列命令时要注意游标管理,避免无限循环
  7. Lua 脚本: 脚本执行时间过长会阻塞 Redis,建议脚本执行时间控制在 5ms 以内
  8. 位图操作: 位图操作适合大量数据的统计,但要注意内存使用
  9. HyperLogLog: 适合基数统计,但存在一定误差(约 0.81%)
  10. 地理位置: GEO 命令基于球面距离计算,适合地理位置相关应用

总结

Redis 提供了丰富的数据类型和命令,可以满足各种应用场景的需求。掌握这些常用命令是使用 Redis 的基础,合理使用这些命令可以构建高性能的应用程序。

建议在实际使用中:

  • 根据业务需求选择合适的数据类型
  • 注意命令的性能特征
  • 合理设置过期时间
  • 使用连接池管理连接
  • 监控 Redis 的性能指标
最近更新:: 2025/9/11 08:55
Contributors: Duke