1.下载
windows下的 http://download.csdn.net/detail/flxyzsby/3941243 安装的exe文件。(此exe文件已经打包了所需的dll了,即exe中包含dll组件)
2.安装步骤
1. 将Memcached-1.4.5(W64)解压放某个盘下面,比如在
E:\ApabiCourse\memcached\memcached-1.4.5(W64).exe;
2. 在运行中启动CMD,然后输入
【“E:\ApabiCourse\memcached\memcached-1.4.5(W64).exe” -d install】 安装;
3. 在运行下输入“regedit”打开注册表, 找到路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached,下面找到一个ImagePath 的字符串项,正好是服务的执行路径的字符串,双击该串,在后面追加入“-m 2048 -c 20000”( 使用2048M内存,链接数为20000)。
4. 再输入:【“E:\ApabiCourse\memcached\memcached-1.4.5(W64).exe”-d start】启动。 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。
检测是否安装成功
5.检测服务是否可用:
执行cmd命令,启动telnet到memcached服务所在的ip的端口,例如【telnet 172.18.89.5 11211】,其中,11211是memcached的默认端口
输入stats,即可看到下图,证明安装服务成功。
- 将memcached.exe安装为Windows服务:memcached.exe -d install
- 启动memcached服务:memcached.exe -d start
- 启动memcached服务(windows命令):net start "memcached Server"
- 停止memcached服务(windows命令):net stop "memcached Server"
- 连接到memcached控制台:telnet ServerIP 11211
- 打印当前memcached服务器状态:stats
- 打印当前memcached服务器Items(记录)的统计信息:stats items
- 打印当前memcached服务器Slab(分区)及Chunk(块)的统计信息:stats slabs
- 打印指定Slab中的KEY列表(可用于遍历items,但效率较低,慎用!):stats cachedump SlabId Limit_num。显示结果:ITEM KeyName [ValueByteLength b; LastAccessTime s]。值得注意的是,经过测试确认:那个LastAccessTime并不是记录到期时间,而是最后一次的get时间,并且get之后,也不会自动延长expiry(到期时间)。
- 添加新记录:add KeyName 0 0 ValueByteLength [回车] ValueContent
- 删除记录 : delete KeyName
- 添加或更新记录 : set KeyName 0 0 ValueByteLength [回车] ValueContent
- 更新记录 : replace KeyName 0 0 ValueByteLength [回车] ValueContent
通过这个数据我们就可以了解Memcached的状态了。
这些数据所代表的意义如下:
pid:32u,服务器进程ID。
uptime:32u, 服务器运行时间,单位秒。
time :32u, 服务器当前的UNIX时间。
version :string, 服务器的版本号。
curr_items :32u, 服务器当前存储的内容数量 Current number of items stored by the server
total_items :32u, 服务器启动以来存储过的内容总数。
bytes :64u, 服务器当前存储内容所占用的字节数。
curr_connections :32u, 连接数量。
total_connections :32u, 服务器运行以来接受的连接总数。
connection_structures:32u, 服务器分配的连接结构的数量。
cmd_get :32u, 取回请求总数。
cmd_set :32u, 存储请求总数。
get_hits :32u, 请求成功的总次数。
get_misses :32u, 请求失败的总次数。
bytes_read :64u, 服务器从网络读取到的总字节数。
bytes_written :64u, 服务器向网络发送的总字节数。
limit_maxbytes :32u, 服务器在存储时被允许使用的字节总数。
上面的描述中32u和64u表示32位和64位无符号整数,string表示是string类型数据。
三、memcache客户端的安装(.net版本)
enyim.com Memcached Client
源码地址:点击下载源码 (开源项目,可提供研究学习)
Enyim也是应用比较广泛的Memcached .net客户端,和之前的Memchachedonet 客户端相比,分布式算法应该做了相应优化
下载enyim.com Memcached Client 和 Memcached Providers,解压后会发现,enyim.com Memcached Client中,还包含了著名的Log4net日志框架。
而Memcached Providers中其实包含了Enyim.Caching.dll,也包含了Log4netDLL。
Memcached Providers更强大,MemcachedProviders是对Enyim.Caching的再次封装,并加入了客户端计数器功能以及Session数据库管理功能。
当然,使用和配置起来也同样简单,方便,只是对于一些负责的操作和处理方面,功能更强大一些。
如果只是简单的应用,推荐直接使用enyim.com Memcached Client。除了添加必要的Enyim.Caching.dll引用,还需要修改应用程序的配置文件。
下面的代码贴出这两种方式的配置文件和测试代码:(放心,有详细的注释)
测试代码(实现最简单的功能)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Enyim.Caching; using MemcachedProviders.Cache; using System.Threading; namespace MemcachedProject { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { testMemcachedProviders(); } /// <summary> /// 测试Enyim.Caching(注意:Enyim.Caching只具有MemcachedProviders的一部分功能,后者更强大。还可以集成Log4Net日志框架) /// </summary> public void testEnyimCaching() { MemcachedClient client = new MemcachedClient("enyim.com/memcached"); //存值 --不带过期时间的存储,Memcached将根据LRU来决定过期策略 bool result = client.Store(Enyim.Caching.Memcached.StoreMode.Add, "name", "dinglang"); //带过期时间的缓存 //bool success = client.Store(StoreMode.Add, person.UserName, person, DateTime.Now.AddMinutes(10)); if (result) { Response.Write("成功存入缓存"); //取值 object name = client.Get("name"); if (name != null) { Response.Write("取出的值为:" + name); } else { Response.Write("取值失败"); } } else { Response.Write("存入缓存失败"); } } /// <summary> /// 使用MemcachedProviders客户端 /// </summary> public void testMemcachedProviders() { string key = "myName"; string value = "Dylan"; bool result = false; string val = string.Empty; #region 存/取最简单的数据类型 //如果缓存中没有,就尝试着去存入缓存 if (DistCache.Get(key) == null) { //DistCache.DefaultExpireTime = 1200;//缓存时间 result = DistCache.Add(key, value); //存数据 if (result) { //如果存入成功,就试着去取 Thread.Sleep(500); string ret = (string)DistCache.Get(key); //读数据 //Assert.AreEqual(value, ret); //验证 if (ret != null) { Response.Write(ret); Response.Write("<br/>"); } else { //取出来的值为null,直接移除该缓存对象 DistCache.Remove(key);//移除 // DistCache.RemoveAll();//移除所有 } } } else { //缓存中有,直接拿数据 string ret = (string)DistCache.Get(key); if (ret != null) { Response.Write(ret); Response.Write("<br/>"); } else { DistCache.Remove(key); } } #endregion #region 存/取一个Person对象 Person person = new Person() { Id = 007, Name = "Dylan" };//new 一个Person对象的实例 //如果缓存中没有,则尝试着放入缓存 if (DistCache.Get<Person>("myObj") == null) { result = DistCache.Add("myObj", person); if (result) { Thread.Sleep(500); val = DistCache.Get("myObj").ToString(); if (val != null) { Response.Write(val); Response.Write("<br/>"); } else { DistCache.Remove("myObj"); } } } else { //缓存中已经有该对象,就直接从缓存取 Person p = DistCache.Get<Person>("myObj"); val = person.ToString(); //也可以直接这样取 // val = DistCache.Get("myObj").ToString(); if (val != null) { Response.Write(val); Response.Write("<br/>"); } else { DistCache.Remove("myObj"); } } #endregion } } }
Person类的定义代码:
这里需要说明的是如果我们需要向Memcached中添加自定义数据类型时,我们需要将该数据类型添加上[Serializable]标记。
[Serializable] public class Person { private int id; public int Id { get { return id; } set { id = value; } } private string name; public string Name { get { return name; } set { name = value; } } /// <summary> /// 重写Tostring(),方便输出验证 /// </summary> /// <returns></returns> public override string ToString() { return "Person:" + "{name:" + Name + ",id:" + Id + "}"; } }
web.config 配置信息:
<?xml version="1.0"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <!--Enyim.Caching配置(省略了Log4Net框架) For Memcached--> <!--<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="11121" /> </servers> <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" /> </memcached> </enyim.com>--> <!--The Enyim.Caching配置 End --> <!--MemcachedProviders的配置 --> <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> <cacheProvider defaultProvider="MemcachedCacheProvider"> <providers> <add name="MemcachedCacheProvider" type="MemcachedProviders.Cache.MemcachedCacheProvider, MemcachedProviders" keySuffix="_MySuffix_" defaultExpireTime="2000"/> </providers> </cacheProvider> <enyim.com> <memcached> <servers> <!-- put your own server(s) here--> <add address="127.0.0.1" port="11121" /> </servers> <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" /> </memcached> </enyim.com> <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> <!--The MemcachedProviders配置 End 配置结束,下面的都是一些其他的配置,例如连数据库之类的,和我们的 memcache 无关--> <connectionStrings> <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" /> </connectionStrings> <system.web> <compilation debug="true" targetFramework="4.0" /> <authentication mode="Forms"> <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> </authentication> <membership> <providers> <clear/> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> </providers> </membership> <profile> <providers> <clear/> <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> </providers> </profile> <roleManager enabled="false"> <providers> <clear/> <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> </providers> </roleManager> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration>
http://blog.csdn.net/flxyzsby/article/details/6430106 Windows下编译memcached-1.4.5(32bit和64bit)
http://www.cnblogs.com/whoknows/articles/memcache_php5-3-10_win32.html introduce
http://blog.couchbase.com/memcached-144-windows-32-bit-binary-now-available down
http://www.cnblogs.com/luminji/archive/2011/08/17/2140804.html winform example
http://www.cnblogs.com/zhoufoxcn/archive/2011/03/27/2515609.html 周公
http://code.google.com/p/memcached/wiki/NewServerMaint google