您的位置:首页 > 数据库 > Memcache

memcached分布式集群的存取算法

2016-03-02 19:36 633 查看
    首先我要声明的是为什么叫分布式集群?因为我写的这个memcached存取的算法既可以适应集群,又可以适应分布式,只是一个概念的问题,大家不必过于纠结!
    因为我们要达到的目的是要把缓存放到2台搭建在不同的服务器上面的memcached,所以我们如果两个memcached中放的是一样的数据,那么就是集群,如果是根据业务不同而放不一样的数据就是分布式!这里要讲的是分布式的算法,分布式和集群只是一句代码的不同而已!
    
搭建memcached分布式环境:
   
public class CacheHelper
{
//缓存服务器地址和端口,就实现了分布式缓存。

private static Dictionary<string, string> Servers = new Dictionary<string, string>();
static MemcachedClient mc = null;
static object LOCK_OBJECT = new object();//安全锁定

/// <summary>
/// 静态构造函数
/// </summary>
static CacheHelper()
{
InitServer();
//List<string> keys = Servers.Keys.ToList<string>();
foreach (var k in Servers.Keys)
{
SockIOPool pool = SockIOPool.GetInstance(k);
string[] s = new string[] { Servers[k] };
pool.SetServers(s);//设置服务器
pool.MaxConnections = 10000;
pool.MinConnections = 10;
pool.Initialize();//初始化缓存线程池
}
}

/// <summary>
/// 初始化服务器列表,这里默认两台服务器
/// </summary>
static void InitServer() {
//这里可以写活,从配置文件中获得服务器
Servers.Add("Svr1", ConfigurationManager.AppSettings["Svr1"]);
Servers.Add("Svr2", ConfigurationManager.AppSettings["Svr2"]);
}

#region 获取客户端 李少然 2016年2月24日19:58:40
public static MemcachedClient GetClient(string server)
{
MemcachedClient current = Singleton<MemcachedClient>.Instance;
// MemcachedClient current = MemcachedClient.Instance;
current.PoolName = server;
return current;
}
#endregion
}


Memcached分布式的缺陷处理:

     由于Memcached服务器与服务器之间没有任何通讯,并且不进行任何数据复制备份,所以当任何服务器节点出现故障时,就可能导致系统崩溃,这示就会出现单点故障。
    要想搭建的分布式要想可以预防单点故障就必须得可以指定服务器存取(指定存取也是memcached集群的关键点),这样我们不但可以根据业务不同放到不同的服务器上面,还可以用一台服务器做备份用了!但是memcachedClient这个底层的类没有指定服务器缓存的方法,所以就得我们自己进行封装!
    这里只给出一个封装的指定服务器存的算法:
   
#region SetTo()设置服务器进行缓存 李少然 2016-2-26 17:09:53
/// <summary>
/// 设置服务器进行数据缓存
/// </summary>
/// <param name="server">服务器,格式和配置文件中的数据库IP对应</param>
/// <param name="key"></param>
/// <param name="value"></param>
public static void SetTo(string server, string key, object value)
{
MemcachedClient client = GetClient(server);
client.PoolName = server;
client.Set(key, value);
}
#endregion


    指定服务器取的算法也是类似的,这里就不给出了!

分布式存取的算法:
    
    其实真正在做项目的时候,这个算法是要根据具体的业务来封装的,我这里只是做一个例子,给大家说明写算法的逻辑:

存入的算法:
            
#region 将一组数据存入到memcached 李少然 2016-2-26 16:31:21
Dictionary<string, object> dic = new Dictionary<string, object>();
Person person = new Person { UserId = "1", UserName = "李少然" };
Dongdong dong = new Dongdong { UserId = "2", UserName = "咚咚" };
int i = 1;
dic.Add("5", dong);
dic.Add("6", dong);
dic.Add("7", dong);
dic.Add("8", dong);

foreach (var item in dic)
{
//算法开始
if (i % 2 == 0)
{
//6/8
CacheHelper.SetTo("Svr1", item.Key, item.Value);
}
else
{
//5/7
CacheHelper.SetTo("Svr2", item.Key, item.Value);
}
i++;
}
#endregion


取出的算法:
#region 从缓存取数据的算法
if (CacheHelper.IsServersExists("Svr2", "8") == true)//如果这个KEY值存在
{
//从指定服务器缓存中取数据
Dongdong cc = CacheHelper.GetCounterFrom("Svr2", "8") as Dongdong;
textBox1.Text = cc.UserId.ToString() + ";" + cc.UserName.ToString();
}
else
{
//从另一个服务器中取数据
Dongdong cc = CacheHelper.GetCounterFrom("Svr1", "8") as Dongdong;
textBox1.Text = cc.UserId.ToString() + ";" + cc.UserName.ToString();
}
#endregion

小总:

           研究一个东西不是只知道原理就行了,要查阅很多的资料,然后才可以查到符合你的需求点的东西!所以不能放弃,可以休息,但是要坚持!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: