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

[经验分享] Memcached探索(系列三)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-1 11:30:41 | 显示全部楼层 |阅读模式
  今天主要是分别使用和分析上篇中提到的客户端来分别说明各个客户端的不同.
  在使用这几个客户端这前先介绍memcached的一个管理及监控工具MemCacheD Manager.
  可以在http://allegiance.chi-town.com/MemCacheDManager.aspx下载后安装这个应用程序.通过此工具可以手动增加并本配置Memcached Server,并且可以监控每个Server的状态.
  
DSC0000.jpg
  
DSC0001.jpg
  
DSC0002.jpg
  
  
  
  以上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台服务器的监控情况:
DSC0003.jpg
  
  使用4台服务器的监控情况:
  
  
DSC0004.jpg
  
  二、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>

  
  
  
  
  
  
  
  
  
  
  
  
  
   下面是使用三台服务器监控的结果.
DSC0005.jpg
  
  使用四台服务器监控的结果,理论上服务器越多Misses越少
DSC0006.jpg
  
  
  三、MemcachedProviders
   MemcachedProviders客户端是对Enyim.com客户端的再次封装
   获取数据DistCache.Add(),里面有四个重载函数,看源码都是调用Enyim.com中的Store方法,并且都是StoreMode.Set.
   其中DisahCache.Add(string key, object value, bool bDefaultExpire),第三个参数的含义:是否使用默认的过期设置,因为在MemcachedProviders中有DistCache
  有一个静态属性DefaultExpireTime,服务端缓存时间,如上述参数则启动此参数设置.
  具体测试就不在多说了,可以自己去下载客户端去试一下。

运维网声明 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-108316-1-1.html 上篇帖子: memcached 源代码阅读笔记(4)- SET 操作分析 下篇帖子: 获取memcached缓存对象数量,统计在线用户数据量
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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