《解读NoSQL》——2.4 使用一致性散列算法维护当前的缓存

简介: 在评估NoSQL系统如何工作时,一致性散列算法是一种有效的通用流程。一致性散列算法能很快判断出一个新的查询或者文档是否和缓存中的某一个对象是相同的。了解这些将有助于减少不必要的磁盘访问并且使数据库保持高速运行的状态

本节书摘来自异步社区出版社《解读NoSQL》一书中的第2章,第2.4节,作者: 【美】Dan McCreary(丹•麦克雷) , Ann Kelly(安•凯利),更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.4 使用一致性散列算法维护当前的缓存

我们已经知道了将经常使用的数据保存在RAM缓存中的重要性,以及如何通过减少非必要的磁盘访问来提升数据库性能。NoSQL系统将基于这个概念进行深入探讨,并采用了一致性散列(consistent hashing)的算法使访问最频繁的数据保存在缓存中。

在评估NoSQL系统如何工作时,一致性散列算法是一种有效的通用流程。一致性散列算法能很快判断出一个新的查询或者文档是否和缓存中的某一个对象是相同的。了解这些将有助于减少不必要的磁盘访问并且使数据库保持高速运行的状态。

生成散列字符串(也称作校验和或者散列),是通过检查文档中的每一个字节并计算出一个字母序列的过程。散列字符串对于每个文档来说都是独一无二的标识,可以用来判断当前的文档和已有的文档是否一致。如果两个文档存在差异(即使是一个字节),那么散列的结果也会不同。从20世纪90年代开始,散列字符串就可以通过一些标准化的算法生成,如MD5、SHA-1、SHA-256和RIPEMD-160。图2-6展示了一个典型的散列处理过程。
image

图2-6 散列过程示例。一个文档(如商业发票)被作为一个散列函数的输入。散列函数处理的结果是一个字符串,这个字符串对原始的文档来说是独一无二的,哪怕是一个字节的改动都会导致散列函数处理的结果不同。散列可以被用来检测文件是否被修改或者对象是否已经存储在RAM缓存中

简单的查询或者是复杂的JSON和XML文档都可以生成散列值。一旦拥有了散列值,就可以用它来确保每次发送给其他人的信息是一致的。一致性散列使得网络中运行在不同节点上的两个不同的进程对于同一个对象能够生成同样的散列值。一致性散列确认了文档中信息没有被改动并且可以用于决定某个对象是否应该留在缓存或消息存储中,通过只在必要时才重新运行进程来节省宝贵的资源。

一致性散列也是同步分布式数据库的关键。例如,Git、Subversion之类的修改控制系统不仅对目录中的单个文档求散列值,还会对目录中的所有文件进行散列校验。通过持续地对所有文件进行校验,可以发现本地目录与远程的目录是否同步,如果不同步,可以只对那些改变的项目执行更新操作。

一致性散列是维护当前缓存和系统高速运行的重要工具,即使缓存被分散到许多分布式系统中,一致性散列也可以对其进行维护。一致性散列也被用来将文档分派到分布式系统的数据库节点,并在需要同步时能快速地比较远程数据库。分布式的NoSQL系统依靠散列显著地提升了数据库的读能力,并且没有妨碍到写事务。

散列冲突

两个不同的文档仍然存在极小的机会可能生成同样的散列值,这将会导致散列冲突(hash collision)。发生冲突的可能性取决于散列值的长度和需要存储的文档数。散列值越长,发生冲突的可能性就越低。如果增加文档数,发生冲突的可能性会增大。许多系统采用MD5散列算法生成128位的散列字符串。一个128位的散列可以生成大约1038种可能的输出。那就意味着,如果想将冲突的可能性保持在一个比较低的水平,如1018分之一以下,那么需要将维护的文档数降低到1013以下,或者限制在105亿文档左右。

对于大多数使用散列的应用,偶然的散列冲突并不是我们关注的焦点。但有些需要避免散列冲突的情况是我们关注的重点。那些使用散列作为安全验证的系统,如政府或者高度安全系统,需要超过128位的散列值。在这些情况中,更倾向于使用一些能生成超过128位散列值的算法,如SHA-1、SHA-256、SHA-384或者SHA-512。

相关文章
|
消息中间件 存储 缓存
zk基础—1.一致性原理和算法
本文详细介绍了分布式系统的特点、理论及一致性算法。首先分析了分布式系统的五大特点:分布性、对等性、并发性、缺乏全局时钟和故障随时发生。接着探讨了分布式系统理论,包括CAP理论(一致性、可用性、分区容错性)和BASE理论(基本可用、软状态、最终一致性)。文中还深入讲解了两阶段提交(2PC)与三阶段提交(3PC)协议,以及Paxos算法的推导过程和核心思想,强调了其在ZooKeeper中的应用。最后简述了ZAB算法,指出其通过改编的两阶段提交协议确保节点间数据一致性,并在Leader故障时快速恢复服务。这些内容为理解分布式系统的设计与实现提供了全面的基础。
|
11月前
|
机器学习/深度学习 传感器 算法
基于不变扩展卡尔曼滤波器RI-EKF的同时定位与地图构建SLAM算法的收敛性和一致性特性研究(Matlab代码实现)
基于不变扩展卡尔曼滤波器RI-EKF的同时定位与地图构建SLAM算法的收敛性和一致性特性研究(Matlab代码实现)
228 2
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
702 1
|
消息中间件 缓存 NoSQL
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
|
消息中间件 缓存 监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
springboot的热部署、配置的宽松绑定和校验、任务、邮件、监控、springboot整合JdbcTemplate,h2等sql技术、整合redis,mongodb,es等nosql技术、整合redis,Memcached,jetcache,j2cache等缓存技术、整合ActiveMQ,RabbitMQ,RocketMQ,Kafka等消息的中间件的入门、整合缓存/任务/邮件/监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
|
缓存 NoSQL 关系型数据库
mysql和缓存一致性问题
本文介绍了五种常见的MySQL与Redis数据同步方法:1. 双写一致性,2. 延迟双删策略,3. 订阅发布模式(使用消息队列),4. 基于事件的缓存更新,5. 缓存预热。每种方法的实现步骤、优缺点均有详细说明。
627 3
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
缓存 监控 算法
小米面试题:多级缓存一致性问题怎么解决
【10月更文挑战第23天】在现代分布式系统中,多级缓存架构因其能够显著提高系统性能和响应速度而被广泛应用。
1127 3
|
消息中间件 缓存 中间件
缓存一致性问题,这么回答肯定没毛病!
缓存一致性问题,这么回答肯定没毛病!
504 3

热门文章

最新文章