面试题学习笔记 | 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
是 有序字符串集合,底层由 双向链表 实现,支持 两端操作
使用场景:
消息队列:利用
LPUSH
和RPOP
实现生产者-消费者模式历史记录:存储用户操作历史,便于访问
4. set(集合)
set
是 无序且唯一 的字符串集合,底层使用 哈希表 实现,支持 快速查找 和 去重
使用场景:
标签系统:存储用户兴趣标签,避免重复
唯一用户集合:记录访问过某页面的用户,方便去重分析
5. sorted set(有序集合)
sorted set
在 set
的基础上,每个元素都有一个分数(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 成为瓶颈,多线程优化网络请求处理速度
数据读写仍保持单线程,确保操作的原子性和一致性