1. Redis通用命令概述
Redis作为当今最流行的内存数据库之一,其命令行接口是开发者日常操作的核心工具。我使用Redis已有7年时间,从最初的简单键值存储到现在的复杂数据结构应用,深刻体会到掌握通用命令的重要性。这些命令就像是Redis的"瑞士军刀",无论你使用哪种数据结构,它们都能提供基础而强大的操作能力。
在Redis 6.2版本中,官方文档列出的通用命令共有24个,这些命令不针对特定数据类型,而是对所有键都适用。实际工作中,我发现80%的日常操作都可以用不到10个通用命令完成。本文将重点介绍最实用的8个核心命令,这些命令经过我多年实战验证,能覆盖大部分使用场景。
提示:虽然这些是"通用"命令,但不同Redis版本可能存在细微差异,建议先通过
redis-cli --version确认你的Redis版本。
2. 键操作基础命令
2.1 EXISTS - 键存在性检查
这个命令我几乎每天都要用几十次,它的基本语法是:
EXISTS key [key ...]当我们需要检查某个缓存是否已设置时,EXISTS是首选。比如在电商系统中检查用户购物车是否初始化:
127.0.0.1:6379> EXISTS user:1001:cart (integer) 0 # 返回0表示不存在实用技巧:
- 可以一次检查多个键,返回的是存在的键数量
- 在集群模式下,所有键必须位于同一slot,否则会报错
- 性能极高,时间复杂度O(1),不用担心频繁调用影响性能
2.2 DEL - 键删除
删除操作看似简单,但有些细节需要注意:
DEL key [key ...]实际案例:清除用户会话数据
127.0.0.1:6379> DEL user:1001:session user:1001:cart (integer) 2 # 返回成功删除的键数量注意事项:
- Redis 4.0+支持异步删除(UNLINK),大数据量时性能更好
- 删除不存在的键不会报错,返回0
- 生产环境慎用通配符删除,建议先用SCAN检查
2.3 EXPIRE - 设置过期时间
这是实现缓存特性的核心命令:
EXPIRE key seconds典型应用场景:设置API调用频率限制
127.0.0.1:6379> SET api:limit:user1001 10 OK 127.0.0.1:6379> EXPIRE api:limit:user1001 60 (integer) 1进阶用法:
- PEXPIRE以毫秒为单位设置过期
- EXPIREAT指定Unix时间戳过期
- 对已过期的键操作会返回-2
3. 键信息查询命令
3.1 TYPE - 获取键类型
在操作未知键时,这个命令能避免很多错误:
TYPE key使用示例:
127.0.0.1:6379> SET test:str "hello" OK 127.0.0.1:6379> TYPE test:str string重要提示:
- 返回类型包括:string, list, set, zset, hash, stream等
- 不存在的键返回"none"
- 在Lua脚本中常用此命令做类型检查
3.2 TTL - 查看剩余生存时间
检查缓存何时失效的必备命令:
TTL key实际应用:
127.0.0.1:6379> SET session:user1001 "data" EX 3600 OK 127.0.0.1:6379> TTL session:user1001 (integer) 3598返回值说明:
- -2:键不存在
- -1:键存在但没有设置过期
- 正整数:剩余的生存时间(秒)
4. 批量操作命令
4.1 SCAN - 安全遍历键
替代KEYS命令的安全选择:
SCAN cursor [MATCH pattern] [COUNT count]生产环境示例:
127.0.0.1:6379> SCAN 0 MATCH user:* COUNT 100 1) "125" 2) 1) "user:1001" 2) "user:1002"为什么推荐SCAN:
- 不会阻塞服务器,适合生产环境
- 可以配合MATCH实现模式匹配
- COUNT参数只是建议值,实际返回可能不同
- 遍历过程中键可能被修改,这是预期行为
4.2 RENAME - 键重命名
修改键名而不丢失数据:
RENAME key newkey使用场景:数据迁移
127.0.0.1:6379> SET old:key "value" OK 127.0.0.1:6379> RENAME old:key new:key OK注意事项:
- 如果newkey已存在,它会被覆盖
- 在集群模式下,key和newkey必须在同一slot
- 大数据量键的RENAME可能阻塞Redis
5. 实用技巧与常见问题
5.1 命令组合使用示例
实际工作中,我们经常组合使用这些命令。比如实现一个安全的缓存更新逻辑:
# 检查键是否存在 127.0.0.1:6379> EXISTS product:1001 (integer) 1 # 获取剩余过期时间 127.0.0.1:6379> TTL product:1001 (integer) 300 # 更新数据并重置过期时间 127.0.0.1:6379> SET product:1001 "{...}" EX 3600 OK5.2 常见问题排查
问题1:DEL命令返回0但键确实存在
- 可能原因:键在另一节点(集群模式)
- 解决方案:使用正确的路由或跨节点删除工具
问题2:EXPIRE不生效
- 检查点:
- 确认键存在(EXISTS)
- 确认键类型(TYPE)
- 检查是否有持久化操作重置了过期时间
问题3:SCAN返回重复键
- 这是正常现象,因为SCAN基于游标分批次返回
- 最终一致性模型,保证不遗漏但不保证不重复
6. 性能优化建议
根据我的经验,合理使用通用命令可以显著提升Redis性能:
批量操作:尽可能使用批量形式的命令,如DEL key1 key2比多次DEL更高效
管道技术:将多个命令通过管道(pipeline)一次发送,减少网络往返
Lua脚本:复杂操作封装成原子性脚本,例如:
local exists = redis.call('EXISTS', KEYS[1]) if exists == 1 then return redis.call('GET', KEYS[1]) else redis.call('SET', KEYS[1], ARGV[1], 'EX', 3600) return nil end- 监控命令耗时:使用SLOWLOG GET查看慢查询,优化热点命令
7. 版本兼容性说明
不同Redis版本在通用命令上有细微差异:
- Redis 4.0+:新增UNLINK非阻塞删除
- Redis 5.0+:SCAN支持TYPE过滤
- Redis 6.2+:EXPIRE支持NX/XX/GT/LT选项
在实际项目中,我建议通过INFO SERVER查看版本信息,并参考对应版本的官方文档。对于关键系统,最好在测试环境验证命令行为是否符合预期。