一、Redis全局命令详解
1.1 键查看与管理
dbsize:高效获取键总数(O(1)操作)
127.0.0.1:6379> dbsize
(integer) 8
keys:生产环境避免使用(O(n)操作)
# 查找user开头的键(不推荐生产使用)
127.0.0.1:6379> keys user:*
exists:检查键是否存在
127.0.0.1:6379> exists user:1
(integer) 1
1.2 键删除与过期
del:删除单个或多个键
# 删除多个键
127.0.0.1:6379> del user:1 user:2
(integer) 2
expire:设置过期时间(秒)
127.0.0.1:6379> set session:1 "data"
OK
127.0.0.1:6379> expire session:1 300
(integer) 1
ttl:查看剩余生存时间
127.0.0.1:6379> ttl session:1
(integer) 287 # 剩余秒数
1.3 高级过期控制
pexpire:毫秒级过期设置
127.0.0.1:6379> pexpire temp:key 5000
(integer) 1
expireat:指定时间戳过期
# 设置今晚22:00过期
127.0.0.1:6379> expireat event:1 1730000000
(integer) 1
过期时间陷阱:修改键值会清除过期时间
127.0.0.1:6379> set user:1 "John" ex 60
OK
127.0.0.1:6379> ttl user:1
(integer) 57
127.0.0.1:6379> set user:1 "Mike"
OK
127.0.0.1:6379> ttl user:1
(integer) -1 # 永久有效
1.4 键重命名注意事项
rename:可能覆盖现有键
127.0.0.1:6379> set old_key "value1"
OK
127.0.0.1:6379> set new_key "value2"
OK
127.0.0.1:6379> rename old_key new_key
OK
127.0.0.1:6379> get new_key
"value1" # 原值被覆盖
renamenx:安全重命名(仅当新键不存在时)
127.0.0.1:6379> renamenx safe_key new_key
(integer) 0 # 重命名失败
二、Redis数据类型深度解析
2.1 字符串(String)
核心命令:
# 批量操作提升性能
127.0.0.1:6379> mset counter:1 100 counter:2 200
OK
# 原子计数器
127.0.0.1:6379> incr counter:1
(integer) 101
# 分布式锁实现
127.0.0.1:6379> setnx lock:order 1
(integer) 1 # 获取锁成功
使用场景:
缓存热点数据
分布式Session存储
计数器(点击量/浏览量)
简单限流系统
2.2 哈希(Hash)
对象存储最佳实践:
# 存储用户对象
127.0.0.1:6379> hmset user:1001 name "John" age 30 city "New York"
OK
# 获取部分字段
127.0.0.1:6379> hmget user:1001 name age
1) "John"
2) "30"
# 字段自增
127.0.0.1:6379> hincrby user:1001 age 1
(integer) 31
vs 字符串存储方案:
方案 | 优点 | 缺点 |
---|---|---|
哈希存储 | 字段级访问,内存效率高 | 不支持复杂查询 |
JSON序列化 | 直观,结构清晰 | 读写需序列化,无法部分更新 |
多键存储 | 灵活,支持独立过期 | 键数量膨胀,管理复杂 |
2.3 列表(List)
实现队列与栈:
# 消息队列实现
# 生产者
127.0.0.1:6379> lpush msg:queue "task1"
(integer) 1
# 消费者(阻塞式)
127.0.0.1:6379> brpop msg:queue 30
1) "msg:queue"
2) "task1"
# 栈实现
127.0.0.1:6379> lpush stack "A"
127.0.0.1:6379> lpush stack "B"
127.0.0.1:6379> lpop stack
"B"
高级应用:
文章分页列表
最近联系人列表
有限集合(LTRIM)
2.4 集合(Set)
标签系统实现:
# 用户标签
127.0.0.1:6379> sadd user:1001:tags "sports" "music"
(integer) 2
# 内容标签
127.0.0.1:6379> sadd news:1001:tags "politics" "economics"
# 查找共同兴趣
127.0.0.1:6379> sinter user:1001:tags user:1002:tags
1) "sports"
抽奖系统:
# 参与抽奖
127.0.0.1:6379> sadd lottery:2023 "user1001" "user1002" "user1003"
# 随机抽取3名中奖者
127.0.0.1:6379> srandmember lottery:2023 3
1) "user1002"
2) "user1001"
3) "user1003"
2.5 有序集合(Zset)
排行榜实现:
# 添加玩家分数
127.0.0.1:6379> zadd leaderboard 3500 "player1"
127.0.0.1:6379> zadd leaderboard 4200 "player2"
# 更新分数
127.0.0.1:6379> zincrby leaderboard 500 "player1"
"4000"
# 获取Top3
127.0.0.1:6379> zrevrange leaderboard 0 2 withscores
1) "player2"
2) "4200"
3) "player1"
4) "4000"
多维度评分:
# 计算用户综合评分(50%行为分+50%消费分)
127.0.0.1:6379> zinterstore user:composite 2
user:behavior_scores user:spending_scores
weights 0.5 0.5 aggregate sum
三、Redis最佳实践
3.1 键命名规范
推荐格式: 业务名:对象名:id[:属性]
示例: ecommerce:user:1001:profile
优势:
避免键冲突
结构清晰可维护
支持部分匹配查询
3.2 性能优化要点
避免大Key:
字符串值 < 10KB
集合元素 < 5000
批量操作:
# 低效方式 for i in {1..100}; do redis-cli set key:$i value; done # 高效方式 redis-cli mset $(printf "key:%d value " {1..100})
合理使用数据结构:
场景 推荐结构 对象存储 Hash 排行榜 Zset 消息队列 List 标签系统 Set
3.3 高级特性应用
位图(Bitmap):
# 用户签到系统
127.0.0.1:6379> setbit sign:user:1001 0 1 # 第1天签到
127.0.0.1:6379> bitcount sign:user:1001 # 总签到次数
地理空间(Geo):
# 添加位置
127.0.0.1:6379> geoadd shops 116.404 39.915 "shopA"
# 查找5km内的店铺
127.0.0.1:6379> georadius shops 116.400 39.910 5 km
1) "shopA"
四、实战:电商场景Redis应用
4.1 购物车实现(Hash)
# 添加商品
127.0.0.1:6379> hset cart:user1001 prod1001 2
(integer) 1
# 增加数量
127.0.0.1:6379> hincrby cart:user1001 prod1001 1
(integer) 3
# 获取全部商品
127.0.0.1:6379> hgetall cart:user1001
1) "prod1001"
2) "3"
4.2 秒杀系统(String+List)
# 商品库存预热
127.0.0.1:6379> set stock:prod2023 100
# 扣减库存(Lua脚本保证原子性)
local stock = redis.call('get', KEYS[1])
if stock and tonumber(stock) > 0 then
redis.call('decr', KEYS[1])
redis.call('lpush', 'seckill:success', ARGV[1])
return 1
end
return 0
4.3 好友推荐(Set)
# 计算共同好友
127.0.0.1:6379> sinter friends:user1001 friends:user1002
# 推荐可能认识的人
127.0.0.1:6379> sdiff friends:user1002 friends:user1001
总结
Redis作为高性能的内存数据库,其核心价值在于合理利用不同数据结构解决特定场景问题:
字符串:简单缓存、计数器首选
哈希:对象存储最佳选择,节省内存
列表:消息队列、最新列表实现
集合:标签系统、社交关系处理
有序集合:排行榜、优先级队列场景
提示:本文所有命令均在Redis 6.x版本验证,不同版本命令支持可能略有差异。生产环境建议使用连接池管理连接,避免频繁创建连接开销。