Redis核心数据结构以及应用场景

Redis 常用8 种数据结构:String、List、Hash、Set、ZSet、Geo、Bitmap、HyperLogLog,附带底层、用法、典型场景。

一、1. String(字符串)

底层

简单动态字符串 SDS,最大 512MB。

常用命令

set / get / mset / mget / incr / decr / setnx / expire

应用场景

  1. 缓存:用户信息、商品数据、接口结果(最常用)

  2. 计数器:文章阅读量、点赞数、访问次数

  3. 分布式锁:setnx + expire 实现简单锁

  4. 限流:IP 限流、接口防刷

  5. 全局唯一 ID:incr 自增生成 ID

  6. 会话存储:登录 token、session

    二、2. List(列表)

底层

双向链表,头尾操作极快,中间访问慢。

常用命令

lpush / rpush / lpop / rpop / lrange / brpop(阻塞弹出)

应用场景

  1. 消息队列 / 简易队列:lpush + rpop

  2. 阻塞队列:brpop 实现简单延时/消费队列

  3. 时间线、信息流:朋友圈、动态列表、评论列表

  4. 栈:lpush + lpop

    三、3. Hash(哈希)

底层

ziplist / hashtable,field-value 结构。

常用命令

hset / hget / hmset / hmget / hincrby / hdel

应用场景

  1. 存储对象:用户信息、商品信息(比 String 更省内存)

  2. 购物车:用户ID→商品ID→数量

  3. 短字段聚合数据:多个小字段统一管理

    对比:存单个对象优先 Hash,不要拆多个 String。

    四、4. Set(集合)

底层

intset / 哈希表,无序、去重。

常用命令

sadd / smembers / sismember / sinter / sunion / sdiff / spop

应用场景

  1. 去重:访客 IP 去重、点赞用户去重

  2. 交集/并集/差集:

◦ 共同好友、共同关注

◦ 好友推荐、粉丝对比

  1. 随机抽奖:spop 随机弹出中奖用户

  2. 标签系统:文章/用户标签

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

底层

ziplist / 跳表(skiplist),去重 + 按 score 排序。

常用命令

zadd / zrange / zrevrange / zrank / zrem / zscore

应用场景(高频考点)

  1. 排行榜:热度榜、积分榜、销量榜、直播间榜单

  2. 延时队列:score 存时间戳,轮询取到期任务

  3. 带权重排序:优先队列、任务权重排序

  4. 范围查询:按分数区间筛选数据

    六、6. Bitmap(位图)

本质还是 String,按位操作。

常用命令

setbit / getbit / bitcount

应用场景

  1. 签到统计:用户每日签到(1 位代表 1 天)

  2. 活跃状态:用户在线/离线标记

  3. 海量布尔值统计(极度省内存)

    七、7. HyperLogLog

基数统计,概率算法,有误差(0.81%),极小内存统计海量去重数量。

常用命令

pfadd / pfcount / pfmerge

应用场景

  1. 页面 UV 统计(独立访客数)

  2. 海量数据去重计数(不计明细,只算总数)

    特点:只存数量,不存原始数据。

    八、8. Geo(地理位置)

基于 ZSet 实现,存储经纬度。

常用命令

geoadd / geohash / geopos / geodist / georadius

应用场景

  1. 附近的人 / 附近门店

  2. 距离计算、范围查找

    二、场景选型速查表(面试直接背)

• 单纯缓存、计数器、分布式锁、限流 → String

• 对象、购物车、多字段实体 → Hash

• 队列、栈、信息流、消息队列 → List

• 去重、交集并集、好友、标签、抽奖 → Set

• 排行榜、延时队列、有序任务 → ZSet

• 签到、布尔状态、海量标记 → Bitmap

• 大数据量 UV、独立访客计数(允许误差)→ HyperLogLog

• 经纬度、附近位置 → Geo

三、高频面试补充

  1. List 为什么适合做队列?

    双向链表,头尾 O(1),阻塞命令 brpop 可实现简单消息队列。

  2. ZSet 底层为什么用跳表不用红黑树?

    跳表范围查询、排序、区间遍历更优,实现简单,内存友好。

  3. Hash 与 String 存对象区别?

    Hash 可单独更新某个字段,省内存;String 需要整存整取。

  4. HyperLogLog 误差?

    标准误差 0.81%,适合统计量,不要求绝对精确。

相关推荐
就叫_这个吧42 分钟前
Redis从基础命令到核心机制简单介绍
数据库·redis·缓存
麻瓜生活睁不开眼1 小时前
Android16修改全局桌面视图边框四直角显示为弧边圆角
android·java·深度学习
dear_bi_MyOnly1 小时前
【MyBatis 操作数据库】
java·数据库·学习·mybatis·学习方法
liang_jy1 小时前
文件管理(八)—— 虚拟文件系统
面试·操作系统
2601_953720822 小时前
【计算机毕业设计】基于Spring Boot的心理健康咨询与评测系统的设计与实现
java·spring boot·后端
liang_jy2 小时前
文件管理(七)—— 文件系统的层次结构和布局
面试·操作系统
丈剑走天涯3 小时前
JDK 17 正式特性
java·开发语言
东方小月3 小时前
从零开发一个 Coding Agent(四):使用状态机校验大模型事件流
前端·人工智能·后端
圣光SG3 小时前
Java操作题练习(七)
java·开发语言·算法
都叫我大帅哥3 小时前
“让AI修就行”?我劝你收回这句话——来自一位Java博主的硬核反常识
后端