Skip to content

Redis的数据结构、特点,在项目里是如何使用的

约 957 字大约 3 分钟

Redis美团

2025-04-14

⭐ 题目日期:

美团 - 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 核心特点

  1. 内存存储

    • 数据存储在内存中,读写速度极快(可达 10万+/秒 QPS)。
    • 支持异步持久化(RDB 快照、AOF 日志),避免数据丢失。
  2. 单线程模型

    • 避免多线程竞争,保证原子性操作。
    • 基于非阻塞 I/O 多路复用,高效处理并发请求。
  3. 丰富的数据结构

    • 支持多种数据结构,可直接解决复杂业务场景(如排行榜、去重统计)。
  4. 高可用与扩展

    • 支持主从复制、哨兵模式、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 使用注意事项

  1. 内存管理
    • 监控内存使用,避免 OOM(可通过 maxmemory 配置淘汰策略,如 LRU)。
  2. 持久化选择
    • RDB:适合备份,但可能丢失最近数据。
    • AOF:数据更安全,但文件体积大。
  3. 热点 Key
    • 对高频访问的 Key 进行拆分或本地缓存。
  4. 集群模式
    • 数据量大时使用 Redis Cluster,避免单节点瓶颈。

五、Redis vs 其他缓存方案

对比项RedisMemcached
数据结构支持多种复杂结构仅 String
持久化支持 RDB/AOF不支持
线程模型单线程多线程
适用场景复杂业务逻辑(如排行榜)简单键值缓存

总结:Redis 凭借其高性能和丰富的数据结构,成为分布式系统中的“瑞士军刀”。合理选择数据结构和持久化策略,可显著提升系统性能和可维护性。