第四章:核心命令手册

全面介绍 Redis 的核心命令,包括键操作、服务器管理、连接管理等。

最后更新: 2024-01-15
页面目录

Redis 核心命令手册

本章详细介绍 Redis 的核心命令,涵盖键操作、服务器管理、连接管理等方面。

键(Key)操作

基本键操作

# 设置和获取
SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds|KEEPTTL]
GET key

# 批量操作
MSET key1 value1 key2 value2 key3 value3
MGET key1 key2 key3

# 设置时设置过期
SETEX key 60 value           # 60秒后过期
PSETEX key 60000 value       # 60000毫秒后过期
SETNX key value              # 不存在时设置(原子操作)
MSETNX key1 value1 key2 value2  # 批量不存在时设置

# 获取和删除
DEL key1 key2 key3          # 删除(返回删除数量)
UNLINK key1 key2            # 异步删除(推荐)
EXISTS key1 key2            # 键是否存在(返回数量)
TYPE key                     # 键的类型

过期时间操作

# 设置过期
EXPIRE key seconds          # 秒级过期
PEXPIRE key milliseconds    # 毫秒级过期
EXPIREAT key timestamp      # 未来某时间点过期(Unix时间戳)
PEXPIREAT key timestamp    # 未来某时间点过期(毫秒时间戳)

# 查询过期
TTL key                     # 剩余生存时间(秒),-1无过期,-2不存在
PTTL key                    # 剩余生存时间(毫秒)

# 移除过期
PERSIST key                 # 移除过期,使键永久有效

键值移动

# 移动键到其他数据库
MOVE key db                # 0-15
SELECT db                   # 切换数据库

# 键值替换
GETSET key newvalue         # 获取旧值并设置新值(原子)

键扫描

# 扫描键(避免 KEYS 阻塞)
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

# 示例
SCAN 0 MATCH user:* COUNT 100
SCAN 0 MATCH * COUNT 100
SCAN 0 TYPE string

# 按类型扫描
SCAN 0 TYPE hash
SCAN 0 TYPE list

键重命名

# 重命名
RENAME key newkey
RENAMENX key newkey         # 新键不存在时才重命名

键过期策略

Redis 采用两种过期策略:

惰性删除

# 客户端访问时检查,过期则删除
GET key  # 过期则返回 nil

定期删除

# 每隔一段时间,随机检查部分键,删除过期的键
# 配置文件配置检查频率
hz 10  # 每秒检查10次

服务器管理命令

服务器信息

# 服务器信息
INFO [section]              # 获取服务器信息
# section: server, clients, memory, persistence, stats, replication, cpu, commandstats, cluster, keyspace

INFO memory                  # 内存信息
INFO replication             # 复制信息
INFO stats                    # 统计信息

# 服务器时间
TIME                           # 返回服务器当前时间(Unix时间戳+微秒)
# 返回: [timestamp, microseconds]

# 客户端信息
CLIENT LIST                   # 所有客户端列表
CLIENT ID                     # 当前客户端 ID
CLIENT KILL ip:port           # 关闭指定客户端
CLIENT SETNAME name           # 设置当前客户端名
CLIENT GETNAME                # 获取当前客户端名

配置管理

# 运行时配置
CONFIG GET parameter          # 获取配置项
CONFIG SET parameter value    # 设置配置项(临时)
CONFIG RESETSTAT              # 重置统计信息

# 示例
CONFIG GET maxmemory
CONFIG SET maxmemory 2gb
CONFIG GET bind
CONFIG SET appendonly yes

# 保存配置
CONFIG REWRITE                 # 将运行时配置写入配置文件

数据库管理

# 数据库操作
SELECT db                      # 切换数据库(0-15)
DBSIZE                         # 当前数据库键数量
FLUSHDB                        # 清空当前数据库
FLUSHALL                       # 清空所有数据库

# 危险操作确认
FLUSHDB ASYNC                  # 异步清空
FLUSHALL ASYNC                 # 异步清空所有

持久化命令

# RDB 快照
SAVE                           # 同步保存(阻塞)
BGSAVE                         # 后台异步保存

# 查看保存状态
LASTSAVE                       # 上次 SAVE 时间戳
BGSAVE                         # 返回子进程 PID

# AOF 重写
BGREWRITEAOF                   # 后台重写 AOF

集群命令

# 集群模式
CLUSTER INFO                   # 集群信息
CLUSTER NODES                  # 集群节点信息
CLUSTER SLOTS                  # 槽位分配
CLUSTER KEYSLOT key            # 键所在槽位
CLUSTER COUNTKEYSINSLOT slot   # 槽位键数量
CLUSTER GETKEYSINSLOT slot count  # 获取槽位键

# 集群节点管理
CLUSTER MEET ip port           # 加入集群
CLUSTER FORGET node_id         # 移除节点
CLUSTER REPLICATE node_id      # 设置为主节点的从节点
CLUSTER FAILOVER               # 故障转移

连接管理

# 连接命令
PING [message]                 # 测试连接
AUTH password                  # 认证
ECHO message                   # 回显
QUIT                           # 关闭连接
SWAPDB db1 db2                 # 交换两个数据库

事务命令

# 事务
MULTI                          # 开始事务
EXEC                           # 执行事务
DISCARD                        # 取消事务

# 监视(乐观锁)
WATCH key1 key2               # 监视键
UNWATCH                        # 取消监视

# 示例
WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey val
EXEC                           # 如果 mykey 未变化则成功

Lua 脚本

# 执行 Lua 脚本
EVAL script numkeys key [key ...] arg [arg ...]
EVALSHA sha1 numkeys key [key ...] arg [arg ...]

# 脚本管理
SCRIPT EXISTS sha1 [sha1 ...]
SCRIPT LOAD script
SCRIPT FLUSH                  # 清除所有脚本缓存
SCRIPT KILL                   # 杀死运行中的脚本

# 示例:分布式锁
EVAL "if redis.call('get',KEYS[1])==ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end" 1 lock:order "uuid-xxx"

# 示例:限流
EVAL "local cnt=redis.call('incr',KEYS[1]) if cnt==1 then redis.call('expire',KEYS[1],ARGV[1]) end return cnt" 1 rate:limit:user:1001 60

慢查询日志

# 慢查询配置
SLOWLOG GET [n]               # 获取前 n 条慢查询
SLOWLOG LEN                    # 慢查询数量
SLOWLOG RESET                  # 清空慢查询日志

# 返回字段
# 1) 日志ID
# 2) 执行时间(微秒)
# 3) 命令和参数
# 4) 客户端 IP:端口
# 示例输出
SLOWLOG GET 5
# 1) 1) (integer) 5
#    2) (integer) 1500
#    3) 1) "SMEMBERS"
#       2) "tags:article:1001"
#    4) "127.0.0.1:54321"

哨兵命令

# 哨兵模式(连接哨兵)
SENTINEL masters               # 所有主节点
SENTINEL master mymaster       # 指定主节点信息
SENTINEL slaves mymaster       # 从节点列表
SENTINEL get-master-addr-by-name mymaster  # 主节点地址
SENTINEL is-master-down-by-addr ip port   # 检查主节点状态
SENTINEL failover mymaster     # 手动故障转移

发布订阅

# 发布
PUBLISH channel message

# 订阅
SUBSCRIBE channel1 channel2
PSUBSCRIBE pattern1 pattern2  # 模式订阅

# 取消
UNSUBSCRIBE [channel]
PUNSUBSCRIBE [pattern]

# 查看
PUBSUB CHANNELS [pattern]
PUBSUB NUMSUB [channel]
PUBSUB NUMPAT                  # 模式订阅数量
# 示例
# 终端1:订阅消息
SUBSCRIBE news:tech

# 终端2:发布消息
PUBLISH news:tech "Redis 7.0 发布!"

# 终端1 收到:
# 1) "message"
# 2) "news:tech"
# 3) "Redis 7.0 发布!"

HyperLogLog

# 基数统计(内存高效的去重计数)
PFADD key element [element ...]
PFCOUNT key [key ...]
PFMERGE destkey sourcekey [sourcekey ...]

# 示例:UV 统计
PFADD uv:20240115 "ip-001" "ip-002" "ip-003"
PFADD uv:20240115 "ip-001"  # 重复,不计入
PFCOUNT uv:20240115          # 返回 3

# 合并多天 UV
PFMERGE uv:week uv:20240115 uv:20240116 uv:20240117
PFCOUNT uv:week

Bitmap

# 位图操作
SETBIT key offset value
GETBIT key offset
BITCOUNT key [start end]
BITOP AND|OR|XOR|NOT destkey key [key ...]
BITPOS key bit [start] [end]
BITFIELD key GET|SET|INCRBY bit offset

# 示例:签到
SETBIT sign:user:1001:202401 0  # 1月1日签到
SETBIT sign:user:1001:202401 2  # 1月3日签到
BITCOUNT sign:user:1001:202401  # 签到次数

# 示例:在线状态
SETBIT online:user 1001 1       # 用户1001上线
SETBIT online:user 1002 1       # 用户1002上线
GETBIT online:user 1001         # 用户1001是否在线
BITCOUNT online:user            # 在线人数

GEO 地理

# 地理位置
GEOADD key longitude latitude member [longitude latitude member ...]
GEOPOS key member [member ...]
GEODIST key member1 member2 [unit]
GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [COUNT n]
GEORADIUSBYMEMBER key member radius unit [WITHDIST] [COUNT n]
GEOHASH key member [member ...]

# 示例:附近的人
GEOADD cities 116.408 39.904 "北京"
GEOADD cities 121.473 31.230 "上海"
GEOADD cities 113.264 23.119 "广州"

# 距离
GEODIST cities "北京" "上海" km  # 两城市距离

# 附近的人
GEORADIUS cities 116.408 39.904 100 km WITHDIST

连接池

Python 示例

import redis

# 创建连接池
pool = redis.ConnectionPool(
    host='localhost',
    port=6379,
    password='password',
    db=0,
    max_connections=10
)

# 使用连接池
client = redis.Redis(connection_pool=pool)

# 执行命令
client.set('key', 'value')
client.get('key')

Java 示例

import redis.clients.jedis.*;

JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(10);
config.setMaxIdle(5);

JedisPool pool = new JedisPool(
    config,
    "localhost",
    6379,
    2000,
    "password"
);

try (Jedis jedis = pool.getResource()) {
    jedis.set("key", "value");
    String value = jedis.get("key");
}

命令速查表

命令 说明 时间复杂度
SET 设置值 O(1)
GET 获取值 O(1)
DEL 删除键 O(N)
EXISTS 键是否存在 O(N)
EXPIRE 设置过期 O(1)
HSET 设置哈希字段 O(1)
HGET 获取哈希字段 O(1)
LPUSH 左侧插入 O(1)
RPUSH 右侧插入 O(1)
SADD 添加集合成员 O(1)
ZADD 添加有序集合 O(log N)
INCR 原子加1 O(1)

下一步

接下来让我们学习 Redis 的持久化机制。

👉 持久化机制