数据结构

Redis 的 hash 结构底层采用两种实现方式:

  • ziplist(压缩列表,6.0 后改为 listpack)
  • hashtable

实现方式的选择依据:

  1. 当同时满足以下两个条件时使用 ziplist/listpack:
    • hash 中的键值对数量 ≤ hash-max-ziplist-entries(默认 512)
    • 所有键和值的字符串长度 ≤ hash-max-ziplist-value(默认 64 字节)
  2. 其他情况使用 hashtable

性能特点:

  • ziplist/listpack

    • 优点:内存占用极低(无指针开销,内存局部性好)
    • 缺点:增删改查操作时间复杂度 O(n),效率较低(中间插入/删除影响显著)
  • hashtable

    • 优点:查找、插入、删除平均时间复杂度 O(1),适合大数据量
    • 缺点:内存开销较大(需要存储额外指针)

Java 的 HashMap 采用数组 + 链表 + 红黑树的存储结构。

并发安全

  • Redis Hash

    • 单线程执行命令机制保证所有操作天然线程安全
  • Java HashMap

    • 非线程安全
    • 线程安全方案:
      • 使用 ConcurrentHashMap
      • 使用 Collections.synchronizedMap(new HashMap<>())

扩容机制

  • Redis Hash

    • 采用渐进式 rehash 方案
    • 优点:平滑扩容,避免一次性迁移导致的请求延迟
    • 缺点:迁移期间内存占用翻倍
  • Java HashMap

    • 一次性完成全部元素迁移
    • 优点:不占用额外空间
    • 缺点:迁移过程会阻塞
    • 适用场景:通常存储数据量较小,无需渐进式迁移
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐