Redis Hash 与 Java HashMap 对比
·
数据结构
Redis 的 hash 结构底层采用两种实现方式:
- ziplist(压缩列表,6.0 后改为 listpack)
- hashtable
实现方式的选择依据:
- 当同时满足以下两个条件时使用 ziplist/listpack:
- hash 中的键值对数量 ≤
hash-max-ziplist-entries(默认 512) - 所有键和值的字符串长度 ≤
hash-max-ziplist-value(默认 64 字节)
- hash 中的键值对数量 ≤
- 其他情况使用 hashtable
性能特点:
-
ziplist/listpack:
- 优点:内存占用极低(无指针开销,内存局部性好)
- 缺点:增删改查操作时间复杂度 O(n),效率较低(中间插入/删除影响显著)
-
hashtable:
- 优点:查找、插入、删除平均时间复杂度 O(1),适合大数据量
- 缺点:内存开销较大(需要存储额外指针)
Java 的 HashMap 采用数组 + 链表 + 红黑树的存储结构。
并发安全
-
Redis Hash:
- 单线程执行命令机制保证所有操作天然线程安全
-
Java HashMap:
- 非线程安全
- 线程安全方案:
- 使用 ConcurrentHashMap
- 使用
Collections.synchronizedMap(new HashMap<>())
扩容机制
-
Redis Hash:
- 采用渐进式 rehash 方案
- 优点:平滑扩容,避免一次性迁移导致的请求延迟
- 缺点:迁移期间内存占用翻倍
-
Java HashMap:
- 一次性完成全部元素迁移
- 优点:不占用额外空间
- 缺点:迁移过程会阻塞
- 适用场景:通常存储数据量较小,无需渐进式迁移
更多推荐


所有评论(0)