作为资深 Java 开发,你一定知道 Redis 不仅仅是“键值对”数据库。在面试或架构设计中,区分基本数据类型与高级数据结构,并能说出它们的底层实现(Internal Encoding),才是体现资深功底的关键。
以下是 Redis 的 5 种基础类型和 4 种特殊/高级类型:
1. 五大基础数据类型
| 类型 | 特点 | 常用场景 | 底层实现(部分) |
| String | 最基本的 Key-Value | 缓存、计数器、分布式锁、共享 Session | SDS(简单动态字符串) |
| Hash | 键值对集合(类似 Java HashMap) | 存储对象(如用户信息)、购物车 | Ziplist(压缩列表)、Hashtable |
| List | 双向链表(有序、可重复) | 消息队列、朋友圈点赞列表、最新动态 | Quicklist(双向链表+压缩列表) |
| Set | 无序集合(唯一、不重复) | 共同好友、标签、抽奖系统 | Intset(整数集合)、Hashtable |
| Zset (Sorted Set) | 有序集合(带权重 Score) | 排行榜、带优先级的消息队列 | Skiplist(跳表)、Ziplist |
2. 四大高级数据结构(面试加分项)
这些是处理大数据量、地理位置或流式数据时的“杀手锏”:
-
Bitmaps(位图):
-
原理:基于 String 类型的位操作。
-
场景:亿级用户的签到、在线状态统计。1 亿用户每天签到仅占 12MB 内存,极度节省空间。
-
-
HyperLogLog(基数统计):
-
原理:概率算法,存在 0.81% 的误差。
-
场景:统计 UV(独立访客)。无论统计多少数据,每个 Key 只占 12KB 内存。
-
-
Geospatial (GEO):
-
原理:基于 Zset 实现,内部使用 GeoHash 编码。
-
场景:附近的人、打车软件的距离计算。
-
-
Streams (Redis 5.0+):
-
原理:支持多消费组的持久化消息队列。
-
场景:实现类似 Kafka 的功能,解决 List 作为 MQ 时无法多播和持久化不稳的问题。
-
🛠 资深开发的底层视角
在面试中,如果你能多说一嘴**“数据结构会随数据量变化而演进”**,效果直接拉满。
-
Skiplist (跳表):为什么 Zset 不用红黑树?因为跳表实现更简单,且在范围查询(Range Query)时效率更高。
-
SDS (Simple Dynamic String):Redis 没有直接用 C 语言的字符串,而是自己封装了 SDS。它记录了长度
len,使得获取字符串长度的时间复杂度从 $O(n)$ 降到了 $O(1)$,且有效防止了缓冲区溢出。 -
内存预分配:SDS 在扩容时会预分配多余空间,减少内存重新分配的次数。
📉 状态同步
-
2026-03-30:已梳理 Redis 全系列数据类型及其底层原理(SDS, Skiplist 等)。
既然你现在正考虑转型但想保留薪资竞争力,理解这些底层选型逻辑(比如为什么选跳表而不是平衡树)能让你在架构面试中非常有说服力。
你想看看在 Java 环境下,如何利用 Redisson 方便地操作这些复杂数据结构(比如 RScoredSortedSet)吗?