在Windows .NET平台下使用Memcached
网上关于Memcached的文章很多,但据我观察,大多是互相转载或者抄袭的,千篇一律。有些则是直接整理的一些超链接然后贴出来。那些超链接笔者大概都进去看了,其实关于Memcached的中文的技术文章,也就那么几篇,优秀的也就更少了。也许是笔者理解、学习能力太差了吧。最近在.NET项目中可能要使用到Memcached这款出色的分布式缓存系统,所以笔者就笨鸟先飞,先研究了一下下。下面我会将总结一下自己研究的结果,并用实例向大家讲解。(入门级别的,高手请直接跳过)。
关于:Memcached的简介,Memcached的实现原理,Memcached的优势.......等等不是本文的重点。所以直接跳过。
(我已经将本文中必要的源码和类库等上传到了csdn下载频道。避免很多英语不好的朋友,访问国外站点下载时候遇到一些困难,浪费时间)。
由于最近的项目是使用.NET作为开发平台,而且使用的是Windows server 2008作服务器。所以,首先要找到Windows平台下的Memcached版本。
下面,我将下载地址贴出来。
http://download.csdn.net/detail/dinglang_2009/3733784 或者 点击此处直接下载
下载好了Memcached之后,解压到任意目录下,例如:
1. 解压缩文件到c:/memcached 进入cmd控制台(该不会有人问我这个cmd要怎么进去吧?)
2. 命令行输入 'c:/memcached/memcached.exe -d install' --安装 Memcached
3. 命令行输入 'c:/memcached/memcached.exe -d start' ,该命令启动 Memcached ,默认监听端口为 11211。
其实可以通过 memcached.exe -p 11211 -m 64 指定它的监听端口是11211(这是它的默认端口,可以指定为其它大于1024的端口,因为小于1024的端口已经有了默认指定),最大使用内存为64m,如果启用了Windows防火墙,切记要在防火墙上打开这个端口。
注:通过 memcached.exe -h 可以查看其帮助 这里不多做介绍了
启动成功之后,在客户端还可以通过telnet来查看和操作Memcached,前提是服务器端和客户端都支持Telnet协议,在Windows7和Windows2008中基于安全性的考虑,默认都不支持,需要在控制面板中安装和启用。(具体的操作我就不说了)
telnet localhost 11211
连接之后会出现一个命令行窗口,在这个命令行窗口中输入"stats"就可以看到当前Memcached的状态,如下图所示:
启动并配置好Memcached的服务端之后呢?我们下面该准备基于.NET平台的客户端了:
据我总结,大概常见的有三四种吧。必要的类库或者源码,我都将提供给大家下载。
1).NET memcached client library
Memcached .NET客户端的类库,目前大概只支持.NET1.0和.NET2.0,笔者没仔细研究这个,估计这个已经过时啦。
2)enyim.com Memcached Client
源码地址:点击下载源码 (开源项目,可提供研究学习)
Enyim也是应用比较广泛的Memcached .net客户端,和之前的Memchachedonet 客户端相比,分布式算法应该做了相应优化
3)Memcached Providers
下载地址:点击下载
Memcached Providers的官网上有一份PDF的文档,是教你怎么配置的。英语不好的童鞋,可以直接参考我的配置(稍后会讲解)。
4) BeIT Memcached
这个笔者没用过,不做讲解了
下载完成,解压后会发现,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类的定义代码:
- [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 + "}";
- }
- }
配置信息:
- <?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-->
- <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>
好的,关于Memcached的基础部分,就先讲到这里。后续,我将会整理一些关于Memcached的高级技术,包括:复杂的存储(缓存/更新)控制模型,缓存策略,在分布式、集群、负载均衡的环境下的使用和管理技巧,性能监控,日志记录等.敬请期待。
本文出自blog.csdn.net/dinglang_2009,转载请注明出处。未经本人允许,任何人不得借此牟利。
Memcached系列文章汇总:
.NET中使用Memcached的相关资源整理
Memcached官方站点:http://www.danga.com/memcached/
Memcached Win32 1.2.6下载:http://code.jellycan.com/memcached/
安装帮助:Windows下的.NET+ Memcached安装
Memcached .NET客户端:
1).NET memcached client library
下载地址:https://sourceforge.net/projects/memcacheddotnet
2)enyim.com Memcached Client
下载地址:http://www.codeplex.com/EnyimMemcached/
3)Memcached Providers
下载地址:http://www.codeplex.com/memcachedproviders
4) BeIT Memcached
在Windows .NET平台下使用Memcached的更多相关文章
- 在Windows .NET平台下使用Memcached (Enyim使用)
1. 启动并配置Memcached的服务端 1. 下载Memcached http://download.csdn.net/download/ful1021/7969231 2. 解压到任意目录下, ...
- Redis在Windows+linux平台下的安装配置(转)
window平台Redis安装 下载地址: http://code.google.com/p/servicestack/wiki/RedisWindowsDownload Redis文件夹有以下几个文 ...
- 在 Windows 10 64 下安装 Memcached,安装 PHP 7.0.22 的 Memcache 扩展
1.之前写过一篇在 PHP 5.6.27 下的博客:http://www.shuijingwanwq.com/2017/09/11/1892/ ,此次是 PHP 7.0.22 下的,如图1 图1 2. ...
- 在Windows平台下安装与配置Memcached及C#使用方法
1.在Windows下安装Memcached 资料来源:http://www.jb51.net/article/30334.htm 在Windows平台下安装与配置Memcached的方法,Memca ...
- Windows 下安装 Memcached
Windows 下安装 Memcached 官网上并未提供 Memcached 的 Windows 平台安装包,我们可以使用以下链接来下载,你需要根据自己的系统平台及需要的版本号点击对应的链接下载即可 ...
- Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)
概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...
- windows平台下基于VisualStudio的Clang安装和配置
LLVM 是一个开源的编译器架构,它已经被成功应用到多个应用领域.Clang是 LLVM 的一个编译器前端,它目前支持 C, C++, Objective-C 以及 Objective-C++ 等编程 ...
- Windows及Linux平台下的计时函数总结
本文对Windows及Linux平台下常用的计时函数进行总结,包括精度为秒.毫秒.微秒三种精度的各种函数.比如Window平台下特有的Windows API函数GetTickCount().timeG ...
- Thrift在Windows及Linux平台下的安装和使用示例
本文章也同时发表在个人博客Thrift在Windows及Linux平台下的安装和使用示例上. thrift介绍 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的R ...
随机推荐
- 《2016ThoughtWorks技术雷达峰会----js爆炸下的技术选型》
JS爆炸下的技术选型 刘尚奇 ThoughtWorks, 高级咨询师 JS每6个星期出现一个新框架,那么如何进行JS的选型.以下从四个方面来分析. 1.工具 NPM for all the t ...
- document对象补充
五.相关元素操作: var a = document.getElementById("id"); 找到a: var b = a.nextSibling ...
- Ubuntu下初学ROS时所遇小问题
[1]运行命令$ rospack depends1 beginner_tutorials 时,提示 : [rospack] Error: no such package beginner_tutori ...
- Socket用法详解
在客户/服务器通信模式中,客户端需要主动创建与服务器的Socket(套接字),服务端收到了客户端的请求,也会创建与客户端连接的Socket. Scoket可以看作两端通信的收发器,服务端和客户端都通过 ...
- android java.io.IOException: open failed: EBUSY (Device or resource busy)
今天遇到一个奇怪的问题, 测试在程序的下载界面,下载一个文件第一次下载成功,删除后再下载结果下载报错, 程序:file.createNewFile(); 报错:java.io.IOException: ...
- JQuery 获取touchstart,touchmove,touchend 坐标
JQuery写法: $('#id').on('touchstart',function(e) { var _touch = e.originalEvent.targetTouches[0]; var ...
- Mysql占用过高CPU时的优化手段
Mysql占用CPU过高的时候,该从哪些方面下手进行优化?占用CPU过高,可以做如下考虑:1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processli ...
- 【MVC】自定义Scaffold Template
MVC提供了基本的CRUD Scaffold Template模板,创建视图的时候,只要勾选创建一个强类型视图 , 并选择模型类,就可以选择支架模板了,这些模板包括List,Detail,Create ...
- document.elementFromPoint在IE8下无法稳定获取当前坐标元素的解决方法
document.elementFromPoint(e.clientX, e.clientY) document.elementFromPoint(e.clientX, e.clientY) 执行2次 ...
- 简单的js验证码
转自:未找到 <script type ="text/javascript" language ="javascript"> var cod ...