memcache 分布式,算法实现
memcached 虽然称为 “ 分布式 ” 缓存服务器,但服务器端并没有 “ 分布式 ” 功能。每个服务器都是完全独立和隔离的服务。 memcached 的分布式,则是完全由客户端程序库实现的。 这种分布式是 memcached 的最大特点。
分布式原理
这里多次使用了 “ 分布式 ” 这个词,但并未做详细解释。 现在开始简单地介绍一下其原理,各个客户端的实现基本相同。
下面假设 memcached 服务器有 node1 ~ node3 三台, 应用程序要保存键名为“tokyo”“kanagawa”“chiba”“saitama”“gunma” 的数据。
图 1 分布式简介:准备
首先向 memcached 中添加 “tokyo” 。将 “tokyo” 传给客户端程序库后, 客户端实现的算法就会根据 “ 键 ” 来决定保存数据的 memcached 服务器。 服务器选定后,即命令它保存 “tokyo” 及其值。
图 2 分布式简介:添加时
同样, “kanagawa”“chiba”“saitama”“gunma” 都是先选择服务器再保存。
接下来获取保存的数据。获取时也要将要获取的键 “tokyo” 传递给函数库。 函数库通过与数据保存时相同的算法,根据 “ 键 ” 选择服务器。 使用的算法相同,就能选中与保存时相同的服务器,然后发送 get 命令。 只要数据没有因为某些原因被删除,就能获得保存的值。
图 3 分布式简介:获取时
这样,将不同的键保存到不同的服务器上,就实现了 memcached 的分布式。 memcached 服务器增多后,键就会分散,即使一台 memcached 服务器发生故障 无法连接,也不会影响其他的缓存,系统依然能继续运行。
分布式算法
缓存系统中应用比较多的是余数计算分散和一致性 HASH 计算分散。
余数计算分散
原理
余数计算分散法简单来说,就是 “ 根据服务器台数的余数进行分散 ” 。
1. 求得传入键的整数哈希值( int hashCode )。
2. 使用计算出的 hashCode 除以服务器台数 (N) 取余数( C=hashCode % N )
3. 在 N 台服务器中选择序号为 C 的服务器。
特点
余数计算的方法简单,数据的分散性也相当优秀,但也有其缺点。 那就是当添加或移除服务器时,缓存重组的代价相当巨大。 添加服务器后,余数就会产生巨变,这样就无法获取与保存时相同的服务器, 从而影响缓存的命中率。
Consistent Hashing
算法
一致性 HASH 算法我的理解,简单来说就是 , 在一个大的数据范围内的构建一个虚拟的环,首( 0 )尾(Integer.MAXVALUE )相接的圆环,然后通过 某种 HASH 算法 增加虚拟节点的方式( 1 个实体节点可以虚拟 N个虚拟阶段,如 160 , 200 , 1000 等)让节点更为均匀的分别在环上。 KEY 请求的时候,也通过相同的某种HASH 算法 计算出 HASH 值,然后在在到环上定位同向最接近的虚拟节点,最后通过虚拟节点与实体节点的对应关系找到服务的实体节点。
网上介绍很多,图也多,不想在截取了。那就给个连接:
http://blog.csdn.net/sparkliang/article/details/5279393
另外公司现有的项目中也使用 Consistent Hashing 用于分表定位,缓存定位等。工程项目中也有先关算法的实现。
特点
1. 算法实现比较麻烦,需要构建虚拟环。
2. 解决了余数算法增加节点命中大幅额度降低的问题,理论上,插入一个实体节点,平均会影响到:虚拟节点数/2 的节点数据的命中
memcache 分布式,算法实现的更多相关文章
- memcache分布式 [一致性hash算法] 的php实现
最近在看一些分布式方面的文章,所以就用php实现一致性hash来练练手,以前一般用的是最原始的hash取模做分布式,当生产过程中添加或删除一台memcache都会造成数据的全部失效,一致性hash就是 ...
- 记录memcache分布式策略及算法
摘要 http://wenku.baidu.com/link?url=eUmpWDGFiFguyQLxwmXwRYmbnW7Wm1Bo79dGoomSnmOPWDIA5-FFSTNRI7MBQq8QG ...
- MemCache分布式缓存的一个bug
Memcached分布式缓存策略不是由服务器端至支持的,多台服务器之间并不知道彼此的存在.分布式的实现是由客户端代码(Memcached.ClientLibrary)通过缓存key-server映射来 ...
- memcache分布式部署的原理分析
下面本文章来给各位同学介绍memcache分布式部署的原理分析,希望此文章对你理解memcache分布式部署会有所帮助哦. 今天在封装memcache操作类库过程中,意识到一直以来对memcach ...
- Memcache分布式锁 转发 https://www.cnblogs.com/li150dan/p/9529090.html
在分布式缓存的应用中,会遇到多个客户端同时争用的问题.这个时候,需要用到分布式锁,得到锁的客户端才有操作权限 下面通过一个简单例子介绍: 这里引用的是Memcached.ClientLibrary.d ...
- Memcache分布式锁
在分布式缓存的应用中,会遇到多个客户端同时争用的问题.这个时候,需要用到分布式锁,得到锁的客户端才有操作权限 下面通过一个简单例子介绍: 这里引用的是Memcached.ClientLibrary.d ...
- Memcache分布式部署方案
基础环境 其实基于PHP扩展的Memcache客户端实际上早已经实现,而且非常稳定.先解释一些名词,Memcache是danga.com的一个开源项目,可以类比于MySQL这样的服务,而PHP扩展的M ...
- memcache分布式实现、memcache分布…
Memcache的分布式介绍 memcached虽然称为"分布式"缓存服务器,但服务器端并没有"分布式"功能.服务器端仅包括内存存储功能,其实现非常简单.至于m ...
- memcache分布式小实例
<?php /** * 分布式的 memcache set 实现 */ /** * 创建缓存实现memcache 添加分布式服务器 并设置权限 */ function createCache() ...
随机推荐
- POJ 3461 Oulipo(字符串匹配,KMP算法)
题意:给出几组数据,每组有字符串W和T,问你W在T中出现几次. 思路:字符串长度很大,用KMP算法. 一开始写的是:调用KMP算法查找W在T中是否匹配,若匹配,则个数+1.则接下来T的索引移动相应的距 ...
- H5 移动Web框架集合
http://frozenui.github.io/ 一个简洁的h5前端框架 http://weui.github.io/weui/ 腾讯出的WebUI 风格是基于微信
- moto xt800 刷机到2.2.2
老机器啊,原来2.1的系统大多数软件都不能装sbf刷机包+工具+教程下载地址:http://u.115.com/file/bhdlwl2x 刷完之后如果RSD Lite显示刷机结果为失败,不要担心,手 ...
- lintcode:Valid Sudoku 判断数独是否合法
题目: 判断数独是否合法 请判定一个数独是否有效.该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 样例 下列就是一个合法数独的样例. 注意 一个合法的数独(仅部分填充)并不一定是可解的.我们 ...
- 如何删除ArcSde Service服务
1)打开“控制面板”,“服务”,找到“ArcSde Service(somename)”,这里somename就是你的ArcSde服务的真实的名字,记住这个名字(为叙述方便,以下用somename表示 ...
- Intellij IDEA新建一个EJB工程(二)
从博文:http://www.cnblogs.com/yangyquin/p/5328344.html 中可以知道如何利用Intellij IDEA建立一个EJB Module,还有新建一个测试Mod ...
- ios 使用GCD 多线程 教程
什么是GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法.该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中.GCD ...
- 基于eclipse创建android的helloworld工程
基于eclipse创建android的helloworld工程 之前用过Android studio感觉很慢,决定采用eclipse来学习Android开发.下面来看是怎么创建的. 选择File--- ...
- RegexOne
http://regexone.com/ http://regexone.com/lesson/optional_characters? http://regexone.com/lesson/capt ...
- iOS开发:Swift多线程NSThread的使用
一:创建线程,NSThread创建线程常用的三种方式: //1:手动创建启动 let thread:NSThread = NSThread(target: self, selector:"d ...