news 2026/5/30 12:24:46

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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%,适合统计量,不要求绝对精确。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 12:24:32

从Arduino UNO到RP2350:硬件迁移、代码优化与性能提升实战

1. 项目概述:为什么从UNO升级到RP2350?如果你玩过一阵子Arduino,手头肯定有那么一两块经典的UNO板子。它皮实、简单、社区资源多,是无数创客和嵌入式初学者的“启蒙老师”。但当你开始捣鼓一些稍微复杂点的项目,比如我…

作者头像 李华
网站建设 2026/5/30 12:24:24

基于SIM900与Visuino的Arduino短信发送系统:从AT指令到物联网通信实践

1. 项目概述与核心价值如果你手头有一个Arduino,并且想让它“开口说话”,不是通过蜂鸣器,而是直接给千里之外的手机发一条短信,那么这个基于SIM900 GSM模块和Visuino的项目,就是你一直在找的“敲门砖”。这不仅仅是点亮…

作者头像 李华
网站建设 2026/5/30 12:19:51

当防火墙被“打穿”,为什么物理隔离是防守方的终极底牌?

“在HW(护网)行动中,没有绝对安全的系统,只有尚未被发现的攻击路径。”每年的“护网行动”都是一场没有硝烟的战争。作为防守方(蓝队),你是否经历过这样的绝望时刻:明明部署了顶级的…

作者头像 李华
网站建设 2026/5/30 12:19:13

QMCDecode:Mac用户快速转换QQ音乐加密文件的终极解决方案

QMCDecode:Mac用户快速转换QQ音乐加密文件的终极解决方案 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默…

作者头像 李华