Redis 核心特性与基础详解(结合实例)
Redis(Re mote Di ctionary S ervice)是一个开源的内存数据库 ,以高性能 和灵活的数据结构著称。它被广泛用于缓存、消息队列、实时排行榜等场景。下面通过实际案例和操作,深入浅出地解析 Redis 的核心特性。
一、核心特性概览
- 内存存储,超高性能 :数据存储在内存中,读写速度达10万+/秒。
- 丰富的数据结构:支持字符串、哈希、列表、集合、有序集合等。
- 持久化 :通过 RDB 和 AOF 机制保障数据不丢失(详见之前的持久化详解)。
- 高可用与扩展:支持主从复制、哨兵(Sentinel)、集群(Cluster)。
- 原子操作与事务:支持简单事务和 Lua 脚本,保证操作原子性。
二、核心数据结构与使用场景
1. 字符串(String)
-
本质:最简单的键值对,值可以是文本、数字或二进制数据。
-
常用命令 :
bashSET user:1 "Alice" # 存储用户信息 GET user:1 # 获取用户信息 INCR article:1001:views # 文章阅读量+1(原子操作)
-
场景 :
- 缓存:存储用户会话、页面缓存。
- 计数器:文章阅读量、商品库存。
示例:记录商品库存
bash
> SET product:1001:stock 100 # 初始化库存为100
> DECR product:1001:stock # 扣减库存,返回99
2. 哈希(Hash)
-
本质:键值对的集合,适合存储对象。
-
常用命令 :
bashHSET user:1001 name "Bob" age 30 # 存储用户字段 HGET user:1001 name # 获取用户名 HGETALL user:1001 # 获取所有字段
-
场景 :
- 用户资料:存储多个字段(姓名、年龄、地址)。
- 商品详情:价格、库存、描述等属性。
示例:存储电商商品信息
bash
> HSET product:2001 title "iPhone 15" price 6999 stock 50
> HINCRBY product:2001 stock -1 # 扣减库存,返回49
3. 列表(List)
-
本质:有序元素集合,支持双向插入/删除。
-
常用命令 :
bashLPUSH news:latest "Article A" # 左侧插入文章 RPUSH news:latest "Article B" # 右侧插入文章 LRANGE news:latest 0 2 # 获取前3篇文章
-
场景 :
- 消息队列:实现生产者-消费者模型。
- 最新动态:展示用户最近浏览记录。
示例:构建简单消息队列
bash
# 生产者发送消息
> LPUSH msg:queue "Task: Backup DB"
# 消费者获取消息
> RPOP msg:queue # 返回"Task: Backup DB"
4. 集合(Set)
-
本质:无序且元素唯一的集合,支持交并差运算。
-
常用命令 :
bashSADD tags:article:1001 "tech" "database" # 添加标签 SMEMBERS tags:article:1001 # 查看所有标签 SINTER tags:article:1001 tags:user:1 # 求交集(共同标签)
-
场景 :
- 标签系统:文章标签、用户兴趣。
- 抽奖去重:确保用户不重复中奖。
示例:统计共同好友
bash
> SADD user:1001:friends "user:2001" "user:2002"
> SADD user:1002:friends "user:2001" "user:2003"
> SINTER user:1001:friends user:1002:friends # 返回共同好友"user:2001"
5. 有序集合(ZSet)
-
本质:元素按分数(score)排序的集合,适合排行榜。
-
常用命令 :
bashZADD leaderboard 1000 "PlayerA" # 添加玩家得分 ZREVRANGE leaderboard 0 2 WITHSCORES # 查看前三名 ZRANK leaderboard "PlayerA" # 查看玩家排名
-
场景 :
- 实时排行榜:游戏得分、热搜榜单。
- 延迟队列:按执行时间排序的任务队列。
示例:游戏玩家排行榜
bash
> ZADD game:rank 1500 "Alice" # Alice得分1500
> ZADD game:rank 1800 "Bob" # Bob得分1800
> ZREVRANGE game:rank 0 -1 WITHSCORES # 返回["Bob", 1800, "Alice", 1500]
三、其他核心功能
1. 过期时间与自动删除
-
本质:为键设置生存时间(TTL),到期自动删除。
-
常用命令 :
bashSET session:1234 "{...}" EX 3600 # 会话1小时后过期 TTL session:1234 # 查看剩余生存时间(秒)
-
场景 :
- 会话缓存:用户登录态自动失效。
- 限时优惠:促销活动倒计时。
2. 事务(Transactions)
-
本质:将多个命令打包执行(类似数据库事务),但不支持回滚。
-
操作步骤 :
bashMULTI # 开启事务 SET balance:Alice 1000 DECRBY balance:Alice 100 EXEC # 提交执行(或 DISCARD 取消)
-
注意 :Redis 事务是原子性的,但中间命令出错不会回滚已执行的命令。
3. 发布订阅(Pub/Sub)
-
本质:消息通信模式,生产者发布消息,消费者订阅频道。
-
常用命令 :
bash# 消费者订阅频道 SUBSCRIBE news:tech # 生产者发布消息 PUBLISH news:tech "Redis 7.0 released!"
-
场景 :
- 实时通知:订单状态更新、系统告警。
四、高可用与扩展
1. 主从复制(Replication)
-
原理:主节点(Master)异步复制数据到从节点(Slave),实现读写分离。
-
配置步骤 :
-
启动主节点(默认模式)。
-
在从节点配置文件(
redis.conf
)中添加:bashreplicaof <master-ip> <master-port>
-
-
示例:电商系统将读请求分流到从节点,减轻主节点压力。
2. 哨兵(Sentinel)
- 原理:监控主从节点,自动故障转移(主节点宕机时选举新主)。
- 配置步骤 :
-
创建哨兵配置文件
sentinel.conf
:bashsentinel monitor mymaster 127.0.0.1 6379 2 # 监控主节点 sentinel down-after-milliseconds mymaster 5000 # 5秒无响应判定宕机
-
启动哨兵:
bashredis-sentinel sentinel.conf
-
3. 集群(Cluster)
- 原理:数据分片存储在多个节点,支持水平扩展。
- 操作步骤 :
-
创建集群(至少3主3从):
bashredis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 ... --cluster-replicas 1
-
客户端连接集群:
bashredis-cli -c -p 7000 # -c 表示启用集群模式
-
五、实战:使用 Redis 实现文章投票系统
需求:用户可为文章投票,每篇文章最多投1票,按票数实时排行。
1. 数据结构设计
- 文章信息:哈希存储(标题、作者、发布时间等)。
- 文章得分:有序集合(按票数和时间排序)。
- 用户投票记录:集合(记录已投票的用户)。
2. 关键操作
bash
# 发布文章
HMSET article:1001 title "Redis Guide" author "Alice" time 1630000000
# 用户投票(原子操作:检查是否已投票 + 更新得分)
WATCH article:1001:votes # 开启乐观锁
MULTI
SADD user:2001:votes 1001 # 记录用户投票
ZINCRBY article:scores 432 article:1001 # 432=票数*权重 + 时间衰减
EXEC
六、总结
- 核心优势 :
- 数据结构多样性:灵活应对不同场景。
- 内存级速度:适用于高并发读写。
- 高可用架构:主从复制、哨兵、集群保障稳定性。
- 学习路径 :
- 掌握基础数据结构(String/Hash/List/Set/ZSet)。
- 熟悉事务、过期时间、Pub/Sub 等进阶功能。
- 部署高可用架构(主从、哨兵、集群)。
行动建议:
- 本地安装 Redis,通过
redis-cli
练习基础命令。 - 结合业务场景(如缓存、排行榜)设计数据结构。
- 生产环境优先使用哨兵或集群保障高可用。
通过理解这些核心特性,你可以充分发挥 Redis 的潜力,构建高性能、可靠的应用系统!