Redis 常用操作命令详解

掌握 Redis 的核心操作命令,提升你的数据操作效率和系统性能

目录#


Redis 简介#

Redis(Remote Dictionary Server)是一个开源的、基于内存的键值对存储系统。它支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等,并提供了丰富的操作命令。Redis 以其高性能、低延迟的特性,广泛应用于缓存、消息队列、实时分析等场景。

作为内存数据库,Redis 的读写操作都在内存中完成,这使得它的性能远超传统磁盘数据库。同时,Redis 支持数据持久化,可以将内存中的数据异步保存到磁盘,保证数据安全。


键(Key)操作命令#

基本键操作#

# 设置键值(字符串类型)
SET username "john_doe"
 
# 获取键值
GET username  # 返回 "john_doe"
 
# 检查键是否存在
EXISTS username  # 存在返回1,否则0
 
# 删除键
DEL username
 
# 设置键过期时间(秒)
EXPIRE temp_key 60
 
# 查看剩余过期时间
TTL temp_key  # 返回剩余秒数,-1表示永不过期,-2表示键不存在

高级键操作#

# 查找匹配模式的键
KEYS user:*  # 返回所有以"user:"开头的键
 
# 随机返回一个键
RANDOMKEY
 
# 重命名键
RENAME old_key new_key
 
# 键不存在时设置值(原子操作)
SETNX unique_token "abc123"  # 常用于分布式锁

最佳实践#

  1. 合理设计键名:使用冒号分隔的命名约定(如:user:1001:profile)
  2. 避免使用KEYS *:生产环境下使用SCAN命令代替,避免阻塞
  3. 设置TTL:对临时数据总是设置过期时间,避免内存泄漏
  4. 批量删除键:使用UNLINK替代DEL,非阻塞式删除大键

字符串(String)操作命令#

基础操作#

# 设置/获取值
SET counter 10
GET counter  # 返回"10"
 
# 值递增
INCR counter  # 结果11
INCRBY counter 5  # 结果16
 
# 值递减
DECR counter  # 结果15
DECRBY counter 3  # 结果12

批量操作#

# 批量设置
MSET key1 "A" key2 "B" key3 "C"
 
# 批量获取
MGET key1 key2 key3  # 返回["A","B","C"]

位操作#

# 设置位值
SETBIT login_log 100 1  # 第100位用户登录
 
# 统计位为1的数量
BITCOUNT login_log
 
# 位运算
BITOP AND result_log log1 log2

使用场景#

  • 计数器:网页访问统计、实时投票
  • 缓存:用户会话、页面片段
  • 位图:用户行为追踪、布隆过滤器

哈希(Hash)操作命令#

基本操作#

# 设置字段值
HSET user:1001 name "John" email "[email protected]"
 
# 获取单个字段
HGET user:1001 name  # 返回"John"
 
# 获取所有字段及值
HGETALL user:1001  # 返回["name","John","email","[email protected]"]
 
# 删除字段
HDEL user:1001 email

高级操作#

# 字段递增(整数)
HINCRBY user:1001 age 1
 
# 字段递增(浮点数)
HINCRBYFLOAT user:1001 balance 50.5
 
# 仅当字段不存在时设置
HSETNX user:1001 api_token "xyz789"
 
# 获取所有字段名
HKEYS user:1001
 
# 获取字段数量
HLEN user:1001

最佳实践#

  1. 存储对象:哈希是存储对象(如用户配置)的理想选择
  2. 避免大哈希:单个哈希包含过多字段(>1000)时考虑分片
  3. 管道操作:使用PIPELINE批量执行多个HGETALL命令
  4. 小对象优化:Redis 对小型哈希有特殊编码优化(小于512元素)

列表(List)操作命令#

基础操作#

# 左侧插入
LPUSH notifications "message1"
 
# 右侧插入
RPUSH notifications "message2"
 
# 左侧弹出
LPOP notifications  # 返回"message1"
 
# 右侧弹出
RPOP notifications  # 返回"message2"
 
# 获取范围
LRANGE notifications 0 -1  # 返回所有元素

阻塞操作#

# 阻塞式弹出(左侧)
BLPOP queue 30  # 30秒超时
 
# 阻塞式弹出(右侧)
BRPOP queue 30

高级操作#

# 修剪列表
LTRIM recent_logs 0 99  # 保留最近100条记录
 
# 插入元素
LINSERT notifications BEFORE "msg2" "new_msg"
 
# 按索引获取元素
LINDEX notifications 2

使用场景#

  • 消息队列:LPUSH + BRPOP 实现简单队列
  • 最新N条记录:LPUSH + LTRIM 实现时间线
  • 栈/队列结构:使用LPUSH/LPOP实现栈,LPUSH/RPOP实现队列

集合(Set)操作命令#

基础操作#

# 添加成员
SADD tags "redis" "database" "cache"
 
# 获取所有成员
SMEMBERS tags
 
# 成员是否存在
SISMEMBER tags "redis"  # 存在返回1
 
# 删除成员
SREM tags "cache"
 
# 随机成员
SRANDMEMBER tags

集合运算#

# 交集
SINTER set1 set2
 
# 并集
SUNION set1 set2
 
# 差集
SDIFF set1 set2  # set1中有而set2中没有的
 
# 存储运算结果
SUNIONSTORE result_set set1 set2

使用场景#

  • 标签系统:内容打标签
  • 唯一追踪:独立访客统计
  • 共同好友:使用SINTER实现社交关系交集

有序集合(Sorted Set)操作命令#

基础操作#

# 添加带分数成员
ZADD leaderboard 100 "player1" 85 "player2"
 
# 按分数范围查询
ZRANGEBYSCORE leaderboard 80 100
 
# 逆序排名
ZREVRANGE leaderboard 0 2 WITHSCORES  # 前三名
 
# 成员分数
ZSCORE leaderboard "player1"  # 返回100
 
# 成员排名
ZRANK leaderboard "player2"  # 返回升序排名

高级操作#

# 分数递增
ZINCRBY leaderboard 10 "player1"  # 新分数110
 
# 按字典序范围查询
ZRANGEBYLEX myzset [a [c
 
# 聚合操作
ZUNIONSTORE result 2 zset1 zset2 AGGREGATE MAX

使用场景#

  • 排行榜:实时游戏排名
  • 延迟队列:用分数代表执行时间
  • 优先级系统:用分数表示优先级
  • 范围查询:地理位置附近的人

服务器管理与维护命令#

配置与状态#

# 查看服务器信息
INFO  # 返回CPU、内存、持久化等完整信息
INFO memory  # 仅内存信息
 
# 查看配置参数
CONFIG GET maxmemory
 
# 动态修改配置
CONFIG SET timeout 300  # 设置超时时间

持久化操作#

# 手动保存到RDB
SAVE  # 阻塞主线程(生产环境避免使用)
BGSAVE  # 后台异步保存
 
# 强制AOF重写
BGREWRITEAOF

内存分析#

# 内存使用详情
MEMORY USAGE user:1001
 
# 内存分析
MEMORY DOCTOR

连接管理#

# 查看客户端连接
CLIENT LIST
 
# 终止连接
CLIENT KILL ip:port
 
# 监控命令执行
MONITOR  # 实时显示所有命令(谨慎使用)

最佳实践#

  1. 避免生产环境使用KEYS/MONITOR:会阻塞服务器
  2. 使用SLOWLOG分析性能SLOWLOG GET 10 获取最近10条慢查询
  3. 定期备份:结合BGSAVECOPY命令备份RDB文件
  4. 监控内存:设置maxmemory并配置淘汰策略

事务与批量操作#

事务操作#

# 开启事务
MULTI
 
# 队列命令
SET user:1001:name "John"
INCR user:1001:visits
 
# 执行事务
EXEC

批量操作#

# 管道(Pipeline)示例
$ echo -e "SET key1 value1\nGET key1\nINCR counter" | redis-cli --pipe

Lua脚本#

-- 原子操作:更新并获取值
local current = redis.call('GET', KEYS[1])
local newval = current + ARGV[1]
redis.call('SET', KEYS[1], newval)
return newval

调用方式:EVAL "script" 1 counter 5

最佳实践#

  1. 避免事务中使用慢查询:事务是串行执行
  2. 使用Lua替代复杂事务:保证原子性同时减少网络开销
  3. 管道处理批量操作:减少网络往返时间
  4. WATCH实现乐观锁WATCH key + MULTI/EXEC

性能优化与最佳实践#

核心优化策略#

  1. 精简键名设计:在可读性前提下尽量缩短键名长度

  2. 选择合适数据结构

    • 频繁更新的计数器 → String
    • 对象属性 → Hash
    • 时间序列 → Sorted Set
    • 社交关系 → Set
  3. 内存优化技巧

    # 启用内存优化
    CONFIG SET hash-max-ziplist-entries 512
    CONFIG SET set-max-intset-entries 512
  4. 读写分离:配置从库处理读请求

监控与调优#

  1. 关键监控指标

    • 内存使用率(used_memory
    • 命中率(keyspace_hits/keyspace_misses
    • 延迟(latency
  2. 慢查询分析

    # 设置慢查询阈值(微秒)
    CONFIG SET slowlog-log-slower-than 10000
    # 查看慢查询
    SLOWLOG GET 5

集群管理#

  1. 水平扩展:使用Redis Cluster自动分片
  2. 故障转移:配置Sentinel实现高可用
  3. 大键拆分
    # 拆分大Hash为多个键
    HSET user:1001:part1 name "John"
    HSET user:1001:part2 email "[email protected]"

结语#

掌握Redis的核心命令是高效使用Redis的基础。通过本文详尽的命令分类解析和场景示例,相信你已经构建起Redis命令体系的完整认知。记住:

  1. 实践出真知:在测试环境中尝试所有命令
  2. 知其所以然:不仅记住语法,更要理解每个命令的时间复杂度
  3. 安全至上:生产环境操作前做好备份
  4. 性能优先:始终关注命令执行对延迟的影响

随着Redis 7.0新特性的加入(如Function、Sharded Pub/Sub等),命令体系仍在不断演进。建议定期查阅官方文档获取最新信息。


参考资料#

  1. Redis官方命令文档
  2. [Redis实战 第2版] Josiah L. Carlson著
  3. [Redis设计与实现] 黄健宏著
  4. Redis内存优化手册
  5. Redis事务文档

知识要点:深入理解Redis核心命令及其底层实现原理,是构建高性能分布式系统的关键所在。