zoukankan      html  css  js  c++  java
  • Memcached--分布式缓存安装教程

    Memcached的Windows版本在这里下载http://code.google.com/p/memcached/wiki/PlatformWindows(或http://memcachedproviders.codeplex.com/),最高的版本是1.4.4,但是已经很难在网上下载到。不过http://www.couchbase.com/对Memcached进行了很好的维护,但是这个团队把Memcached封装进了自己的产品中(1.4.4也是由这个团队开发的,但是它们已经移除了1.4.4的Memcached的独立分支)。我没有试过couchbase的产品,故本例针对1.2.6(你也可以从本站下载memcached.rar,反正只有几十K)。

    1:将Memcached注册进Windows服务

    memcached -d install

    2:启动Memcached服务

    memcached -d start

    3:停止和移除Memcached服务

    memcached -d stop

    memcached -d uninstall

    4:查看Memcached状态

    使用

    telnet localhost 11211
    然后,输入stats,如果有如下结果就表示安装成功了:
    image

    Memcached是什么?
    Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。

    Memcached能缓存什么?
    通过在内存里维护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

    Memcached快么?

    非常快。Memcached使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表, 因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1).。

    Danga Interactive为提升Danga Interactive的速度研发了Memcached。目前,LiveJournal.com每天已经在向一百万用户提供多达两千万次的页面访问。而这些,是由一个由web服务器和数据库服务器组成的集群完成的。Memcached几乎完全放弃了任何数据都从数据库读取的方式,同时,它还缩短了用户查看页面的速度、更好的资源分配方式,以及Memcache失效时对数据库的访问速度。

    Memcached的特点
    Memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问, 因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,磁盘开销和阻塞的发生。

    Memcached的使用


    一 、Memcached服务器端的安装 (此处将其作为系统服务安装)
    下载文件:memcached 1.2.1 for Win32 binaries (Dec 23, 2006)
        1. 解压缩文件到c:memcached
        2. 命令行输入 'c:memcachedmemcached.exe -d install' 
        3. 命令行输入 'c:memcachedmemcached.exe -d start' ,该命令启动 Memcached ,默认监听端口为 11211
            注:通过 memcached.exe -h 可以查看其帮助

    常用设置:
    -p <num>          监听的端口
    -l <ip_addr>      连接的IP地址, 默认是本机
    -d start             启动memcached服务
    -d restart          重起memcached服务
    -d stop|shutdown  关闭正在运行的memcached服务
    -d install                 安装memcached服务
    -d uninstall             卸载memcached服务
    -u <username>      以<username>的身份运行 (仅在以root运行的时候有效)
    -m <num>              最大内存使用,单位MB。默认64MB
    -M                           内存耗尽时返回错误,而不是删除项
    -c <num>                最大同时连接数,默认是1024
    -f <factor>              块大小增长因子,默认是1.25
    -n <bytes>             最小分配空间,key+value+flags默认是48
    -h                           显示帮助

    C# 下可用的API(每个客户端API中都有详细的说明和注释)

    Memcached .NET客户端:

    1).NET memcached client library

      下载地址:https://sourceforge.net/projects/memcacheddotnet

      相关文章:分布式缓存系统Memcached简介与实践

    2)enyim.com Memcached Client

      下载地址:http://www.codeplex.com/EnyimMemcached/

      相关文章:memcached系列2:memcached实例  

    3)Memcached Providers

      下载地址:http://www.codeplex.com/memcachedproviders

    注意:直接点击Download按钮会下载一个pdf文档Demo,里面介绍了Memcached Providers,下载此类库需要切换到Download选项卡页面。

      相关文章:.NET平台上的Memcached客户端介绍

    4) BeIT Memcached

      下载地址:http://code.google.com/p/beitmemcached/

      相关文章:分布式缓存BeIT Memcached简介

    二、 .NET memcached client library
       下载文件:https://sourceforge.net/projects/memcacheddotnet/

        里面有.Net1.1 和 .Net2.0的两种版本 还有一个不错的例子。

    三、应用

    1. 将Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll 等放到bin目录
    2. 引用Memcached.ClientLibrary.dll
    3 .代码 Example:

    ①:简单的使用:

    代码

    复制代码
     namespace Memcached.MemcachedBench
     
    {
         
    using System;
         
    using System.Collections;
     
         
    using Memcached.ClientLibrary;
     
         
    public class MemcachedBench 
         
    {
              [STAThread]
             
    public static void Main(String[] args) 
              
    {
                 
    string[] serverlist = "10.0.0.131:11211""10.0.0.132:11211" };
     
                 
    //初始化池
                  SockIOPool pool = SockIOPool.GetInstance();
                  pool.SetServers(serverlist);
     
                  pool.InitConnections 
    = 3;
                  pool.MinConnections 
    = 3;
                  pool.MaxConnections 
    = 5;
     
                  pool.SocketConnectTimeout 
    = 1000;
                  pool.SocketTimeout 
    = 3000;
     
                  pool.MaintenanceSleep 
    = 30;
                  pool.Failover 
    = true;
     
                  pool.Nagle 
    = false;
                  pool.Initialize();
     
                 
    // 获得客户端实例
                  MemcachedClient mc = new MemcachedClient();
                  mc.EnableCompression 
    = false;
     
                  Console.WriteLine(
    "------------测   试-----------");
                  mc.Set(
    "test""my value");  //存储数据到缓存服务器,这里将字符串"my value"缓存,key 是"test"
     
                 
    if (mc.KeyExists("test"))   //测试缓存存在key为test的项目
                  {
                      Console.WriteLine(
    "test is Exists");
                      Console.WriteLine(mc.Get(
    "test").ToString());  //在缓存中获取key为test的项目
                  }

                 
    else
                  
    {
                      Console.WriteLine(
    "test not Exists");
                  }

     
                  Console.ReadLine();
     
                  mc.Delete(
    "test");  //移除缓存中key为test的项目
     
                 
    if (mc.KeyExists("test"))
                  
    {
                      Console.WriteLine(
    "test is Exists");
                      Console.WriteLine(mc.Get(
    "test").ToString());
                  }

                 
    else
                  
    {
                      Console.WriteLine(
    "test not Exists");
                  }

                  Console.ReadLine();
                 
                  SockIOPool.GetInstance().Shutdown();  
    //关闭池, 关闭sockets
             }

          }

     }
    复制代码


    ②:在Enyim.Caching类库的使用
    除了以上的引用,再加上Enyim.Caching.dll文件的引用 ,然后配置一下web.config,然后使用 using Enyim.Caching.Memcached 命名空间,最后使用缓存对象前,请new 一下memcachedClient对象

    代码

    复制代码
    <configuration>
        
    <configSections>
            
    <sectionGroup name="enyim.com">
                
    <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
            
    </sectionGroup>
            
    <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
        
    </configSections>
        
    <enyim.com>
            
    <memcached>
                
    <servers>
                    
    <!-- put your own server(s) here-->
                    
    <add address="127.0.0.1" port="20002" />
                    
    <add address="127.0.0.1" port="20004" />
                    
    <add address="127.0.0.1" port="20006" />
                    
    <add address="127.0.0.1" port="20008" />

                    
    <!--<clear />
                    
                    
    <add address="172.16.172.130" port="20002" />
                    
    <add address="172.16.172.130" port="20004" />
                    
    <add address="172.16.172.130" port="20006" />
                    
    <add address="172.16.172.130" port="20008" />-->
                
    </servers>
                
    <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
            
    </memcached>
        
    </enyim.com>
        
    <memcached keyTransformer="Enyim.Caching.TigerHashTransformer, Enyim.Caching">
            
    <servers>
                
    <add address="127.0.0.1" port="20002" />
                
    <add address="127.0.0.1" port="20004" />
                
    <add address="127.0.0.1" port="20006" />
                
    <add address="127.0.0.1" port="20008" />
            
    </servers>
            
    <socketPool minPoolSize="2" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
        
    </memcached>
    </configuration>
    复制代码

    ③:在MemcachedProviders.dll类库的使用

    除了以上的Enyim.Caching类库的应用,还要加上MemcachedProviders.dll文件的引用,然后配置一下web.config,最后使用using MemcachedProviders.Cache; 此命名空间,就可以直接使用了,这样就无需new一个缓存对象了。

    代码

    复制代码
    <configuration>
        
      
    <configSections>
            
    <section name="cacheProvider" type="MemcachedProviders.Cache.CacheProviderSection, MemcachedProviders" allowDefinition="MachineToApplication" restartOnExternalChanges="true"/>
            
    <sectionGroup name="enyim.com">
                
    <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching"/>
            
    </sectionGroup>
            
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
        
    </configSections>
      
        
    <enyim.com>
            
    <memcached>
                
    <servers>
                    
    <!-- put your own server(s) here-->
                    
    <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>
      
        
    <cacheProvider defaultProvider="MemcachedCacheProvider">
            
    <providers>
                
    <add name="MemcachedCacheProvider" type="MemcachedProviders.Cache.MemcachedCacheProvider, MemcachedProviders" keySuffix="_MySuffix_" defaultExpireTime="2000"/>
            
    </providers>
        
    </cacheProvider>
      
        
    <log4net>
            
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
                
    <layout type="log4net.Layout.PatternLayout">
                    
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}]- %message%newline"/>
                
    </layout>
            
    </appender>
            
    <root>
                
    <priority value="WARN"/>
                
    <appender-ref ref="ConsoleAppender">
                    
    <filter type="log4net.Filter.LevelRangeFilter">
                        
    <levelMin value="WARN"/>
                        
    <levelMax value="FATAL"/>
                    
    </filter>
                
    </appender-ref>
            
    </root>
        
    </log4net>
    </configuration>
    复制代码

    使用:

    复制代码
    代码
    string key = "mykey";  
    string value = "Success!!!";  
    DistCache.Add(key, value);            
    //存数据 
     Thread.Sleep(500);  
    string ret = (string)DistCache.Get(key);          //读数据  Assert.AreEqual(value, ret);            //验证
    复制代码

    注意:配置都在configuration节上。

    好了,Memcached就说到这里了。以后会在使用深入了解的过程中,继续补充对它的说明,至于以上的为什么要需要加上一些类库项目的应用,是遵循了高类聚,低耦合的设计原则,从而提高项目的可维护性,当然你也可以自己直接使用Memcached Client library.赶快来练练吧!

  • 相关阅读:
    JavaScript实现简单轮播图动画
    洛谷2151 [SDOI2009]HH去散步(矩阵快速幂,边点互换)
    洛谷P2579 [ZJOI2005]沼泽鳄鱼(矩阵快速幂,周期)
    洛谷4159 [SCOI2009] 迷路(矩阵快速幂,拆点)
    洛谷5789 [TJOI2017]可乐(矩阵快速幂,Floyd思想)
    【封装】二维BIT
    【封装】替罪羊树
    【封装】Splay
    洛谷3521 [POI2011]ROT-Tree Rotations(线段树合并)
    数据结构:树的链式递归实现
  • 原文地址:https://www.cnblogs.com/ruiati/p/3267840.html
Copyright © 2011-2022 走看看