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

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.lryc.cn/news/480815.html

相关文章:

  • VMware中的重要日志文件 vobd.log 学习总结
  • MyBatis 返回 Map 或 List<Map>时,时间类型数据,默认为LocalDateTime,响应给前端默认含有‘T‘字符
  • ASR TP
  • Tomcat与Nginx之全面比较
  • 这是一个bug求助帖子--安装kali 遇坑
  • IntelliJ Idea设置自定义快捷键
  • AlohaKit:一组.NET MAUI绘制的开源控件
  • Windows 实例磁盘空间管理
  • 【动手学电机驱动】STM32-FOC(6)基于 IHM03 的无感方波控制
  • 【数据结构】汇编语言和机器语言的‘数据结构‘
  • hadoop+spark中8088,18080,19888,4040端口页面的区别
  • PDS的主要部件
  • (十三)JavaWeb后端开发——MySQL2
  • MFC图形函数学习06——画椭圆弧线函数
  • 缓存、注解、分页
  • 【数据结构与算法】第9课—数据结构之二叉树(链式结构)
  • 【CSS】居中样式
  • Vite环境下uniapp Vue 3项目添加和使用环境变量的完整指南
  • mysql-springboot netty-flink-kafka-spark(paimon)-minio
  • 讨论一个mysql事务问题
  • pytest插件精选:提升测试效率与质量
  • HTB:Sightless[WriteUP]
  • 国产化浪潮下,高科技企业如何选择合适的国产ftp软件方案?
  • 自注意力机制
  • 抽象工厂模式详解
  • 【Linux】软硬链接和动静态库
  • HarmonyOS入门 : 获取网络数据,并渲染到界面上
  • 【贪心】【哈希】个人练习-Leetcode-1296. Divide Array in Sets of K Consecutive Numbers
  • 【数据库实验一】数据库及数据库中表的建立实验
  • Web服务nginx基本实验