知识梳理-redis

B站视频1
B站视频2

数据类型

Redis 支持丰富的数据类型,每种类型都有独特的存储结构和适用场景,以下是其核心数据类型及扩展类型的详细介绍:

一、基础数据类型(5大核心类型)

1. 字符串(STRING)

  • 存储结构:简单动态字符串(SDS),支持最大 512MB 的值。
  • 特点:单键值存储,支持二进制安全(可存储图片、序列化对象等),支持原子性操作(如自增、拼接)。
  • 常用命令
    SET key value         # 赋值
    GET key               # 获取值
    INCR key              # 自增(数值型)
    APPEND key value      # 拼接字符串
    STRLEN key            # 获取字符串长度
    
  • 使用场景
    • 缓存基本数据(如用户 ID、配置信息)。
    • 计数器(如点赞数、接口调用次数):INCR 原子性保证并发安全。
    • 分布式锁(通过 SET key value NX EX 实现)。

2. 哈希(HASH)

  • 存储结构:键值对的集合,底层使用 哈希表(数据量大时)或 压缩列表(ziplist)(数据量小时)。
  • 特点:用于存储对象,单个字段的操作是原子性的,节省内存(相比每个字段用独立字符串)。
  • 常用命令
    HSET hash_key field value   # 设置字段值
    HGET hash_key field         # 获取字段值
    HGETALL hash_key            # 获取所有字段和值
    HINCRBY hash_key field 1    # 字段值自增
    HEXISTS hash_key field      # 检查字段是否存在
    
  • 使用场景
    • 存储用户信息、商品详情等对象数据(如 user:1 存储用户姓名、年龄等字段)。
    • 计数器分组(如统计每个用户的操作次数)。

3. 列表(LIST)

  • 存储结构:双向链表,底层使用 链表(元素为字符串且长度较长时)或 压缩列表(ziplist)(元素短且数量少时)。
  • 特点:有序、可重复,支持从头部(左)或尾部(右)插入/删除元素。
  • 常用命令
    LPUSH list_key value      # 左插入元素
    RPUSH list_key value      # 右插入元素
    LPOP list_key             # 左弹出元素
    RPOP list_key             # 右弹出元素
    LRANGE list_key 0 -1      # 获取所有元素(0开始,-1结束)
    
  • 使用场景
    • 消息队列(如 LPUSH 生产消息,RPOP 消费消息),支持阻塞式弹出(BRPOP)。
    • 最新列表/历史记录(如朋友圈动态,通过 LRANGE 分页获取)。
    • 栈(LPUSH + LPOP 实现后进先出)。

4. 集合(SET)

  • 存储结构:无序、唯一的元素集合,底层使用 哈希表(元素为字符串且长度较短时)或 整数集合(intset)(元素为整数且有序时)。
  • 特点:自动去重,支持集合运算(交集、并集、差集)。
  • 常用命令
    SADD set_key member      # 添加元素(去重)
    SREM set_key member      # 删除元素
    SMEMBERS set_key         # 获取所有元素
    SINTER set_key1 set_key2 # 求交集
    SUNION set_key1 set_key2 # 求并集
    SDIFF set_key1 set_key2  # 求差集(key1 有而 key2 没有的元素)
    
  • 使用场景
    • 去重存储(如用户标签、商品分类)。
    • 社交网络中的关注/粉丝关系(如 followers:1 存储用户1的粉丝)。
    • 全局去重(如统计网站独立访客数,SADD 自动过滤重复用户 ID)。

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

  • 存储结构:每个元素关联一个分数(score),按分数排序,底层使用 跳表(skiplist) + 哈希表(保证 O(1) 复杂度访问元素)。
  • 特点:有序、唯一,支持按分数或成员快速查询。
  • 常用命令
    ZADD zset_key score member  # 添加元素及分数
    ZRANGE zset_key 0 -1 WITHSCORES  # 按分数升序获取元素(带分数)
    ZREVRANGE zset_key 0 -1 WITHSCORES # 按分数降序获取元素
    ZSCORE zset_key member       # 获取元素的分数
    ZRANK zset_key member        # 获取元素的排名(升序)
    
  • 使用场景
    • 排行榜(如游戏积分排名、商品销量排序)。
    • 时间线(如按时间戳排序的动态,score 设为时间戳)。
    • 权重调度(如任务优先级,score 设为优先级数值)。

二、扩展数据类型(高级特性)

6. 位图(BITMAP)

  • 本质:基于字符串的二进制数组,每个位(bit)存储 0 或 1,用于高效存储布尔值。
  • 常用命令
    SETBIT bitmap_key offset value  # 设置某一位的值(offset从0开始)
    GETBIT bitmap_key offset        # 获取某一位的值
    BITCOUNT bitmap_key             # 统计值为1的位数(如活跃用户数)
    BITOP AND result_key key1 key2  # 多个位图按位与(交集)
    
  • 使用场景
    • 统计用户签到(每天对应一个位,SETBIT 标记是否签到)。
    • 活跃用户统计(BITCOUNT 计算一段时间内活跃的天数)。

7. HyperLogLog(HLL)

  • 本质:概率统计结构,用于估算数据的基数(去重后的元素个数),占用内存极低(12KB固定空间)。
  • 特点:牺牲一定精度(误差约 0.81%)换取高效存储,不存储具体元素。
  • 常用命令
    PFADD hll_key element         # 添加元素(去重)
    PFCOUNT hll_key                # 估算基数
    PFMERGE dest_key source_key1 source_key2  # 合并多个HLL
    
  • 使用场景
    • 统计网站 UV(独立访客数)、APP 日活(DAU)。
    • 搜索关键词统计(估算不同关键词的数量)。

8. 地理空间(GEO)

  • 本质:基于 ZSET 实现,每个元素关联经纬度坐标,支持距离计算和范围查询。
  • 常用命令
    GEOADD geo_key longitude latitude member  # 添加地理位置
    GEODIST geo_key member1 member2 km        # 计算两点距离(单位:km/mi)
    GEORADIUS geo_key longitude latitude radius km WITHCOORD  # 按半径搜索
    GEOPOS geo_key member                     # 获取坐标
    
  • 使用场景
    • 附近的人(如社交软件按距离筛选用户)。
    • 物流定位(追踪车辆、货物的位置)。

9. 流(STREAM)

  • Redis 5.0 新增:支持持久化的日志数据结构,类似 Kafka 的消息队列,支持多消费者组、消息回溯。
  • 特点:有序、支持自动生成唯一 ID(时间戳+序列号),每个消息包含键值对字段。
  • 常用命令
    XADD stream_key * field value  # 添加消息(* 自动生成ID)
    XREAD GROUP group consumer streams_key >  # 消费者组读取消息
    XACK stream_key group message_id  # 确认消息处理完成
    
  • 使用场景
    • 实时日志处理、事件溯源(如记录用户操作日志)。
    • 分布式消息队列(支持消费者组和消息持久化)。

三、数据类型对比与选择

类型 存储结构 核心特性 典型场景 内存效率(小数据)
STRING SDS(简单动态字符串) 单值存储、原子操作 缓存、计数器、分布式锁
HASH 哈希表/压缩列表 对象存储、字段级操作 用户信息、配置管理 高(压缩列表)
LIST 双向链表/压缩列表 有序、可重复、两端操作 队列、历史记录、栈
SET 哈希表/整数集合 无序、唯一、集合运算 去重、标签管理、交集/并集 高(整数集合)
ZSET 跳表+哈希表 有序、带权重、范围查询 排行榜、时间线、权重调度
BITMAP 二进制数组(基于STRING) 位操作、高效存储布尔值 签到统计、活跃用户分析 极高(1位/元素)
HyperLogLog 概率统计结构 基数估算、内存高效 UV统计、关键词去重 极高(12KB固定)
GEO 基于ZSET的坐标存储 地理距离计算、范围查询 附近的人、物流定位
STREAM 持久化日志结构 消息队列、消费者组支持 实时日志、事件驱动架构

四、选择建议

  1. 存储对象:优先用 HASH,避免大量独立字符串导致的内存碎片。
  2. 有序且带权重:ZSET 是唯一选择(如排行榜、时间线)。
  3. 去重与集合运算:SET 适合小规模精确去重,HyperLogLog 适合大规模基数估算(牺牲精度换内存)。
  4. 二进制或布尔值:BITMAP 用位操作处理海量数据(如 1亿用户的签到只需约 12MB 内存)。
  5. 消息队列:LIST 实现简单队列,STREAM 支持更复杂的持久化和消费者组功能。

缓存穿透、雪崩、击穿

问题 核心特征 核心成因 核心解决方案
缓存穿透 查不存在的 key,请求直达数据库 缓存和数据库均无该数据 布隆过滤器、空值缓存、参数校验
缓存雪崩 大量 key 同时过期或 Redis 故障 批量过期、集群故障 分散过期时间
缓存击穿 单个热点 key 过期,大量请求并发访问 热点 key 失效,未做并发保护 互斥锁、热点 key 永不过期、提前预热

持久化

  • RDB
  • AOF
    同步策略(刷盘策略)
posted on 2025-04-20 16:05  斜月三星一太阳  阅读(39)  评论(0)    收藏  举报