设为首页 收藏本站
查看: 1280|回复: 0

[经验分享] 第二节 Memcached之MemcachedProviders(Enyim)客户端使用及测试

[复制链接]

尚未签到

发表于 2015-9-1 07:07:50 | 显示全部楼层 |阅读模式
  本节探讨问题:


  • MemcachedProviders简单介绍
  • MemcachedProviders如何配置使用
  • MemcachedProviders命中率测试
  MemcachedProviders是对Enyim.Caching的再次封装,并加入了客户端计数器功能以及Session数据库管理功能。上一节已经提供了下载链接,需要下载的朋友到前一节下载。Enyim也是应用比较广泛的Memcached .net客户端,和之前的Memchachedonet 客户端相比,分布式算法应该做了相应优化(具体可参照第一节的原理环节查看),这一点我们在后面的测试环节做一下验证。我们先来看一下Enyim的基本业务类图
DSC0000.png
  以上为Enyim的基本业务类,开发中可直接使用MemcachedClient类+配置文件 完成基本的存取删除业务。其中ServerPool从配置文件读取服务器列表维护到MemCachedNode中,并且可以标记出哪些处于活动,哪些停止响应的服务器从而方便客户端快速找到可以正常使用的服务器。在Operation类中,可以看到Enyim已经使用了二进制协议。
  二、MemcachedProviders如何配置使用
  如果喜欢简洁的可以直接使用Enyim.Caching开发,我们这里使用对Enyim.Caching再次封装的MemcachedProviders,因为他用来显示的更简洁。
  简单的列一下MemcachedProviders 的几个基本类
  DistCache 直接CURD的数据的静态类
  MemcachedCacheProvider 策略模式提供的给DistCache的业务类
  CacheProviderSection 缓存配置文件节点类
DSC0001.png
  上图显示了MemcachedProviders的基本业务流程,我们在使用DistCache时,他首先会从配置文件找到对应的缓存策略Providers,MemcachedCachedProvider是实现了计数器功能的一个策略,当然你也可以继承CacheProviders重写一个策略类,而该类只需要实现MemcachedClient就可实现基本的业务。MemcachedClient被实现的时候,会实现默认的ServerPool 去读取Enyim节点的服务器配置信息。很简单吧,那我们就开始测试环节的工作了。
  三、MemcachedProviders命中率测试
  MemcachedProviders源码是GIT上载的,GIT的项目基本上都是SVN搭建的,解压后会看到Branches(项目分支),Tags(里程),Trunk(项目主线)
  我直接选了主版本Trunk的源码解决方案,新建设了一个Demo测试项目。
  开始工作前我们参照上节,分别用MemcaheD Manager在3台服务器上搭了Memcached服务端
DSC0002.png
  测试代码同上节一样,100条记录存取,分别3,4,5服务器测试。


DSC0003.gif DSC0004.gif View Code


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台服务器


View Code


  <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:
DSC0005.png
  MemcacheD Manager结果:
DSC0006.png
  测试2:MemcacheD Manager清空所有服务器数据,在增加一台服务器继续测试,代码部分相同
  配置文件:


View Code


  <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:
DSC0007.png
  测试3:再增加至5台Server
  配置文件:


View Code


  <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>  测试结果:
DSC0008.png
  看下工具的结果:
DSC0009.png
  3次测试结果,100条记录分布在不同的Server上,Hit 100% MISS 0次。结果还是很理想的,看来Enyim改进的算法还是很优秀的,加上配置化,计数器等功能总体上优于Memcachedonet。
  我们来看下MemcachedProviders计数器结果:
DSC00010.png
  好了,这一节就到这里了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-108062-1-1.html 上篇帖子: memcached在大负载高并发网站上的应用(一)---简介 原创 王泽宾 下篇帖子: 用FreeBSD与memcached建立分布缓存服务器全程记录之前言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表