一致性hash算法在内存数据库中的应用技巧

时间:2022-06-24 19:07:19 数据库操作系统 我要投稿
  • 相关推荐

一致性hash算法在内存数据库中的应用技巧

  【提要】本篇《一致性hash算法在内存数据库中的应用》特别为需要编程学习的朋友收集整理的,仅供参考。内容如下:

  业精于勤,荒于嬉;行成于思,毁于随。学习编程的时候不仅要专心,更有用心。下面是小编整理的一致性hash算法在内存数据库中的应用,希望对大家有用,更多消息请关注。

  由于redis是单点,但是项目中不可避免的会使用多台Redis缓存服务器,那么怎么把缓存的Key均匀的映射到多台Redis服务器上,且随着缓存服务器的增加或减少时做到最小化的减少缓存Key的命中率呢?这样就需要我们自己实现分布式。

  Memcached对大家应该不陌生,通过把Key映射到Memcached Server上,实现快速读取。我们可以动态对其节点增加,并未影响之前已经映射到内存的Key与memcached Server之间的关系,这就是因为使用了一致性哈希。因为Memcached的哈希策略是在其客户端实现的,因此不同的客户端实现也有区别,以Spymemcache、Xmemcache为例,都是使用了KETAMA作为其实现。

  一致性hash算法:

  由于hash算法结果一般为unsigned int型,因此对于hash函数的结果应该均匀分布在[0,2^32-1]区间,如果我们把一个圆环用2^32 个点来进行均匀切割,首先按照hash(key)函数算出服务器(节点)的哈希值, 并将其分布到0~2^32的圆环上。

  用同样的hash(key)函数求出需要存储数据的键的哈希值,并映射到圆环上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器(节点)上。key1、key2、key3和server1、server2通过hash都能在这个圆环上找到自己的位置,并且通过顺时针的方式来将key定位到server。按上图来说,key1和key2存储到server1,而key3存储到server2。如果新增一台server,hash后在key1和key2之间,则只会影响key1(key1将会存储在新增的server上),其它不变。

  【拓展阅读】

  PHP语言最令人“抓狂”的特性

  糟糕的type安全

  这个问题简直可怕,首先举个PHP程序员们喜闻乐见的例子:

  (string)"false"

  (int)0

  请注意,这并不属于那种某些PHP支持者所争论的“函数副作用”的典型情况。毕竟t当中也包含着大量由于type转换所引发的同类情况。事实上,这一行 想表达的是:左侧为字符串,右侧为一个整数。只不过左侧与右侧内容完全相等。照这样说来,如果让PHP的设计者负责管理、世界上的每个人都能彼此和睦相处。

  选择太多,冗余太多

  PHP语言的一大特色就是可做的事太多,做事的途径同样太多。每一行命令的结尾都可以通过数字符号或者双斜线来进行注释。无论是浮点数字还是双精度数字都代表着同样的含义。简单的设计往往会被人们所忽略,因为大家在代码贡献过程中喜欢添加自己的小特性。这有点像依靠委员会体系进行设计,只不过该委员会从来没考虑到过把其中的差异性剔除掉。

  诡异的变量命名规则

  把美元符号作为前缀实在不是个好主意。也许强制性地在所有变量前添加这个符号是为了更轻松地将其插入到模板当中,但这样说来常数内容也同样需要这么个符号啊—为什么实际上却用不着呢?

  CPU资源争夺战

  对于32位计算设备来说,整数数值过大始终是个无法回避的难题。不过在另一方面,64位设备却不会受此影响,也就是说代码在不同设备上的运行状态是不同的。大家可以在自己的笔记本上测试一下,我可以保证事实绝对是如此。但一旦把运行平台转换成服务器,情况则会再度变化。这时如果大家希望重现自己台式机上的错误,结果恐怕要令各位失望。惟一的好消息是,32位设备将很可能最终消失。

  SQL注入

  将SQL注入这一安全漏洞的主要形式之一归咎于PHP确实有失公允。人们在其它语言当中同样会不慎输入奇怪的SQL字符串。之所以将其纳入文章,主要是考虑到PHP语言更容易让该漏洞攫取数据并发送至MySQL—简单是轻而易举。虽然新手在使用任何一种语言时都可能犯下同样的错误,但这类情况在PHP中出现的机率明显要高得多得多。

  不兼容式的变更太多太多

  不同版本之间存在巨大差异,兼容性问题也绝不是小事。以Java或者t为代表的编程语言在快速发展的同时也牺牲了向下兼容的特性。事实上,老代码在新设备上无法运行的问题并不少见。但这一切与PHP的情况其实不尽相同。在PHP方面,不同版本之间往往差别巨大,因此大家只能祈祷自己的服务器已经安装了正确的版本,否则只有在出现严重问题时才能意识到大事不妙。总而言之,在查看服务器上是否有项目需要升级时,请优先把目光对准PHP。更多PHP相关文章推荐:

  1.php语言基础知识

  2.phpStorm 2016特色

  3.最实用的PHP实例代码21个

  &nbsp

  ;4.php中防止SQL注入的方法

  5.PHP中的条件结构语句

  6.PHP 的错误机制总结

  7.phpmyadmin导入导出数据库文件最大限制的解决方法

  8.php安全:全面解析跨站脚本攻击

  9.PHP学习:PHP拼音类

  10.PHP中实现页面跳转