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

Memcached探索(系列三)

2013-08-16 15:12 253 查看
今天主要是分别使用和分析上篇中提到的客户端来分别说明各个客户端的不同.

在使用这几个客户端这前先介绍memcached的一个管理及监控工具MemCacheD Manager.

可以在http://allegiance.chi-town.com/MemCacheDManager.aspx下载后安装这个应用程序.通过此工具可以手动增加并本配置Memcached Server,并且可以监控每个Server的状态.













以上Server手动建完后可以在服务中看到.

一、使用.NET memcached client library - 1.1.5(memcacheddotnet)

Examples
用于测试的基本代码:

using Memcached.ClientLibrary;

public class UnitTests

{

public static MemcachedClient mc = null;

public static void Initialize()
{

//String[] serverlist = { "127.0.0.1:11211", "127.0.0.1:11212", "127.0.0.1:11213" } 分别使用三台和四台服务器做测试
String[] serverlist = { "127.0.0.1:11211", "127.0.0.1:11212", "127.0.0.1:11213", "127.0.0.1:11214" };
SockIOPool pool = SockIOPool.GetInstance("test");

pool.SetServers(serverlist); //设置服务器列表
pool.SetWeights(new int[] { 2, 2, 2, 4 }); //各服务器之间负载均衡的设置
pool.InitConnections = 5; //初始化时创建的连接数
pool.MinConnections = 5; //最小连接数
pool.MaxConnections = 250; //最大连接数
pool.MaxIdle = 1000 * 60 * 60 * 6; //连接的最大空闲时间,下面设置为6个小时(单位ms),超过这个设置时间,连接会被释放掉
pool.SocketConnectTimeout = 0; //socket连接的超时时间,下面设置表示连接不超时,即一直保持连接状态
pool.Nagle = false; //是否对TCP/IP通讯使用Nalgle算法,.NET版本没有实现
pool.MaintenanceSleep = 60; //维护线程的间隔激活时间,下面设置为60秒(单位s),设置为0表示不启用维护线程

pool.MaxBusy = 1000 * 10; //socket单次任务的最大时间,超过这个时间socket会被强行中断掉(当前任务失败)
pool.Failover = true; //每隔一定时间间隔才尝试重新连接该节点,期间原来映射到该节点的key将被重新映射到其他可用节点上,该节点恢复之后,这些key会重新映射回该节点
pool.Initialize(); //initialize the pool for memcache servers

mc = new MemcachedClient();
mc.PoolName = "test";
mc.EnableCompression = false;

TestExamples();

pool.Shutdown();
}

/// <summary>
/// add:仅当存储空间中不存在键相同的数据时才保存
/// replace: 仅当存储空间中存在键相同的数据时才保存
/// set与add和replace不同,无论何时都保存
/// </summary>
public static void TestExamples()
{
mc.Set("key_1", "A".PadRight(20, 'A'));
mc.Set("key_2", "B".PadRight(20, 'B'), DateTime.Now.AddSeconds(10));
mc.Set("key_3", "C".PadRight(20, 'C'), DateTime.Now.AddSeconds(5));
mc.Set("key_4", "D".PadRight(20, 'D'), DateTime.Now.AddSeconds(5));
mc.Set("key_5", "E".PadRight(20, 'E'), DateTime.Now.AddSeconds(6));
mc.Set("key_6", "F".PadRight(20, 'F'), DateTime.Now.AddSeconds(5));
mc.Set("key_7", "G".PadRight(20, 'G'), DateTime.Now.AddSeconds(6));
mc.Set("key_8", "H".PadRight(20, 'H'), DateTime.Now.AddSeconds(5));
mc.Set("key_9", "L".PadRight(20, 'L'), DateTime.Now.AddSeconds(6));
mc.Set("key_0", "I".PadRight(20, 'I'), DateTime.Now.AddSeconds(5));
Console.WriteLine("{0}:", DateTime.Now.ToString("HH:mm:ss fff"));
Console.WriteLine("\tkey_1: {0}\tno expiration", mc.Get("key_1"));
Console.WriteLine("\tkey_2: {0}\texpires after 10s", mc.Get("key_2"));
Console.WriteLine("\tkey_3: {0}\texpires after 5s", mc.Get("key_3"));
Console.WriteLine("\tkey_4: {0}\texpires after 5s", mc.Get("key_4"));
Console.WriteLine("\tkey_5: {0}\texpires after 6s", mc.Get("key_5"));
Console.WriteLine("\tkey_6: {0}\texpires after 5s", mc.Get("key_6"));
Console.WriteLine("\tkey_7: {0}\texpires after 6s", mc.Get("key_7"));
Console.WriteLine("\tkey_8: {0}\texpires after 5s", mc.Get("key_8"));
Console.WriteLine("\tkey_9: {0}\texpires after 6s", mc.Get("key_9"));
Console.WriteLine("\tkey_0: {0}\texpires after 5s", mc.Get("key_0"));
Thread.Sleep(5 * 1000); //make the thread sleep for 5s, key_3 should expired
Console.WriteLine("{0}: sleep 5s", DateTime.Now.ToString("HH:mm:ss fff"));

Console.WriteLine("\tkey_1: {0}", mc.Get("key_1"));
Console.WriteLine("\tkey_2: {0}", mc.Get("key_2"));
Console.WriteLine("\tkey_3: {0}", mc.Get("key_3"));
Console.WriteLine("\tkey_4: {0}", mc.Get("key_4"));
Console.WriteLine("\tkey_5: {0}", mc.Get("key_5"));
Console.WriteLine("\tkey_6: {0}", mc.Get("key_6"));
Console.WriteLine("\tkey_7: {0}", mc.Get("key_7"));
Console.WriteLine("\tkey_8: {0}", mc.Get("key_8"));
Console.WriteLine("\tkey_9: {0}", mc.Get("key_9"));
Console.WriteLine("\tkey_0: {0}", mc.Get("key_0"));
mc.Add("key_1", "X".PadRight(20, 'X'));
mc.Add("key_2", "Y".PadRight(20, 'Y'));
mc.Add("key_3", "Z".PadRight(20, 'Z'));
Console.WriteLine("{0}: try to change values by using add command", DateTime.Now.ToString("HH:mm:ss fff"));

//make the thread sleep 15s, key_2 should expired and key_3 should be set a new value
Thread.Sleep(5 * 1000);
Console.WriteLine("{0}: sleep 5s", DateTime.Now.ToString("HH:mm:ss fff"));
Console.WriteLine("\tkey_1: {0}", mc.Get("key_1"));
Console.WriteLine("\tkey_2: {0}", mc.Get("key_2"));
Console.WriteLine("\tkey_3: {0}", mc.Get("key_3"));
}

}

使用MemCacheD Manager工具监控,得出的结论如下.

使用3台服务器的监控情况:





使用4台服务器的监控情况:





二、EnyimMemcached - 1.2.0.2

Examples
用于测试的基本代码:

using Enyim.Caching;
using Enyim.Caching.Configuration;
using Enyim.Caching.Memcached;

static void Main(string[] args)
{

var mc = new MemcachedClient("enyim.com/memcached");

mc.Store(StoreMode.Set, "key_1", "A".PadRight(20, 'A'));
mc.Store(StoreMode.Set, "key_2", "B".PadRight(20, 'B'), DateTime.Now.AddSeconds(10));
mc.Store(StoreMode.Set, "key_3", "C".PadRight(20, 'C'), DateTime.Now.AddSeconds(5));
mc.Store(StoreMode.Set, "key_4", "D".PadRight(20, 'D'), DateTime.Now.AddSeconds(5));
mc.Store(StoreMode.Set, "key_5", "E".PadRight(20, 'E'), DateTime.Now.AddSeconds(6));
mc.Store(StoreMode.Set, "key_6", "F".PadRight(20, 'F'), DateTime.Now.AddSeconds(5));
mc.Store(StoreMode.Set, "key_7", "G".PadRight(20, 'G'), DateTime.Now.AddSeconds(6));
mc.Store(StoreMode.Set, "key_8", "H".PadRight(20, 'H'), DateTime.Now.AddSeconds(5));
mc.Store(StoreMode.Set, "key_9", "L".PadRight(20, 'L'), DateTime.Now.AddSeconds(6));
mc.Store(StoreMode.Set, "key_0", "I".PadRight(20, 'I'), DateTime.Now.AddSeconds(5));

Console.WriteLine("{0}:", DateTime.Now.ToString("HH:mm:ss fff"));
Console.WriteLine("\tkey_1: {0}\tno expiration", mc.Get("key_1"));
Console.WriteLine("\tkey_2: {0}\texpires after 10s", mc.Get("key_2"));
Console.WriteLine("\tkey_3: {0}\texpires after 5s", mc.Get("key_3"));
Console.WriteLine("\tkey_4: {0}\texpires after 5s", mc.Get("key_4"));
Console.WriteLine("\tkey_5: {0}\texpires after 6s", mc.Get("key_5"));
Console.WriteLine("\tkey_6: {0}\texpires after 5s", mc.Get("key_6"));
Console.WriteLine("\tkey_7: {0}\texpires after 6s", mc.Get("key_7"));
Console.WriteLine("\tkey_8: {0}\texpires after 5s", mc.Get("key_8"));
Console.WriteLine("\tkey_9: {0}\texpires after 6s", mc.Get("key_9"));
Console.WriteLine("\tkey_0: {0}\texpires after 5s", mc.Get("key_0"));
Thread.Sleep(5 * 1000); //make the thread sleep for 5s, key_3 should expired
Console.WriteLine("{0}: sleep 5s", DateTime.Now.ToString("HH:mm:ss fff"));

Console.WriteLine("\tkey_1: {0}", mc.Get("key_1"));
Console.WriteLine("\tkey_2: {0}", mc.Get("key_2"));
Console.WriteLine("\tkey_3: {0}", mc.Get("key_3"));
Console.WriteLine("\tkey_4: {0}", mc.Get("key_4"));
Console.WriteLine("\tkey_5: {0}", mc.Get("key_5"));
Console.WriteLine("\tkey_6: {0}", mc.Get("key_6"));
Console.WriteLine("\tkey_7: {0}", mc.Get("key_7"));
Console.WriteLine("\tkey_8: {0}", mc.Get("key_8"));
Console.WriteLine("\tkey_9: {0}", mc.Get("key_9"));
Console.WriteLine("\tkey_0: {0}", mc.Get("key_0")); mc.Store(StoreMode.Add, "key_1", "X".PadRight(20, 'X'));
mc.Store(StoreMode.Add, "key_2", "Y".PadRight(20, 'Y'));
mc.Store(StoreMode.Add, "key_3", "Z".PadRight(20, 'Z'));
Console.WriteLine("{0}: try to change values by using add command", DateTime.Now.ToString("HH:mm:ss fff"));

//make the thread sleep 15s, key_2 should expired and key_3 should be set a new value
Thread.Sleep(5 * 1000);
Console.WriteLine("{0}: sleep 5s", DateTime.Now.ToString("HH:mm:ss fff"));
Console.WriteLine("\tkey_1: {0}", mc.Get("key_1"));
Console.WriteLine("\tkey_2: {0}", mc.Get("key_2"));
Console.WriteLine("\tkey_3: {0}", mc.Get("key_3"));

}

下面是enyim.com的配置文件

<configSections>
<sectionGroup name="enyim.com">
<section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
</sectionGroup>
</configSections>
<enyim.com protocol="Binary">
<memcached>
<servers>
<add address="127.0.0.1" port="11211" />
</servers>
<socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
</memcached>
</enyim.com>

下面是使用三台服务器监控的结果.





使用四台服务器监控的结果,理论上服务器越多Misses越少





三、MemcachedProviders

MemcachedProviders客户端是对Enyim.com客户端的再次封装

获取数据DistCache.Add(),里面有四个重载函数,看源码都是调用Enyim.com中的Store方法,并且都是StoreMode.Set.

其中DisahCache.Add(string key, object value, bool bDefaultExpire),第三个参数的含义:是否使用默认的过期设置,因为在MemcachedProviders中有DistCache类

有一个静态属性DefaultExpireTime,服务端缓存时间,如上述参数则启动此参数设置.

具体测试就不在多说了,可以自己去下载客户端去试一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: