本节探讨问题:
- MemcachedProviders简单介绍
- MemcachedProviders如何配置使用
- MemcachedProviders命中率测试
MemcachedProviders是对Enyim.Caching的再次封装,并加入了客户端计数器功能以及Session数据库管理功能。上一节已经提供了下载链接,需要下载的朋友到前一节下载。Enyim也是应用比较广泛的Memcached .net客户端,和之前的Memchachedonet 客户端相比,分布式算法应该做了相应优化(具体可参照第一节的原理环节查看),这一点我们在后面的测试环节做一下验证。我们先来看一下Enyim的基本业务类图
以上为Enyim的基本业务类,开发中可直接使用MemcachedClient类+配置文件 完成基本的存取删除业务。其中ServerPool从配置文件读取服务器列表维护到MemCachedNode中,并且可以标记出哪些处于活动,哪些停止响应的服务器从而方便客户端快速找到可以正常使用的服务器。在Operation类中,可以看到Enyim已经使用了二进制协议。
二、MemcachedProviders如何配置使用
如果喜欢简洁的可以直接使用Enyim.Caching开发,我们这里使用对Enyim.Caching再次封装的MemcachedProviders,因为他用来显示的更简洁。
简单的列一下MemcachedProviders 的几个基本类
DistCache 直接CURD的数据的静态类
MemcachedCacheProvider 策略模式提供的给DistCache的业务类
CacheProviderSection 缓存配置文件节点类
上图显示了MemcachedProviders的基本业务流程,我们在使用DistCache时,他首先会从配置文件找到对应的缓存策略Providers,MemcachedCachedProvider是实现了计数器功能的一个策略,当然你也可以继承CacheProviders重写一个策略类,而该类只需要实现MemcachedClient就可实现基本的业务。MemcachedClient被实现的时候,会实现默认的ServerPool 去读取Enyim节点的服务器配置信息。很简单吧,那我们就开始测试环节的工作了。
三、MemcachedProviders命中率测试
MemcachedProviders源码是GIT上载的,GIT的项目基本上都是SVN搭建的,解压后会看到Branches(项目分支),Tags(里程),Trunk(项目主线)
我直接选了主版本Trunk的源码解决方案,新建设了一个Demo测试项目。
开始工作前我们参照上节,分别用MemcaheD Manager在3台服务器上搭了Memcached服务端
测试代码同上节一样,100条记录存取,分别3,4,5服务器测试。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MemcachedProviders.Cache;
using MemcachedProviders.Session;
using System.Configuration;
using System.Web.Configuration;
using System.Collections;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
int runs = 100;
int start = 200;
if (args.Length > 1)
{
runs = int.Parse(args[0]);
start = int.Parse(args[1]);
}
string keyBase = "testKey";
string obj = "This is a test of an object blah blah es, serialization does not seem to slow things down so much. The gzip compression is horrible horrible performance, so we only use it for very large objects. I have not done any heavy benchmarking recently";
//循环记时往服务器缓存上插入数据 等会我们要观察一下数据都存到哪个服务器上的Memcached server上了
long begin = DateTime.Now.Ticks;
for (int i = start; i < start + runs; i++)
{
DistCache.Add(keyBase + i, obj);
}
long end = DateTime.Now.Ticks;
long time = end - begin;
//计算存储这些数据花了多长时间
Console.WriteLine(runs + " sets: " + new TimeSpan(time).ToString() + "ms");
//开始取数据,并记时
begin = DateTime.Now.Ticks;
int hits = 0;
int misses = 0;
for (int i = start; i < start + runs; i++)
{
string str = (string)DistCache.Get(keyBase + i);
if (str != null)
++hits; //成功取到数据
else
++misses; //丢失次数
}
end = DateTime.Now.Ticks;
time = end - begin;
//获取这些数据花了多长时间
Console.WriteLine(runs + " gets: " + new TimeSpan(time).ToString() + "ms");
Console.WriteLine("Cache hits: " + hits.ToString());
Console.WriteLine("Cache misses: " + misses.ToString());
Console.WriteLine("--------------------------------------------------------\r\n");
Console.ReadLine();
}
}
}
配置文件先设置3台服务器
<memcached>
<servers>
<!-- put your own server(s) here-->
<add address="172.16.125.76" port="11211" />
<add address="172.16.0.21" port="11211" />
<add address="172.16.76.98" port="11211" />
</servers>
<socketPool minPoolSize="10" maxPoolSize="100"
connectionTimeout="00:00:10" deadTimeout="00:02:00" />
</memcached>
测试结果1:
MemcacheD Manager结果:
测试2:MemcacheD Manager清空所有服务器数据,在增加一台服务器继续测试,代码部分相同
配置文件:
<memcached>
<servers>
<!-- put your own server(s) here-->
<add address="172.16.125.76" port="11211" />
<add address="172.16.0.21" port="11211" />
<add address="172.16.76.98" port="11211" />
<add address="172.16.125.76" port="11212" />
</servers>
<socketPool minPoolSize="10" maxPoolSize="100"
connectionTimeout="00:00:10" deadTimeout="00:02:00" />
</memcached>
测试结果2:
测试3:再增加至5台Server
配置文件:
<memcached>
<servers>
<!-- put your own server(s) here-->
<add address="172.16.125.76" port="11211" />
<add address="172.16.0.21" port="11211" />
<add address="172.16.76.98" port="11211" />
<add address="172.16.125.76" port="11212" />
<add address="172.16.0.21" port="11212" />
</servers>
<socketPool minPoolSize="10" maxPoolSize="100"
connectionTimeout="00:00:10" deadTimeout="00:02:00" />
</memcached>
测试结果:
看下工具的结果:
3次测试结果,100条记录分布在不同的Server上,Hit 100% MISS 0次。结果还是很理想的,看来Enyim改进的算法还是很优秀的,加上配置化,计数器等功能总体上优于Memcachedonet。
我们来看下MemcachedProviders计数器结果:
好了,这一节就到这里了。