.NET平台下使用Memcached
2018-01-04 14:08
369 查看
MemCached是什么
MemCached是一个自由开源,高性能,分布式内存对象缓存系统。Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。MemCached是一种基于内存的key-value存储,用来存储小块的任意数据。实现原理就是,第一次从数据库获取到结果之后,同时将结果保存在内存中,从而简单对数据库的访问次数,以提高Web应用的速度。
Memcached 官网:http://memcached.org/。
Window中MemCached安装
下载地址:http://pan.baidu.com/s/1yVILw 提取密码:5gx9官方网站:http://memcached.org/
下载完成后
1、打开SetupFile安装文件夹。
2、以管理员身份打开cmd,输入以下命令
3、安装成功之后,要去服务中启动memcached服务。
MemCached命令
MemCached中有很多命令,大概可分为增加、更新、获取和删除缓存数据,下面简单介绍几种常用的命令; Set
用于将value(数据值)存储到指定的key(键)中。
如果set的key已经存在,该命令会更新该key所对应的原来的数据,也就是实现了更新的作用。
Add
用于将value(数据值)存储到指定的key(键)中。
如果 Add 的 key 已经存在,则不会更新数据,之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
Get
Get命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。
Delete
用于删除已存在的 key(键)。
flush_all
flush_all 命令用于清理缓存中的所有 key=>value(键=>值) 对。
该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作。
由于最近的项目是使用.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
}
}
}
简单示例
新建一个控制台程序,从下载的目录中添加ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll三个组件,新建一个MemCached管理类,具体代码如下: /// <summary> /// 分布式缓存的MemCached管理器 /// </summary> public class MemCachedManager { public static MemcachedClient cache; static MemCachedManager() { string[] servers = { "172.20.61.195:11211" }; //初始化池 SockIOPool pool = SockIOPool.GetInstance(); //设置服务器列表 pool.SetServers(servers); //设置各服务之间负责均衡的权重 pool.SetWeights(new int[] { 1 }); //初始化时创建连接数 pool.InitConnections = 3; //最小连接数 pool.MinConnections = 3; //最大连接数 pool.MaxConnections = 5; //连接的最大空闲时间,下面设置为6个小时(单位为ms),超过这个设置时间,连接会被释放 pool.MaxIdle = 1000 * 60 * 60 * 6; //socket连接的超时时间,为0表示永不超时,即一直保持连接状态 pool.SocketConnectTimeout = 0; //通讯的超时时间,下面设置为3秒,.net版本没有实现 pool.SocketTimeout = 1000 * 3; //维护线程的间隔激活时间,下面设置为30秒(单位s),设置为0时表示不启用维护线程 pool.MaintenanceSleep = 30; //设置SocketIO池的故障标志 pool.Failover = true; //是否对TCP/IP通讯使用nalgle算法,.net版本没有实现 pool.Nagle = false; //socket单次任务的最大时间(单位ms),超过这个时间socket会被强行中断,当前任务失败 pool.MaxBusy = 1000 * 10; pool.Initialize(); cache = new MemcachedClient(); //是否启用压缩数据:如果启用了压缩,数据压缩长于门槛的数据将被储存在压缩的形式 cache.EnableCompression = false; } }
其中IP是本机地址,端口是固定的,如果有多台服务器用于缓存,在数组列出对应的IP即可。
测试代码:
public static void TestMethod() { //清除所有的缓存数据 MemCachedManager.cache.FlushAll(); var v1 = MemCachedManager.cache.Add("a", "123"); var res1 = MemCachedManager.cache.Get("a"); Console.WriteLine("第一次Add返回值{0},结果{1}", v1, res1); var v2 = MemCachedManager.cache.Add("a", "456"); var res2 = MemCachedManager.cache.Get("a"); Console.WriteLine("第二次Add返回值{0},结果{1}", v2, res2); var v3 = MemCachedManager.cache.Set("a", "789"); var res3 = MemCachedManager.cache.Get("a"); Console.WriteLine("Set返回值{0},结果{0}", res3); var v4 = MemCachedManager.cache.Replace("a", "123"); var res4 = MemCachedManager.cache.Get("a"); Console.WriteLine("replace返回值{0},结果{0}", res4); var v5 = MemCachedManager.cache.Replace("b", "123"); Console.WriteLine("replace返回值{0}", v5); MemCachedManager.cache.Set("b","456"); MemCachedManager.cache.Delete("b"); var v6= MemCachedManager.cache.KeyExists("b"); Console.WriteLine("Delete之后返回值{0}", v6); } }
运行结果:
相关文章推荐
- 使用PostSharp 在.NET 平台上实现 AOP
- 在Windows .NET平台下使用Memcached
- FastDFS在.Net平台上的使用
- Memcached缓存在.Net 中的使用(memcacheddotnet)
- 【开发笔记】 .Net平台下log4Net日志的使用
- .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用
- 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统 (Part 2)
- 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统 (Part 4)
- 使用 .NET 平台,如何玩转 Universal Windows 应用?
- C#:memcached安装及.NET中的Memcached.ClientLibrary使用详解
- WebService 应用(2) - .Net 平台WebService的创建、部署和使用介绍
- 在Windows .NET平台下使用Memcached
- .net 使用Memcached
- 在Windows .NET平台下使用Memcached
- memcached安装及.NET中的Memcached.ClientLibrary使用详解
- Memcached缓存在.Net 中的使用(memcacheddotnet)
- 使用Memcached提高.NET应用程序的性能
- 使用PostSharp在.NET平台上实现AOP
- [C#技术] .NET平台开源JSON库LitJSON的使用方法(转载)
- 在.NET平台下使用SQL2000 Image类型数据