当前位置: 首页 > article >正文

LSM树 (Log-Structured Merge Tree)、Cuckoo Hashing详细解读

一、LSM 树 (Log-Structured Merge Tree)

LSM 树(Log-Structured Merge Tree) 是一种专为 高效写入和批量更新 设计的数据结构,特别适合于 高写入密度 的应用场景,如数据库和文件系统。它广泛用于 NoSQL 数据库(如 Cassandra、LevelDB、RocksDB)等系统中,支持高效的顺序写入和延迟写入的合并操作。

1. 基本原理

LSM 树通过将数据分为多个 分层存储(通常称为 Level),并且将数据按 批次写入 来减少随机写操作,以提升写入性能。其核心思想是将 写入操作转化为顺序写入,从而提高磁盘 I/O 性能。

  • MemTable(内存表)

    • 写入首先进入内存中的 MemTable(通常是一个平衡树,如 AVL 树或 SkipList)。
    • 当 MemTable 达到一定大小时,会被写入磁盘,形成 SSTable(Sorted String Table) 文件。
  • SSTable(有序字符串表)

    • SSTable 是 只读的有序文件,通常是不可变的(Immutable)。
    • 数据写入磁盘后,MemTable 会被清空以接受新的写入。
  • 合并(Merge)与压缩(Compaction)

    • 随着 SSTable 文件的增多,系统会定期执行 合并和压缩操作
    • 合并操作将多个较小的 SSTable 文件合并为一个较大的文件,以减少磁盘空间的浪费,并提升查询效率。
2. 操作流程
  • 插入(Insert)

    1. 新数据首先写入 MemTable。
    2. MemTable 写满后,将其刷入磁盘生成新的 SSTable 文件。
    3. 后台合并线程定期将多个 SSTable 文件合并为一个较大的 SSTable 文件。
  • 查询(Search)

    1. 查询操作首先在 MemTable 中查找。
    2. 如果 MemTable 中未命中,则查找缓存的 Bloom Filter,以决定是否查询 SSTable。
    3. 若 Bloom Filter 判断 SSTable 可能存在查询数据,则顺序读取 SSTable 文件。
  • 删除(Delete)

    • 删除操作通过写入 删除标记(Tombstone) 来实现,实际数据不会立即删除,而是等待压缩时清理。
3. 优缺点
优点缺点
支持高效的批量写入和顺序写入查询效率受限于 SSTable 的合并与压缩策略
适合写密集型工作负载删除和更新操作依赖后台合并
支持快速恢复(数据持久化在磁盘上)高并发查询时,可能导致多次磁盘 I/O
4. 应用场景
  • NoSQL 数据库:如 Cassandra、LevelDB、RocksDB。
  • 日志管理系统:存储和检索大规模的日志数据。
  • 缓存系统:高效存储和更新缓存数据。
  • 分布式存储系统:用于提高数据写入效率和持久化性能。

二、Cuckoo Hashing

Cuckoo Hashing(布谷鸟哈希) 是一种解决哈希表 冲突问题 的高效算法。它通过使用 两个或多个哈希函数重新安置(Kick-Out)策略,在保证 O(1) 时间复杂度的同时,极大地减少了哈希冲突的概率。该算法得名于布谷鸟在其他鸟巢中安放自己的蛋的行为,正如在哈希表中安放键值对时,如果冲突发生,则将现有的键“挤出”并重新安放。

1. 基本原理
  • 多哈希函数:使用两个(或更多)不同的哈希函数 h1(x)h2(x)
  • 双表结构:使用两个独立的哈希表,或将其合并为一个逻辑上的双槽位表。
  • 挤出策略:当插入一个键时,如果目标槽位已被占用,则将占用的键“挤出”,并重新插入到其另一个哈希位置。
2. 操作流程
  • 插入(Insert)

    1. 计算键的两个哈希值 h1(key)h2(key)
    2. 尝试将键插入 h1(key) 所在的槽位。
    3. 如果槽位已占用,则将原有的键“踢出”(Kick-Out),并尝试将被踢出的键插入其另一哈希位置 h2(key)
    4. 这个过程可能会递归进行,如果达到最大次数(通常是表的大小的常数倍),则触发 重新哈希(Rehashing)
  • 查询(Search)

    1. 查询键时,计算其两个哈希值。
    2. 检查 h1(key)h2(key) 两个位置是否存在目标键。
  • 删除(Delete)

    • 删除时只需检查并清除 h1(key)h2(key) 两个位置的键值。
3. 时间复杂度
操作平均情况复杂度最坏情况复杂度
插入 (Insert)O(1)O(1)(可摊销)
查询 (Search)O(1)O(1)
删除 (Delete)O(1)O(1
重新哈希 (Rehash)O(n)O(n)
4. 优缺点
优点缺点
保证 O(1) 的查询和插入性能需要额外空间来存储多个哈希表
哈希表装载因子可接近 1,空间利用率高插入时可能需要多次挤出操作
可有效避免链式哈希的链表冲突和线性探测当表接近满载时,重新哈希代价较高
5. 应用场景
  • 缓存系统:适用于需要高性能键值存储的场景,如高速缓存 (Cache)。
  • 网络路由:用于存储和查找路由表,提高路由查找效率。
  • 数据库系统:索引结构和快速查找数据块。
  • 分布式系统:负载均衡、哈希分片等。

三、LSM 树 vs Cuckoo Hashing 对比

特性LSM 树 (Log-Structured Merge Tree)Cuckoo Hashing
核心特点高效的批量写入、顺序写入优化使用多个哈希函数与重新安置策略
适用数据类型适合有序数据的持久化存储适合高效的键值对存储
写入性能批量写入性能优越,适合写密集型场景保证 O(1) 写入性能
查询性能查询性能较高,但依赖于合并和压缩操作查询性能为 O(1),但需要额外空间
应用场景数据库、日志管理系统、缓存缓存系统、网络路由、快速查找
存储结构MemTable + SSTable + 压缩机制双哈希表 + 挤出策略

总结

  • LSM 树 适合 高写入密度 的应用场景,特别是对数据持久化有要求的系统,如 NoSQL 数据库日志系统
  • Cuckoo Hashing 更适合需要 快速插入和查询 的场景,特别是在 内存受限 的环境下,如 高速缓存网络路由表

http://www.kler.cn/a/387088.html

相关文章:

  • 比ChatGPT更酷的AI工具
  • SHELL脚本(Linux)
  • 豆瓣均分9:不容错过的9本大模型入门宝藏书籍,非常详细收藏我这一篇就够了
  • 实现 MVC 模式
  • GIS空间分析案例---城市公共设施配置与服务评价
  • mac终端使用pytest执行iOS UI自动化测试方法
  • ubuntu 22.04 server 安装 和 初始化 LTS
  • 基于Springboot+Vue的心理咨询系统 (含源码数据库)
  • Qt的C++中实现一个文本转语音(TTS)系统
  • XXL-TOOL v1.3.1 发布 | Java工具类库(Excel、Pipeline、Fiber…)
  • Kafka中如何做到数据唯一,即数据去重?
  • 新手用docker真**难受
  • react 18 react-router-dom V6 路由传参的几种方式
  • 前端实现json动画(附带示例)
  • unplugin-vue-components 库作用
  • MyBatis 返回 Map 或 List<Map>时,时间类型数据,默认为LocalDateTime,响应给前端默认含有‘T‘字符
  • 【STM32F1】——舵机角度控制与TIM定时器
  • MySQL性能测试方案设计
  • 网站架构知识之Ansible(day020)
  • MySQL重难点(一)索引
  • 高并发分布式是什么,包含哪些核心技术
  • 45-best-time-to-buy-and-sell-stock-with-cooldown 力扣 714. 买卖股票的最佳时机包含手续费
  • JavaSE:初识Java(学习笔记)
  • 标定之---EPSON机械手与第三方相机的校准功能设计By python
  • Qt 使用QTreeView显示并动态的增删改查JSON文件数据
  • MySQL_第13章_视图