IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:键值存储

共 7 篇相关文章

IT 累计浏览 2,064

深入剖析 redis 数据结构 redisObject

这篇讲的是Redis核心数据结构redisObject的设计。它只有32位,却极其高效地管理了所有类型的数据对象。 作者从结构体定义出发,揭示了它的精巧布局:type字段明确是字符串、列表还是哈希等类型;encoding字段则决定了底层是用普通字符串、压缩列表还是跳表来存储——同一个类型的数据可以有多种编码,Redis会根据数据规模自动选择最省内存的方案。比如一个小的集合可能用整数集合,变大了就切换为哈希表。 文章还详解了lru字段如何用于内存淘汰,以及refcount引用计数如何管理对象生命周期。最后那个void *ptr指针,才是真正指向数据的地方。 作者特别指出,得益于Redis单线程模型,引用计数的操作无需考虑线程安全,这是与Memcached等多线程系统的重要区别。整个设计将数据与元数据分离,各个字段职责清晰,正是Redis高效与灵活的重要基石。

IT 累计浏览 2,507

redis 数据结构综述

这篇讲的是 Redis 存储键值对的核心底层数据结构,从源码层面剖析了其设计与巧妙的权衡。文章从全局视角出发,逐一介绍了 dict 哈希表、可变类型的 redisObject、高效插入删除的 zset(跳表+哈希表组合)、经典的 adlist 双链表,以及为优化 CPU 缓存和内存而生的压缩列表 ziplist 和整数集合 intset 等关键结构。 不止于理论,作者更将这些结构与具体的 Redis 命令联系起来,清晰地展现了不同场景下的选择逻辑。比如,SET 命令对应最简单的 sds 或数值类型;HSET 和 LPUSH 在特定条件下会使用紧凑的 ziplist 而非链表;SADD 会根据元素是否全为整数,在 intset 和 dict 之间动态切换;而 ZADD 有序集合则综合运用了 skiplist 和 dict,或采用 ziplist,具体取决于配置阈值。 这种从底层实现到命令行为的串联分析,揭示了 Redis 在性能与内存之间精妙平衡的设计哲学。作者提到这只是系列开篇,后续将逐一深挖每个结构,值得对 Redis 内部机制感兴趣的技术人持续关注。

IT 累计浏览 3,285

LevelDB 的原理和动机

这篇讲的是LevelDB作为高性能键值存储系统的设计原理和动机。作者从持久化数据到硬盘的基本需求出发,解释了如何在实际场景中平衡写入速度和读取效率。 为了快速写入,LevelDB采用追加方式顺序写入日志文件(Log文件),这避免了随机写入的开销,但导致了数据无序。接着,为了从硬盘中高效读取数据,文章指出必须基于查找算法和局部性原理,将数据排序组织到SST文件(Sorted String Tables)中。 文章进一步探讨了为什么使用多个SST文件而不是单个。为了高效插入数据,每个SST文件只保存一定范围的数据,类似于堆的结构。更深入地,LevelDB引入层次(Levels)结构,将SST文件按层次组织,层次越深文件越多但合并频率越低,从而优化了数据合并过程,减少了每次合并影响的文件个数。 面对查找不存在数据时的性能瓶颈,文章强调了结合布隆过滤器(Bloom Filter)的重要性,利用其快速判定“不存在”的特性,避免了在每一层进行无效查找。通过这些层层递进的设计,LevelDB巧妙地解决了存储系统中写入、读取和查询的关键挑战,为读者提供了关于高效数据结构设计的实用思路。

IT 累计浏览 4,456

leveldb 的实现

这篇讲的是两位谷歌传奇工程师Jeff Dean和Sanjay Ghemawat如何设计并实现了LevelDB这一高性能键值存储引擎。文章并非停留在使用层面,而是深入其内核,剖析了将一个“简单”想法变为工业级软件的关键抉择。 作者从“日志结构合并树”(LSM-Tree)这一核心架构出发,解释了LevelDB如何通过将写操作顺序追加到日志,并定期在后台将数据合并、排序到多层文件中,来实现极高的写入吞吐量。这个设计把随机写转化为了顺序写,巧妙地利用了磁盘的物理特性。 文章的精妙之处在于对诸多细节的权衡阐述。例如,它详细说明了如何通过分层压缩策略(Leveled Compaction)在读放大、写放大和空间放大之间取得平衡;为何引入布隆过滤器来优化查询路径;以及如何利用操作系统的内存映射(mmap)和校验和来保证效率与数据完整性。这些实现细节共同构成了LevelDB可靠、高效的基石。 总的来说,这不仅仅是一份代码导读,更是一次关于如何构建一个实用系统的深度思考。两位作者将复杂的工程问题拆解为清晰的层次,并展示了在性能、可靠性和可维护性之间进行的精妙平衡,为理解现代存储系统设计提供了极佳的范本。

IT 累计浏览 2,925

Membase基础教程

这篇讲的是Membase这款NoSQL数据库的入门知识。作者发现网上相关的原创内容确实不多,而且大多停留在表面介绍。于是他自己动手,深入研究并实际测试了多款NoSQL数据库,其中对Membase有了扎实的理解。 文章的核心是分享这份第一手的研究成果。它不仅解释了Membase是什么——一个结合了Memcached高性能缓存和CouchDB持久化特性的分布式键值存储系统,更关键的是,作者会把它放到更广阔的NoSQL图景中去审视。你会了解到它与其他主流方案(比如纯缓存的Memcached或文档型的MongoDB)在设计目标、数据模型和适用场景上的核心区别。比如,它特别适合需要高并发读写、同时又要保证数据可靠性的应用,像用户会话管理、实时数据分析这类场景。 作者的测试和思考,为纠结于技术选型的开发者提供了一份清晰的参考。如果你正在评估是否采用Membase,这篇文章能帮你快速抓住它的精髓和定位。

IT 累计浏览 5,627

Amazon分布式系统Dynamo

这篇讲的是作者对Amazon Dynamo这一经典分布式系统的重新审视。从2009年首次阅读论文时“眼前一亮”,到如今结合S3专利有了更深认识,其心得凝练为“纠结”二字。 作者指出,Dynamo巧妙地组合P2P技术,通过可调的NWR策略试图在CAP间取得平衡,一度让相关概念成为行业热词。其获得OSDI最佳论文奖,并应用于购物车等核心场景,看似是卓越设计。然而,随着实践深入,作者发现Dynamo的设计本身存在矛盾,适用场景比较有限,其中一些设计思路甚至可能产生误导。 文章从一位技术人长期跟进的视角出发,为我们提供了一个重新评估“教科书级”系统的样本,提醒我们关注经典方案背后的真实权衡与时代局限性。

IT 累计浏览 3,005

Redis几个认识误区

最近某次大型微博系统故障,再次引发了技术圈对互联网系统高可用设计的讨论。这篇讲的正是从一次真实故障出发,来纠正大家对Redis乃至分布式系统的一些常见误解。 文章并未止步于故障本身,而是引用了James Hamilton在《On Designing and Deploying Internet-Scale Service》中的经验,将讨论提升到了架构哲学的层面。作者指出,几乎所有互联网架构的成败,都印证了“Design for failure”这条核心原则。故障是必然的,关键在于架构从设计之初就为应对故障做好了准备。 文章更进一步点明,相关的工程理论并不深奥,各家公司也往往知晓这些“经验”。真正的分水岭在于,团队对这些原则的理解深度以及在实际工程中的执行力。这决定了你的架构是纸上谈兵,还是能抗住真实流量考验的坚实骨架。 对于技术读者而言,这不仅是关于Redis的避坑指南,更是一次关于架构思维和工程文化的提醒:在追求功能与性能之外,如何将“为失败而设计”融入每一次技术决策。