`

memcached分布测试报告(一致性哈希情况下的散列函数选择)

    博客分类:
  • java
阅读更多

一、背景资料

    memcached本身是集中式的缓存系统,要搞多节点分布,只能通过客户端实现。memcached的分布算法一般有两种选择:
1、根 据hash(key)的结果,模连接数的余数决定存储到哪个节点,也就是hash(key)% sessions.size(),这个算法简单快速,表现良好。然而这个算法有个缺点,就是在memcached节点增加或者删除的时候,原有的缓存数据 将大规模失效,命中率大受影响,如果节点数多,缓存数据多,重建缓存的代价太高,因此有了第二个算法。
2、Consistent Hashing,一致性哈希算法,他的查找节点过程如下:
    首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。



    一致性哈希算法来源于P2P网络的路由算法,更多的信息可以读这里

 二、测试报告

   spymemcached和xmemcached都实现了一致性哈希算法(其实我是照抄的),这里要测试下在使用一致性哈希的情况下,增加节点,看不同散列函数下命中率和数据分布的变化情况,这个测试结果对于spymemcached和xmemcached是一样的,测试场景:
    从一篇英文小说(《黄金罗盘》前三章)进行单词统计,并将最后的统计结果存储到memcached,以单词为key,以次数为value。单词个数为 3061,memcached原来节点数为10,运行在局域网内同一台服务器上的不同端口,在存储统计结果后,增加两个memcached节点(也就是从10个节点增加到12个节点),统计此时的缓存命中率并查看数据的分布情况
    结果如下表格,命中率一行表示增加节点后的命中率情况(增加前为100%),后续的行表示各个节点存储的单词数,CRC32_HASH表示采用CRC32 散列函数,KETAMA_HASH是基于md5的散列函数也是默认情况下一致性哈希的推荐算法,FNV1_32_HASH就是FNV 32位散列函数,NATIVE_HASH就是java.lang.String.hashCode()方法返回的long取32位的结 果,MYSQL_HASH是xmemcached添加的传说来自于mysql源码中的哈希函数。

 CRC32_HASH  KETAMA_HASH  FNV1_32_HASH  NATIVE_HASH  MYSQL_HASH
命中率
 78.5%  83.3%  78.2%  99.89%  86.9%
 节点1  319  366  546  3596  271
 节点2  399  350  191  1  233
 节点3  413  362  491  0  665
 节点4  393  364  214  1  42
 节点5  464  403  427  1  421
 节点6  472  306  299  0  285
 节点7  283  347  123  0  635
 节点8  382  387  257  2  408
 节点9  238  341  297  0  55
 节点10  239  375  756  0  586
 范围  200~500   300~400
 150~750  0~3600  50~650



结果分析:

1、命中率最高看起来是NATIVE_HASH,然而NATIVE_HASH情况下数据集中存储在第一个节点,显然没有实际使用价值。为什么会集中存储在 第一个节点呢?这是由于在查找存储的节点的过程中,会比较hash(key)和hash(节点IP地址),而在采用了NATIVE_HASH的情况下,所 有连接的hash值会呈现一个递增状况(因为String.hashCode是乘法散列函数),如:
192.168.0.100:12000 736402923
192.168.0.100:12001 736402924
192.168.0.100:12002 736402925
192.168.0.100:12003 736402926
如果这些值很大的会,那么单词的hashCode()会通常小于这些值的第一个,那么查找就经常只找到第一个节点并存储数据,当然,这里有测试的局限性, 因为memcached都跑在一个台机器上只是端口不同造成了hash(节点IP地址)的连续递增,将分布不均匀的问题放大了。

2、从结果上看,KETAMA_HASH维持了一个最佳平衡,在增加两个节点后还能访问到83.3%的单词,并且数据分布在各个节点上的数目也相对平均,难怪作为默认散列算法。

3、最后,单纯比较下散列函数的计算效率:

CRC32_HASH:3266
KETAMA_HASH:7500
FNV1_32_HASH:375
NATIVE_HASH:187
MYSQL_HASH:500

   NATIVE_HASH > FNV1_32_HASH > MYSQL_HASH > CRC32_HASH > KETAMA_HASH

 

   测试所用文件见附件

分享到:
评论
4 楼 Stero 2010-01-20  
badqiu 写道
String.hashCode()在应用一致性hash时还有分布不均匀的问题,所以是使用FNV1是比较好的选择
而计算MD5再hash则效率太低!


Memcached的客户端一般运行在前端服务器上,例如Web服务器,一般不存储状态数据,因此可以简单通过简单的负载均衡线性的增加计算能力。而服务器端数据量扩大时,在资源占用和计算效率上都会受影响。因此我认为应在调用者采取尽可能好的算法来提高服务器端的利用率。
3 楼 badqiu 2009-11-10  
String.hashCode()在应用一致性hash时还有分布不均匀的问题,所以是使用FNV1是比较好的选择
而计算MD5再hash则效率太低!
2 楼 ideafrog 2009-04-24  
我只对文中的图比较感兴趣。是用什么画的?主要是那个渐变色的处理
1 楼 hqman 2009-04-24  
最近我也在学 tokyo系列产品,也碰到java 客户端的问题

相关推荐

    对旋轴流风机毕业设计说明书.doc

    对旋轴流风机毕业设计说明书.doc

    【人工智能导论】支持向量机算法分析预习报告:深入理解SVM原理与鸢尾花数据集分类实验设计

    内容概要:本文档为2024~2025学年第二学期的人工智能导论课程中的支持向量机(SVM)算法分析实验预习报告。报告的主要目的是深入理解SVM的基本原理、核函数的作用以及参数调节对模型的影响,同时掌握特征选取的方法和重要性,为后续处理更复杂的数据集积累经验。实验任务包括对鸢尾花数据集进行特征探索,通过绘制相关性矩阵、径向可视化或各特征之间的关系矩阵图,深入了解数据集特征,并利用SVM算法实现对该数据集的准确分类。实验设备和环境要求操作系统为Windows、Linux或macOS均可,编程语言为Python,并搭配NumPy、Pandas、Scikit-learn和Matplotlib等科学计算和数据处理库。; 适合人群:具有一定的数学基础和编程经验,正在学习或从事机器学习和数据挖掘领域工作的学生或研究人员。; 使用场景及目标:①适用于需要理解SVM算法原理及其应用的学习者;②帮助研究者掌握如何使用SVM进行分类任务,特别是针对线性不可分的数据集;③为后续更复杂的机器学习项目提供理论和技术支持。; 其他说明:实验将在图书馆附楼计算中心进行,时间为2025年4月15日,由教师王艳指导并批阅。实验预习过程应详细记录设计思想、设计步骤等初步方案,可以通过程序流程图、伪代码、预定相关测试数据和预期结果等方式来表示。

    步进式推刚机设计说明书.doc

    步进式推刚机设计说明书.doc

    遗传算法优化BP神经网络提升交通流量预测精度的技术实现与应用

    内容概要:本文详细介绍了如何使用遗传算法优化BP神经网络,以提高交通流量预测的准确性。文中首先解释了BP神经网络的基本结构及其局限性,即容易陷入局部最优解的问题。随后,作者展示了遗传算法的工作原理,并将其应用于优化BP神经网络的权重和偏置。通过定义适应度函数、选择、交叉和变异等步骤,实现了对BP神经网络的有效改进。实验结果显示,优化后的BP神经网络在交通流量预测中的精度显著高于传统的BP神经网络,特别是在处理复杂的非线性问题时表现出色。 适用人群:对机器学习、深度学习以及交通流量预测感兴趣的科研人员和技术开发者。 使用场景及目标:适用于需要进行精确交通流量预测的应用场景,如智能交通系统、城市规划等领域。主要目标是通过遗传算法优化BP神经网络,解决其易陷入局部最优的问题,从而提高预测精度和稳定性。 其他说明:文中提供了详细的Python代码实现,帮助读者更好地理解和实践这一优化方法。同时,强调了遗传算法在全局搜索方面的优势,以及其与BP神经网络结合所带来的性能提升。此外,还讨论了一些具体的实施技巧,如适应度函数的设计、交叉和变异操作的选择等。 标签1,标签2,标签3,标签4,标签5

    电镀生产线自动化:基于组态王6.53与S7-200PLC的仿真系统设计与实现

    内容概要:本文详细介绍了基于组态王6.53和西门子S7-200PLC构建的电镀生产线仿真系统的开发过程。主要内容涵盖IO配置表、PLC梯形图编程、组态王动画脚本编写以及故障模拟等功能。文中展示了如何通过PLC控制行车移动、槽位状态监测、溶液参数调节等关键操作,并通过定时器、互锁机制、PID调节等技术手段实现精确控制。此外,还提供了详细的调试经验和优化方法,如调整定时器参数、优化动画效果等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和组态软件使用的专业人士。 使用场景及目标:适用于需要进行电镀生产线自动化调试和仿真的场合。主要目标是帮助工程师理解和掌握电镀生产线的自动化控制逻辑,提高调试效率,减少实际生产中的错误。 其他说明:文章不仅提供了理论知识,还包括大量实际操作经验和调试技巧,有助于读者更好地应用于实际工作中。附带的运行效果视频进一步增强了理解和应用效果。

    基于模糊神经网络的风光互补系统负荷功率智能分配与Simulink/Matlab仿真

    内容概要:本文详细介绍了利用模糊神经网络在风光互补发电系统中进行负荷功率智能分配的方法及其在Simulink/Matlab环境下的仿真实现。文中首先阐述了光伏和风机的MPPT算法,分别采用了扰动观察法和叶尖速比控制来优化能量捕获。接着重点讨论了模糊控制器的设计,通过定义输入变量(电网频率偏差、直流母线电压、SOC储能状态)和输出变量(各级负荷的功率分配系数),以及隶属度函数和规则库的构建,实现了对不同等级负荷的智能分配。此外,文章还探讨了VSC逆变器的控制策略,特别是在锁相环参数设置和LC滤波器方面的优化措施。最后,通过一系列仿真实验验证了系统的有效性和稳定性。 适合人群:从事电力电子、智能控制系统研究的技术人员,尤其是对风光互补发电系统感兴趣的科研工作者和工程技术人员。 使用场景及目标:适用于希望深入了解风光互补发电系统中负荷功率分配策略的研究人员和技术人员。目标是掌握模糊神经网络在电力系统中的应用,提高风光互补发电系统的可靠性和效率。 其他说明:文章提供了详细的代码片段和仿真技巧,帮助读者更好地理解和复现实验结果。同时,强调了调参过程中的一些常见问题和解决方案,有助于减少实际项目中的调试时间和成本。

    人工智能原理及应用 王万森 课后习题答案解析

    人工智能原理及应用 王万森 课后习题答案解析

    毕业设计(论文) 直动式液压往复泵设计说明书.doc.doc

    毕业设计(论文) 直动式液压往复泵设计说明书.doc.doc

    基于S7-200 PLC和MCGS的四路抢答器控制系统设计与实现

    内容概要:本文详细介绍了基于S7-200 PLC和MCGS组态软件构建的四路抢答器控制系统。首先阐述了系统的硬件架构,包括四个抢答按钮、复位按钮、指示灯和蜂鸣器的连接方式及其对应的PLC输入输出点配置。接着深入解析了梯形图程序的关键逻辑,如抢答互锁机制、时间戳判断防止多选手同时抢答以及主持人控制的抢答允许标志。此外,还探讨了MCGS组态画面的设计,包括动态效果展示、触摸屏变量绑定和抢答超时处理。最后,分享了一些调试经验和优化技巧,如反向电动势防护、接线注意事项和系统性能测试。 适用人群:对PLC编程和工控系统感兴趣的工程师和技术爱好者,尤其是有一定PLC基础的学习者。 使用场景及目标:适用于竞赛类节目或培训场所,用于搭建高效可靠的抢答系统,提升互动性和趣味性。主要目标是帮助读者掌握PLC编程技巧和MCGS组态设计方法,能够独立完成类似项目的开发。 其他说明:文中提供了详细的梯形图代码片段和接线图示例,便于读者理解和实践。同时强调了硬件防抖和软件互锁的重要性,确保系统的稳定性和可靠性。

    【Python爬虫技术】从入门到实战:核心库框架、项目案例及反爬应对策略综述

    内容概要:本文档详细介绍了Python爬虫的学习资源,涵盖基础知识、实例教程、反爬机制及应对策略、学习资源推荐和法律道德注意事项。基础知识部分讲解了核心库与框架(Requests库、BeautifulSoup、Scrapy框架)及其使用方法,数据提取技术(正则表达式、XPath、JSON处理)。实例教程按初级、中级、高级分类,包括静态网页抓取、动态内容抓取、分布式爬虫等项目。反爬机制与应对策略中列举了常见的反爬技术(User-Agent检测、IP频率限制等)及相应的解决办法(请求头伪装、IP代理池等)。最后强调了学习过程中应遵守的相关法律法规。; 适合人群:对Python爬虫技术感兴趣的初学者或有一定经验的研发人员。; 使用场景及目标:①掌握Python爬虫的基本概念和技术工具;②通过实例项目提高实际操作能力;③了解并应对反爬机制;④确保爬虫活动符合法律和道德规范。; 阅读建议:建议读者按照由浅入深的原则进行学习,在实践中不断巩固所学知识,同时注意遵守相关法律法规。

    蛋白酶的工厂设计说明书.doc

    蛋白酶的工厂设计说明书.doc

    松下FP-XH六轴伺服控制系统:多工位转盘控制程序解析及其应用

    内容概要:本文详细解析了松下FP-XH六轴伺服控制系统在汽车零部件生产线上的多工位转盘控制程序。该程序分为五个主要模块:主程序循环控制、手动模式处理、自动流程控制、报警处理模块以及输出刷新模块。每个模块的功能明确,如主程序负责调用各个子程序,报警处理模块将故障类型分颜色显示,便于快速定位问题。此外,文中介绍了点动控制中的防呆设计、绝对定位中的环形地址计算法、状态机设计用于管理六个轴的状态,以及异常处理逻辑如断电后的数据恢复机制。这些设计不仅提高了系统的稳定性和安全性,还在实际应用中表现出色,经过三年的实际运行验证。 适合人群:从事工业自动化控制领域的工程师和技术人员,尤其是对PLC编程和多轴伺服系统感兴趣的读者。 使用场景及目标:适用于需要深入了解PLC编程技巧、多轴伺服控制逻辑、异常处理机制以及提高系统稳定性的场合。目标是帮助读者掌握松下FP-XH PLC在复杂工业环境中的应用方法,提升实际项目的开发效率。 其他说明:本文不仅提供了详细的代码解析,还包括了许多实用的编程技巧和注意事项,如注释的规范书写、变量命名规则等,有助于读者更好地理解和应用这些技术。

    基于三菱PLC和组态王的煤矿通风机瓦斯浓度自动控制系统设计与实现

    内容概要:本文详细介绍了利用三菱FX3U系列PLC和组态王6.55软件实现煤矿通风机根据瓦斯浓度自动调整转速的控制系统。主要内容涵盖硬件配置、梯形图编程逻辑、组态王画面设计、调试技巧等方面。系统通过瓦斯传感器实时监测瓦斯浓度,采用双比较器进行区间判断,确保风机在不同浓度下自动调整转速,并设有多种保护机制如急停按钮、报警指示灯等。此外,还讨论了传感器零点漂移补偿、数据滤波处理、PLC与组态王通信设置等关键技术点。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和SCADA系统有一定了解的人群。 使用场景及目标:适用于煤矿井下通风系统的自动化改造,旨在提高通风效率,降低瓦斯爆炸风险,保障井下作业人员的安全。具体目标包括实现瓦斯浓度超标时快速响应、减少人工干预、提升系统稳定性。 其他说明:文中提到的实际案例表明,该系统能够显著缩短应急响应时间,减少瓦斯超限持续时间,提高生产安全性。同时提供了详细的编程技巧和调试经验,有助于读者更好地理解和应用相关技术。

    基于多目标粒子群优化(MOPSO)算法的微电网经济运行与需求侧响应

    内容概要:本文探讨了在“双碳”目标背景下,利用多目标粒子群优化(MOPSO)算法解决风光储荷微电网系统的多目标经济运行优化问题。文章详细介绍了MOPSO算法的特点及其在处理发电不确定性和负荷波动方面的优势,展示了该算法的具体实现方式,包括粒子类和仓库类的设计,以及目标函数的构建。此外,文中还讨论了通过分时电价机制引导需求侧响应的应用实例,验证了MOPSO算法的有效性,实现了光伏消纳比例提升15%,风电消纳比例提升20%,系统运行成本降低12%。 适合人群:从事电力系统优化、新能源技术研究的专业人士,尤其是关注微电网调度和多目标优化算法的研究人员。 使用场景及目标:适用于希望提高微电网经济效益和能源利用率的项目,旨在通过智能化调度减少弃风弃光现象,降低系统运行成本,增强微电网的稳定性。 其他说明:文章强调了算法的实际应用价值,并展望了未来结合深度强化学习进一步提升优化性能的可能性。

    计算机二级office2016版教材.pdf

    计算机二级office2016版教材

    5+1档轿车手动变速箱设计说明书.doc

    5+1档轿车手动变速箱设计说明书.doc

    裂缝检测数据集,支持yolo v11格式的标注,1673张原始训练集图片,正确识别率99.4%

    裂缝检测数据集,支持yolo v11格式的标注,1673张原始训练集图片,正确识别率99.4% 图片详情可查看博文:https://backend.blog.csdn.net/article/details/147232357

    数据解析速度慢?让simdjson告诉你什么是真正的飞快,每秒解析十亿字节的JSON!这个开源项目基于SIMD指令,提供了极速的JSON解析能力,让你的数据处理更加高效

    JSON在互联网上无处不在。服务器花费大量时间解析它。我们需要一种新的方法。simdjson库使用常用的SIMD指令和微并行算法来解析JSON,比RapidJSON快4倍,比JSON快25倍。 速度:比常用的生产级JSON解析器快4倍以上。 破纪录的功能:将JSON压缩到6 GB/s,验证UTF-8为13 GB/s,NDJSON为3.5 GB/s。 简单:一流、易于使用且精心记录的API。 严格:完整的JSON和UTF-8验证,无损解析。性能毫不妥协。 自动:在运行时选择CPU定制的解析器。无需配置。 可靠:从内存分配到错误处理,simdjson的设计避免了意外。 同行评审:我们的研究发表在《VLDB杂志》、《软件:实践与经验》等网站上。 这个库是Awesome Modern C++列表的一部分。

    C#工业自动化控制开发库:涵盖PLC通信、Modbus、Socket等多功能应用

    内容概要:本文介绍了一个用于工业自动化领域的C#开发库,涵盖了多种通信协议和技术,如PLC通信、Modbus、Socket、OPC UA、MQTT、WebSocket以及数据库操作等。文章详细展示了如何利用该库进行各种工业设备和系统的高效开发与集成,提供了丰富的代码示例来解释具体的应用场景和技术细节。例如,通过简单的API调用即可实现对不同品牌的PLC进行数据读写操作;使用异步方法轻松处理Modbus TCP通信;构建高性能的Socket服务器应对大量并发连接;以及通过EF6和MySQL实现高效的数据库操作等。 适合人群:从事工业自动化控制系统开发的技术人员,尤其是那些需要频繁处理不同品牌PLC、Modbus设备以及其他工业通信协议的工程师。 使用场景及目标:①快速搭建工业自动化控制系统,减少协议对接的时间成本;②提高程序稳定性,降低因网络波动带来的数据丢失风险;③优化系统性能,特别是在高并发环境下确保良好的响应速度和服务质量。 其他说明:文中提到的所有功能均已在实际项目中得到验证,能够显著提升开发效率并简化复杂系统的集成工作。此外,该库还在不断更新和完善中,增加了更多实用特性如Redis流处理等。

    基于vux+vuex+vue-resource+vue-router的微信端商城项目,涉及到的微信公众号的接入.zip

    基于vux+vuex+vue-resource+vue-router的微信端商城项目,涉及到的微信公众号的接入.zip

Global site tag (gtag.js) - Google Analytics