Key生命周期管理
本课程将深入讲解键管理的核心概念和实践应用。主要内容包括:KEYS、EXISTS、DEL、TYPE、RENAME、EXPIRE、TTL、PERSIST、SCAN。
Redis的键管理是非常重要的功能模块,在实际开发中有广泛的应用。通过本课程的学习,你将全面掌握键管理的使用技巧。
# 删除单个键
DEL mykey
# 返回: (integer) 1
# 删除多个键
DEL key1 key2 key3
# 返回: (integer) 3
# 删除不存在的键
DEL nonexist
# 返回: (integer) 0
# 实际应用:清理过期数据
DEL session:user123 cart:user456
# 检查单个键
EXISTS mykey
# 返回: (integer) 1
# 检查多个键
EXISTS key1 key2 key3
# 返回: (integer) 2 # 表示有2个键存在
# 实际应用:检查缓存是否存在
if EXISTS cache:user:1001 {
# 缓存命中
} else {
# 缓存未命中,从数据库获取
}
# 获取键类型
TYPE mykey
# 返回: string
TYPE mylist
# 返回: list
TYPE myset
# 返回: set
# 实际应用:根据类型选择不同的操作
case $(redis-cli TYPE $key) in
"string") echo "处理字符串" ;;
"list") echo "处理列表" ;;
*) echo "其他类型" ;;
esac
# 重命名键
RENAME oldkey newkey
# 返回: OK
# 注意:如果newkey已存在,会被覆盖
# 安全的重命名(仅当newkey不存在时)
RENAMENX oldkey newkey
# 返回: (integer) 1 # 成功
# 返回: (integer) 0 # newkey已存在,失败
# 实际应用:原子性更新键名
RENAMENX temp:config config:current
# 移动键到数据库1
MOVE mykey 1
# 返回: (integer) 1
# 实际应用:数据分类管理
MOVE session:user123 1 # 会话数据到数据库1
MOVE cache:product:456 2 # 缓存数据到数据库2
# 设置过期时间(秒)
EXPIRE mykey 60
# 返回: (integer) 1
# 设置成功返回1,键不存在返回0
EXPIRE nonexist 60
# 返回: (integer) 0
# 实际应用:会话管理
EXPIRE session:user123 3600
# 设置过期时间(毫秒)
PEXPIRE mykey 60000
# 返回: (integer) 1
# 实际应用:精确的缓存控制
PEXPIRE cache:data 5000 # 5秒过期
# 设置过期时间戳(秒)
EXPIREAT mykey 1707024000
# 返回: (integer) 1
# 实际应用:定时任务
EXPIREAT task:reminder 1707024000 # 特定时间过期
# 查看剩余生存时间(秒)
TTL mykey
# 返回: (integer) 55
# 键不存在返回-2
TTL nonexist
# 返回: (integer) -2
# 键存在但无过期时间返回-1
TTL permanentkey
# 返回: (integer) -1
# 实际应用:监控缓存过期时间
if [ $(redis-cli TTL cache:user:1001) -lt 300 ]; then
# 缓存即将过期,准备更新
fi
# 查看剩余生存时间(毫秒)
PTTL mykey
# 返回: (integer) 55000
# 实际应用:高精度时间控制
PTTL cache:data
# 移除过期时间,使键永久存在
PERSIST mykey
# 返回: (integer) 1
# 实际应用:将临时数据转为永久数据
PERSIST user:1001:profile
# 匹配所有键
KEYS *
# 匹配以user开头的键
KEYS user:*
# 匹配以user开头,以:profile结尾的键
KEYS user:*:profile
# 匹配包含数字的键
KEYS *[0-9]*
# 实际应用:批量操作
for key in $(redis-cli KEYS "session:*"); do
redis-cli DEL $key
done
# 基本SCAN命令
SCAN 0
# 返回:
# 1) "10" # 下一次迭代的游标
# 2) 1) "key1"
# 2) "key2"
# 带匹配模式
SCAN 0 MATCH user:*
# 限制返回数量
SCAN 0 MATCH * COUNT 10
# 实际应用:安全遍历大数据库
cursor=0
while true; do
result=$(redis-cli SCAN $cursor MATCH "cache:*" COUNT 100)
cursor=$(echo $result | awk '{print $1}')
keys=$(echo $result | awk '{$1=""; print $0}')
if [ -n "$keys" ]; then
echo "处理键: $keys"
# 这里可以添加处理逻辑
fi
if [ "$cursor" == "0" ]; then
break
fi
done
# 遍历Set
SSCAN myset 0
# 遍历Hash
HSCAN myhash 0
# 遍历Sorted Set
ZSCAN myzset 0
# 实际应用:分批处理大集合
HSCAN user:1001:profile 0 COUNT 50
# 推荐的命名规范
# 格式:业务:对象:id:属性
user:1001:profile # 用户1001的资料
product:2001:stock # 商品2001的库存
order:3001:status # 订单3001的状态
# 避免的命名方式
user1001 # 不清晰
user_profile_1001 # 分隔符不一致
USER:1001:PROFILE # 大小写混用
| 命令 | 功能说明 | 时间复杂度 | 使用场景 |
|---|---|---|---|
| DEL | 删除键 | O(N) | 清理数据 |
| EXISTS | 检查键是否存在 | O(1) | 缓存检查 |
| TYPE | 获取键类型 | O(1) | 类型判断 |
| RENAME | 重命名键 | O(1) | 键名更新 |
| EXPIRE | 设置过期时间 | O(1) | 临时数据 |
| TTL | 查看剩余时间 | O(1) | 过期监控 |
| KEYS | 模式匹配 | O(N) | 开发环境 |
| SCAN | 安全遍历 | O(1) | 生产环境 |
通过本课程的学习,你已经掌握了Redis键管理的核心概念和使用方法:
键管理是Redis的重要功能,在实际开发中有广泛应用。合理的键管理策略可以提高系统性能,减少内存占用,确保数据的安全性和可靠性。继续深入学习和实践,你将能够更好地运用这些知识解决实际问题。