Redis 常用操作命令详解
掌握 Redis 的核心操作命令,提升你的数据操作效率和系统性能
目录#
- Redis 简介
- 键(Key)操作命令
- 字符串(String)操作命令
- 哈希(Hash)操作命令
- 列表(List)操作命令
- 集合(Set)操作命令
- 有序集合(Sorted Set)操作命令
- 服务器管理与维护命令
- 事务与批量操作
- 性能优化与最佳实践
- 结语
- 参考资料
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" # 常用于分布式锁最佳实践#
- 合理设计键名:使用冒号分隔的命名约定(如:
user:1001:profile) - 避免使用
KEYS *:生产环境下使用SCAN命令代替,避免阻塞 - 设置TTL:对临时数据总是设置过期时间,避免内存泄漏
- 批量删除键:使用
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最佳实践#
- 存储对象:哈希是存储对象(如用户配置)的理想选择
- 避免大哈希:单个哈希包含过多字段(>1000)时考虑分片
- 管道操作:使用
PIPELINE批量执行多个HGETALL命令 - 小对象优化: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 # 实时显示所有命令(谨慎使用)最佳实践#
- 避免生产环境使用
KEYS/MONITOR:会阻塞服务器 - 使用
SLOWLOG分析性能:SLOWLOG GET 10获取最近10条慢查询 - 定期备份:结合
BGSAVE和COPY命令备份RDB文件 - 监控内存:设置
maxmemory并配置淘汰策略
事务与批量操作#
事务操作#
# 开启事务
MULTI
# 队列命令
SET user:1001:name "John"
INCR user:1001:visits
# 执行事务
EXEC批量操作#
# 管道(Pipeline)示例
$ echo -e "SET key1 value1\nGET key1\nINCR counter" | redis-cli --pipeLua脚本#
-- 原子操作:更新并获取值
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
最佳实践#
- 避免事务中使用慢查询:事务是串行执行
- 使用Lua替代复杂事务:保证原子性同时减少网络开销
- 管道处理批量操作:减少网络往返时间
- WATCH实现乐观锁:
WATCH key+MULTI/EXEC
性能优化与最佳实践#
核心优化策略#
-
精简键名设计:在可读性前提下尽量缩短键名长度
-
选择合适数据结构:
- 频繁更新的计数器 → String
- 对象属性 → Hash
- 时间序列 → Sorted Set
- 社交关系 → Set
-
内存优化技巧:
# 启用内存优化 CONFIG SET hash-max-ziplist-entries 512 CONFIG SET set-max-intset-entries 512 -
读写分离:配置从库处理读请求
监控与调优#
-
关键监控指标:
- 内存使用率(
used_memory) - 命中率(
keyspace_hits/keyspace_misses) - 延迟(
latency)
- 内存使用率(
-
慢查询分析:
# 设置慢查询阈值(微秒) CONFIG SET slowlog-log-slower-than 10000 # 查看慢查询 SLOWLOG GET 5
集群管理#
- 水平扩展:使用Redis Cluster自动分片
- 故障转移:配置Sentinel实现高可用
- 大键拆分:
# 拆分大Hash为多个键 HSET user:1001:part1 name "John" HSET user:1001:part2 email "[email protected]"
结语#
掌握Redis的核心命令是高效使用Redis的基础。通过本文详尽的命令分类解析和场景示例,相信你已经构建起Redis命令体系的完整认知。记住:
- 实践出真知:在测试环境中尝试所有命令
- 知其所以然:不仅记住语法,更要理解每个命令的时间复杂度
- 安全至上:生产环境操作前做好备份
- 性能优先:始终关注命令执行对延迟的影响
随着Redis 7.0新特性的加入(如Function、Sharded Pub/Sub等),命令体系仍在不断演进。建议定期查阅官方文档获取最新信息。
参考资料#
- Redis官方命令文档
- [Redis实战 第2版] Josiah L. Carlson著
- [Redis设计与实现] 黄健宏著
- Redis内存优化手册
- Redis事务文档
知识要点:深入理解Redis核心命令及其底层实现原理,是构建高性能分布式系统的关键所在。