redis介绍及数据类型

发布于:2025-02-26 ⋅ 阅读:(18) ⋅ 点赞:(0)

.1 Redis 是什么?

  • 定义:Redis(Remote Dictionary Server)是一款开源的 内存数据结构存储系统,支持持久化,常被用作数据库、缓存、消息中间件。

  • 核心特点

    • 高性能:数据存储在内存中,读写速度达微秒级(10万+/秒 QPS)。

    • 数据结构丰富:支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(ZSet)等。

    • 持久化:支持 RDB(快照)和 AOF(日志追加)两种数据持久化方式。

    • 高可用:通过 Redis Sentinel 实现故障转移,Redis Cluster 支持分布式集群。

2. Redis 技术架构

核心组件
  1. 单线程模型

    • 基于 Reactor 模式,单线程处理命令(避免锁竞争,但需避免长耗时操作)。

  2. 持久化机制

    • RDB:定时生成内存快照(SAVE/BGSAVE),恢复快但可能丢数据。

    • AOF:记录所有写操作命令(可配置同步策略),数据更安全但文件较大。

  3. 高可用方案

    • 主从复制:主节点(Master)异步复制数据到从节点(Slave)。

    • Sentinel:监控主节点故障并自动切换从节点为主节点。

    • Cluster:分片存储(16384个槽),支持横向扩展与自动故障转移。

3. 核心数据结构与使用场景

数据结构 特性 典型场景
String 简单键值对 缓存、计数器(如PV/UV统计)
Hash 键值对集合(类似对象) 存储用户信息(如用户ID→姓名/年龄)
List 有序可重复元素集合 消息队列、最新消息列表
Set 无序唯一元素集合 标签系统、共同好友(交集并集)
ZSet 带权重的有序集合(按分数排序) 排行榜、延迟任务队列
Stream 消息流(类似Kafka) 事件溯源、日志处理(Redis 5.0+)

1. 字符串(String)

  • 描述:最基本的数据类型,可存储文本、数字或二进制数据(最大 512MB)。

  • 常用命令

    • SET key value:设置键值。

    • GET key:获取值。

    • INCR key:将值自增 1(适用于计数器)。

    • EXPIRE key seconds:设置过期时间。

  • 示例

    SET visits 100     # 存储访问量
    INCR visits        # 访问量+1 → 101
    GET visits         # 返回 "101"
  • 应用场景:缓存、计数器、分布式锁。


2. 列表(List)

  • 描述:双向链表结构,支持在两端快速插入/删除元素。

  • 常用命令

    • LPUSH key value1 [value2...]:左侧插入元素。

    • RPUSH key value1 [value2...]:右侧插入元素。

    • LPOP key / RPOP key:弹出左/右侧元素。

    • LRANGE key start end:获取范围内的元素。

  • 示例

    LPUSH tasks "task1"    # 左侧插入任务
    RPUSH tasks "task2"    # 右侧插入任务
    LPOP tasks             # 取出最左的 "task1"
    LRANGE tasks 0 -1      # 获取所有元素
  • 应用场景:消息队列、最新消息列表、历史记录。


3. 哈希(Hash)

  • 描述:键值对的集合,适合存储对象(如用户信息)。

  • 常用命令

    • HSET key field value:设置字段值。

    • HGET key field:获取字段值。

    • HGETALL key:获取所有字段和值。

    • HDEL key field:删除字段。

  • 示例

    HSET user:1 name "Alice" age 30   # 存储用户信息
    HGET user:1 name                  # 返回 "Alice"
    HGETALL user:1                    # 返回所有字段
  • 应用场景:存储对象属性(如用户配置、商品详情)。


4. 集合(Set)

  • 描述:无序且元素唯一的集合,支持交/并/差集运算。

  • 常用命令

    • SADD key member1 [member2...]:添加元素。

    • SMEMBERS key:获取所有元素。

    • SINTER key1 key2:求交集。

    • SISMEMBER key member:判断元素是否存在。

  • 示例

    SADD tags "redis" "database"   # 添加标签
    SADD tags2 "database"
    SINTER tags tags2             # 返回共同标签 "database"
  • 应用场景:标签系统、好友关系、去重。


5. 有序集合(Sorted Set / ZSet)

  • 描述:元素按关联的分数(score)排序,成员唯一但分数可重复。

  • 常用命令

    • ZADD key score member:添加元素(带分数)。

    • ZRANGE key start end [WITHSCORES]:按分数升序获取成员。

    • ZREVRANGE key start end:按分数降序获取成员(适用于排行榜)。

    • ZRANK key member:获取成员排名(升序)。

  • 示例

    bash

    复制

    ZADD leaderboard 100 "Alice" 200 "Bob"  # 添加分数
    ZREVRANGE leaderboard 0 -1 WITHSCORES   # 返回排名:Bob(200), Alice(100)
  • 应用场景:排行榜、优先级队列、带权重的任务调度。


其他高级类型

  • 位图(Bitmap):通过字符串的位操作实现,如统计活跃用户(SETBIT/BITCOUNT)。

  • HyperLogLog:基数估算(统计独立访客,PFADD/PFCOUNT)。

  • 地理空间(Geospatial):存储经纬度,支持范围查询(GEOADD/GEORADIUS)。


使用建议

  • 字符串:简单键值或需原子操作的场景。

  • 列表:需要顺序访问或快速操作头尾元素的场景。

  • 哈希:存储多字段对象,减少键的数量。

  • 集合:去重或集合运算。

  • 有序集合:需按权重排序的场景。

掌握这些类型及适用场景,能高效利用 Redis 解决高并发、实时数据处理等问题。

4. 典型应用场景

✅ 缓存加速
  • 场景:缓解数据库压力,缓存热点数据(如商品详情页)。

  • 实现:通过 SETEX 设置过期时间,结合缓存击穿/雪崩防护策略。

✅ 会话存储(Session Storage)
  • 场景:分布式系统中存储用户登录状态。

  • 优势:比数据库存储更快,比Cookie更安全。

✅ 实时排行榜
  • 实现:使用 ZSET 按分数排序(如游戏积分排行榜)。

  • 命令示例ZADD rank 100 "user1"ZREVRANGE rank 0 9(取前10名)。

✅ 消息队列
  • 实现:使用 LPUSH/BRPOP 或 Stream 数据结构(支持消费者组)。

  • 对比:轻量级但功能弱于 RabbitMQ/Kafka,适合简单场景。


5. Redis 使用注意事项

内存管理
  • 监控:定期检查内存使用(INFO memory),避免 OOM(内存溢出)。

  • 淘汰策略:配置 maxmemory-policy(如 volatile-lru 删除最近最少使用的带过期键)。

性能优化
  • 避免大 Key(如单个 Value 超过 1MB)。

  • 使用 Pipeline 或 Lua 脚本减少网络往返。

安全性
  • 启用密码认证(requirepass)。

  • 限制外网访问(绑定 127.0.0.1 或使用防火墙)。


6. Redis 与同类工具对比

工具 Redis Memcached Kafka
数据模型 多数据结构 仅键值对 消息流(分区、持久化)
持久化 支持 不支持 支持
适用场景 缓存、实时计算、消息队列 纯缓存 高吞吐量消息系统

7. 学习资源推荐

  • 官方文档redis.io/documentation

  • 书籍:《Redis设计与实现》《Redis实战》

  • 工具

    • RedisInsight:官方可视化监控工具。

    • Redisson:Java 客户端(支持分布式锁、限流)。