外观
Redis的数据结构、特点,在项目里是如何使用的
⭐ 题目日期:
美团 - 2025/4/12
📝 题解:
Redis 是一个高性能的 内存键值数据库,支持多种数据结构,广泛应用于缓存、消息队列、实时统计等场景。以下是 Redis 的核心数据结构、特点及实际项目中的典型使用方式:
一、Redis 核心数据结构
数据结构 | 特点及用途 | 示例命令 |
---|---|---|
String | 存储文本、数字或二进制数据(如缓存、计数器) | SET , GET , INCR |
Hash | 存储对象属性(如用户信息) | HSET , HGET , HGETALL |
List | 有序可重复集合(如消息队列、最新动态) | LPUSH , RPOP , LRANGE |
Set | 无序唯一集合(如标签、好友关系) | SADD , SMEMBERS , SINTER |
Sorted Set | 带权重的有序集合(如排行榜、优先级队列) | ZADD , ZRANGE , ZREVRANK |
HyperLogLog | 基数统计(如 UV 统计) | PFADD , PFCOUNT |
Bitmap | 位操作(如用户签到、布尔标记) | SETBIT , GETBIT , BITCOUNT |
Stream | 消息流(如日志采集、事件驱动) | XADD , XREAD , XGROUP |
二、Redis 核心特点
内存存储
- 数据存储在内存中,读写速度极快(可达 10万+/秒 QPS)。
- 支持异步持久化(RDB 快照、AOF 日志),避免数据丢失。
单线程模型
- 避免多线程竞争,保证原子性操作。
- 基于非阻塞 I/O 多路复用,高效处理并发请求。
丰富的数据结构
- 支持多种数据结构,可直接解决复杂业务场景(如排行榜、去重统计)。
高可用与扩展
- 支持主从复制、哨兵模式、Cluster 集群,实现高可用和横向扩展。
三、项目中 Redis 的典型使用场景
1. 缓存加速
- 场景:缓解数据库压力,加速热点数据访问(如商品详情页)。
- 实现:
# 缓存用户信息(String 或 Hash) SET user:1001 "{name: 'Alice', age: 25}" EXPIRE user:1001 3600 # 设置过期时间
2. 分布式锁
- 场景:解决分布式系统中的资源竞争问题。
- 实现:
# 加锁(SET + NX + PX 保证原子性) SET lock:order_123 "uuid" NX PX 30000 # 解锁(Lua 脚本保证原子性) EVAL "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end" 1 lock:order_123 uuid
3. 排行榜(Sorted Set)
- 场景:实时更新游戏玩家积分排名。
- 实现:
# 添加玩家分数 ZADD leaderboard 1000 "player1" ZADD leaderboard 950 "player2" # 获取前10名 ZREVRANGE leaderboard 0 9 WITHSCORES
4. 消息队列(List/Stream)
- 场景:异步处理订单创建、日志收集。
- 实现:
# 生产者推送消息 LPUSH order:queue "order_data" # 消费者阻塞获取消息 BRPOP order:queue 30
5. UV 统计(HyperLogLog)
- 场景:统计每日独立访客(无需精确去重)。
- 实现:
PFADD uv:20231001 "user1" "user2" PFCOUNT uv:20231001
6. 会话管理(Hash)
- 场景:存储用户登录态(如购物车、Token)。
- 实现:
HSET session:abc123 "user_id" 1001 "cart" "{items: [...]}" HGET session:abc123 "cart"
四、Redis 使用注意事项
- 内存管理
- 监控内存使用,避免 OOM(可通过
maxmemory
配置淘汰策略,如 LRU)。
- 监控内存使用,避免 OOM(可通过
- 持久化选择
- RDB:适合备份,但可能丢失最近数据。
- AOF:数据更安全,但文件体积大。
- 热点 Key
- 对高频访问的 Key 进行拆分或本地缓存。
- 集群模式
- 数据量大时使用 Redis Cluster,避免单节点瓶颈。
五、Redis vs 其他缓存方案
对比项 | Redis | Memcached |
---|---|---|
数据结构 | 支持多种复杂结构 | 仅 String |
持久化 | 支持 RDB/AOF | 不支持 |
线程模型 | 单线程 | 多线程 |
适用场景 | 复杂业务逻辑(如排行榜) | 简单键值缓存 |
总结:Redis 凭借其高性能和丰富的数据结构,成为分布式系统中的“瑞士军刀”。合理选择数据结构和持久化策略,可显著提升系统性能和可维护性。