分析Memcached客户端如何把缓存数据分布到多个服务器上

Memcached客户端可以设多个memcached服务器,它是如何把数据分发到各个服务器上,而使各个服务器负载平衡的呢?

可以看看.net版中的客户端中的源码,就可以知道 先看代码:

获取Socket连接代码

1 /// <summary>
2         /// Returns appropriate SockIO object given
3         /// string cache key and optional hashcode.
4         ///
5         /// Trys to get SockIO from pool.  Fails over
6         /// to additional pools in event of server failure.
7         /// </summary>
8         /// <param name="key">hashcode for cache key</param>
9         /// <param name="hashCode">if not null, then the int hashcode to use</param>
10         /// <returns>SockIO obj connected to server</returns>
11         public SockIO GetSock(string key, object hashCode)
12         {
13             string hashCodeString = "<null>";
14             if(hashCode != null)
15                 hashCodeString = hashCode.ToString();
16
17             if(Log.IsDebugEnabled)
18             {
19                 Log.Debug(GetLocalizedString("cache socket pick").Replace("$$Key$$", key).Replace("$$HashCode$$", hashCodeString));
20             }
21
22             if (key == null || key.Length == 0)
23             {
24                 if(Log.IsDebugEnabled)
25                 {
26                     Log.Debug(GetLocalizedString("null key"));
27                 }
28                 return null;
29             }
30
31             if(!_initialized)
32             {
33                 if(Log.IsErrorEnabled)
34                 {
35                     Log.Error(GetLocalizedString("get socket from uninitialized pool"));
36                 }
37                 return null;
38             }
39
40             // if no servers return null
41             if(_buckets.Count == 0)
42                 return null;
43
44             // if only one server, return it
45             if(_buckets.Count == 1)
46                 return GetConnection((string)_buckets[0]);
47
48             int tries = 0;
49
50             // generate hashcode
51             int hv;
52             if(hashCode != null)
53             {
54                 hv = (int)hashCode;
55             }
56             else
57             {
58
59                 // NATIVE_HASH = 0
60                 // OLD_COMPAT_HASH = 1
61                 // NEW_COMPAT_HASH = 2
62                 switch(_hashingAlgorithm)
63                 {
64                     case HashingAlgorithm.Native:
65                         hv = key.GetHashCode();
66                         break;
67
68                     case HashingAlgorithm.OldCompatibleHash:
69                         hv = OriginalHashingAlgorithm(key);
70                         break;
71
72                     case HashingAlgorithm.NewCompatibleHash:
73                         hv = NewHashingAlgorithm(key);
74                         break;
75
76                     default:
77                         // use the native hash as a default
78                         hv = key.GetHashCode();
79                         _hashingAlgorithm = HashingAlgorithm.Native;
80                         break;
81                 }
82             }
83
84             // keep trying different servers until we find one
85             while(tries++ <= _buckets.Count)
86             {
87                 // get bucket using hashcode
88                 // get one from factory
89                 int bucket = hv % _buckets.Count;
90                 if(bucket < 0)
91                     bucket += _buckets.Count;
92
93                 SockIO sock = GetConnection((string)_buckets[bucket]);
94
95                 if(Log.IsDebugEnabled)
96                 {
97                     Log.Debug(GetLocalizedString("cache choose").Replace("$$Bucket$$", _buckets[bucket].ToString()).Replace("$$Key$$", key));
98                 }
99
100                 if(sock != null)
101                     return sock;
102
103                 // if we do not want to failover, then bail here
104                 if(!_failover)
105                     return null;
106
107                 // if we failed to get a socket from this server
108                 // then we try again by adding an incrementer to the
109                 // current key and then rehashing
110                 switch(_hashingAlgorithm)
111                 {
112                     case HashingAlgorithm.Native:
113                         hv += ((string)("" + tries + key)).GetHashCode();
114                         break;
115
116                     case HashingAlgorithm.OldCompatibleHash:
117                         hv += OriginalHashingAlgorithm("" + tries + key);
118                         break;
119
120                     case HashingAlgorithm.NewCompatibleHash:
121                         hv += NewHashingAlgorithm("" + tries + key);
122                         break;
123
124                     default:
125                         // use the native hash as a default
126                         hv += ((string)("" + tries + key)).GetHashCode();
127                         _hashingAlgorithm = HashingAlgorithm.Native;
128                         break;
129                 }
130             }
131
132             return null;
133         }
134

时间: 2024-10-16 15:53:44

分析Memcached客户端如何把缓存数据分布到多个服务器上的相关文章

memcached客户端源码分析

转载:memcached客户端源码分析 memcached的Java客户端有好几种,http://code.google.com/p/memcached/wiki/Clients 罗列了以下几种 Html代码   spymemcached          * http://www.couchbase.org/code/couchbase/java             o An improved Java API maintained by Matt Ingenthron and other

php的memcached客户端memcached

memcache的官方主页:http://pecl.php.net/package/memcachememcached的官方主页:http://pecl.php.net/package/memcached 以下是我安装Memcached版本的PHP模块的过程记录: wget http://download.tangent.org/libmemcached-0.48.tar.gztar zxf libmemcached-0.48.tar.gzcd libmemcached-0.48./config

php的memcached客户端memcached_php技巧

memcache的官方主页:http://pecl.php.net/package/memcachememcached的官方主页:http://pecl.php.net/package/memcached 以下是我安装Memcached版本的PHP模块的过程记录: wget http://download.tangent.org/libmemcached-0.48.tar.gztar zxf libmemcached-0.48.tar.gzcd libmemcached-0.48./config

Memcached缓存大数据时对服务器内存、CPU的影响及其对硬件的配置需求

最近公司在进行缓存框架方面的调研,我主要对Memcached在缓存大数据量情况下对系统硬件的影响和需求做了调研,以下是一些测试数据和调研结果:  Memcached缓存不同数据量测试情况:           一.测试环境配置信息    1. 缓存服务器配置信息:一共4台 ,三台是公司服务器,一台是本机         node1: 单核 1G内存         node2: 单核 1G内存         node3: 单核 1G内存         node4: 4核  8G内存    2

艾伟:自己实现memcached客户端库

What's memcached ? memcached是一个以key-value的形式缓存数据的缓存系统.通过将数据缓存到内存中,从而提高数据的获取速度.memcached以key-value的形式来保存数据,你可以为你每一段数据关联一个key,然后以后可以通过这个key获取这段数据. memcached是一个库还是什么?memcached其实是一个单独的网络服务器程序.它的网络底层基于libevent,你可以将其运行在网络中的一台服务器上,通过网络,在遵循memcached的协议的基础上与m

基于java nio的memcached客户端

1.xmemcached是什么? xmemcached是基于java nio实现的memcached客户端API. 实际上是基于我实现的一个简单nio框架 http://code.google.com/p/yanf4j/的基础上实现的(目前是基于yanf4j 0.52),核心代码不超过1000行,序列化机制直接挪用spymemcached的Transcoder. 性能方面,在读写简单类型上比之spymemcached还是有差距,在读写比较大的对象(如集合)有效率优势. 当前0.50-beta版本

自己实现memcached客户端库

What's memcached ? memcached是一个以key-value的形式缓存数据的缓存系统.通过将数据缓存 到内存中,从而提高数据的获取速度. memcached以key-value的形式来保存数据,你可以为你每一段数据关联一个 key,然后以后可以通过这个key获取这段数据. memcached是一个库还是什么?memcached其实是一个单独的网络服务器程序 .它的网络底层基于libevent,你可以将其运行在网络中的一台服务器上,通过 网络,在遵循memcached的协议的

大量图片本地缓存-客户端访问网站缓存所有图片,再次访问时先读取缓存图片,若被清除,再从服务器下载

问题描述 客户端访问网站缓存所有图片,再次访问时先读取缓存图片,若被清除,再从服务器下载 标题已经说的很清晰了.一个功能 我网站上有大量的图片,然后为了减少服务器负担,需要将客户访问过的页面图片缓存在客户端,再次访问时,判断本地缓存是否存在该图片,若有则直接读取本地缓存的图片:若无,在服务器上重新加载一次并添加缓存. 一些博客什么的都查过了,多多少少不适用.... 大神们,最好可以提供一个简易的demo.....万分感激! 解决方案 这个浏览器会自动判断的不要你操心. 解决方案二: 服务器设置图

.NET平台上的Memcached客户端介绍

早上接到一个任务,需要对Linux服务器的Memcached的update操作进行性能测试,我发现我是一个典型的"手里拿着锤子,就把所有问题都当成钉子"的人.我第一个念头就是,上Memcached的官网找.NET的客户端.最后在Codeplex上找到了一个叫Memcached Providers的客户端程序,很小,218K,里面就3个DLL,一个是Memcached Providers本身的DLL,还有一个是Enyim.Caching,Enyim.Caching也是一个.NET平台上的