知识梳理-redis
数据类型
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 实现后进先出)。
- 消息队列(如 LPUSH 生产消息,RPOP 消费消息),支持阻塞式弹出(
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 | 持久化日志结构 | 消息队列、消费者组支持 | 实时日志、事件驱动架构 | 中 |
四、选择建议
- 存储对象:优先用 HASH,避免大量独立字符串导致的内存碎片。
- 有序且带权重:ZSET 是唯一选择(如排行榜、时间线)。
- 去重与集合运算:SET 适合小规模精确去重,HyperLogLog 适合大规模基数估算(牺牲精度换内存)。
- 二进制或布尔值:BITMAP 用位操作处理海量数据(如 1亿用户的签到只需约 12MB 内存)。
- 消息队列:LIST 实现简单队列,STREAM 支持更复杂的持久化和消费者组功能。
缓存穿透、雪崩、击穿
| 问题 | 核心特征 | 核心成因 | 核心解决方案 |
|---|---|---|---|
| 缓存穿透 | 查不存在的 key,请求直达数据库 | 缓存和数据库均无该数据 | 布隆过滤器、空值缓存、参数校验 |
| 缓存雪崩 | 大量 key 同时过期或 Redis 故障 | 批量过期、集群故障 | 分散过期时间 |
| 缓存击穿 | 单个热点 key 过期,大量请求并发访问 | 热点 key 失效,未做并发保护 | 互斥锁、热点 key 永不过期、提前预热 |
持久化
- RDB
- AOF
同步策略(刷盘策略)
浙公网安备 33010602011771号