文章

面试题学习笔记 | Redis 基础

Redis 中常见的数据结构

Redis 提供了 5 种基本数据结构:string(字符串)、list(列表)、hash(哈希)、set(集合)和 zset(有序集合,sorted set)

1. string(字符串)

string 是 Redis 中最基本的数据类型,可以存储文本、数字和二进制数据,最大长度为 512MB。底层使用 SDS(Simple Dynamic String,简单动态字符串) 实现,与 C 语言的字符串相比具有以下优势:

  • O(1) 复杂度获取长度:SDS 额外存储字符串长度,无需遍历

  • 支持二进制安全:不会因 \0 误判字符串结束

  • 自动扩展/缩减内存:避免手动管理内存,提高效率

使用场景:

  • 缓存:存储临时数据,如用户会话信息

  • 计数器:用于统计访问量、点赞数等,可通过原子操作增加或减少

2. hash(哈希)

hash 是一个 键值对集合,适合存储对象的属性。底层由哈希表实现,能高效存取关联数据

特点:

  • 支持高效 CRUD 操作,适合存储小规模数据

  • 键值对方式存储,便于组织和管理数据

使用场景:

  • 存储对象信息:如商品详情,快速检索

3. list(列表)

list有序字符串集合,底层由 双向链表 实现,支持 两端操作

使用场景:

  • 消息队列:利用 LPUSHRPOP 实现生产者-消费者模式

  • 历史记录:存储用户操作历史,便于访问

4. set(集合)

set无序且唯一 的字符串集合,底层使用 哈希表 实现,支持 快速查找去重

使用场景:

  • 标签系统:存储用户兴趣标签,避免重复

  • 唯一用户集合:记录访问过某页面的用户,方便去重分析

5. sorted set(有序集合)

sorted setset 的基础上,每个元素都有一个分数(score),可按分数排序。底层使用 跳表 + 哈希表 结合实现

跳表特点:

  • 多层链表结构,从上到下逐层递进,优化查询性能

  • 支持范围查询,适用于排名等场景

使用场景:

  • 排行榜:存储用户分数,支持实时排名

  • 任务调度:按优先级排序任务,便于执行

Redis 高级数据类型

除了基础数据结构,Redis 还提供了 4 种 高级数据类型

1. bitmap(位图)

  • 以位为单位存储数据,适用于 布尔值存储

  • 节省空间,适合大规模数据统计

  • 使用场景:签到统计、布隆过滤器

2. hyperloglog(去重计数)

  • 概率性数据结构,用于 快速估算 去重后的元素数量

  • 内存占用固定(仅 12 KB 即可存储 2^64 个不同元素)

  • 使用场景:估算独立访问用户(UV)

3. geo(地理位置存储)

  • 存储地理位置信息(经纬度),支持 空间查询

  • 使用场景:地图应用、附近搜索

4. stream(消息队列)

  • 支持持久化的消息流,适用于 时间序列数据

  • 提供高效的生产/消费模型

  • 使用场景:日志存储、消息流处理

Redis 为什么这么快?

Redis 的高性能主要源于以下三点:

1. 存储方式优化

  • 基于内存存储,相比磁盘数据库,读写速度极快

  • 减少磁盘 I/O,大部分操作无需访问磁盘

2. 高效的线程模型

  • 单线程事件驱动 + I/O 多路复用,避免多线程上下文切换

  • 减少锁竞争,提升并发效率

3. 采用高效数据结构

  • 优化数据结构(如 SDS、跳表、哈希表),提高查询和存储效率

Redis 为什么是单线程?6.0 版本为什么引入多线程?

单线程设计原因

  • Redis 主要是内存操作,瓶颈不在 CPU

  • 单线程避免多线程上下文切换的性能开销

  • 利用 I/O 多路复用,充分利用 CPU 资源

6.0 版本引入多线程的原因

  • 网络 I/O 成为瓶颈,多线程优化网络请求处理速度

  • 数据读写仍保持单线程,确保操作的原子性和一致性

License:  CC BY 4.0