欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# memcache 使用介绍

程序员文章站 2022-05-26 15:19:56
概述   memcache是一套开放源的分布式高速缓存系统。由服务端和客户端组成,以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。memca...

概述

  memcache是一套开放源的分布式高速缓存系统。由服务端和客户端组成,以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。memcache主要把数据对象缓存到内存中,通过在内存里维护一个统一的巨大的hash表。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。memcache基于一个存储键/值对的hashmap进行存储对象到内存中。memcache是用c写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

  特性:  
•在 memcached中可以保存的item数据量是没有限制的,只要内存足够 。
•memcached单进程在32位系统中最大使用内存为2g,若在64位系统则没有限制,这是由于32位系统限制单进程最多可使用2g内存,要使用更多内存,可以分多个端口开启多个memcached进程 。
•最大30天的数据过期时间,设置为永久的也会在这个时间过期,常量realtime_maxdelta
•单个item最大数据是1mb,超过1mb数据不予存储,常量power_block 1048576进行控制

windows下安装memcache

  了解memcache一些基本信息后,在来尝试在windows下安装memcache服务端。
1.首先下载memcache安装文件:【】。安装包里面会有x64和x86两个文件夹,根据操作系统选择一个打开会找到memcached.exe。这个文件不能直接双击运行安装,需要通过cmd进行安装。
2.安装步骤如图所示:

C# memcache 使用介绍

步骤:

1.窗口+r:输入cmd
2.进行g盘: 输入 g:
3.进行memcached for window 32/64的安装目录:输入 cd ck\memcached_en32or64\x64
4.安装memcached:输入 memcached -d install
5.启动服务:输入 memcached -d start

启动服务后在windows进程中可以看到memcached.exe.

memcached -d start|stop|shutdown|restart|uninstall|install 启动|停止|关闭|重启|卸载|安装。

安装步骤不是很复杂。第一:找到文件(memcached.exe)路径。第二: memcached -d install 就ok..

基本默认参数说明:

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

服务器操作完成后,我们可以在本机telnet 到服务测试一个下。(如果提示telnet命令不存在,需要去控件面板开启windows的tel服务功能, win7的开启tel功能操作步骤是:【控制面板】->【程序和功能】->【打开或关闭window功能】,然后找到并勾选tel相关即可。其他window系统步骤类似。)

测试telnet是否正常运行 telnet 172.21.0.192 11211

C# memcache 使用介绍

进入后先按ctrl+]启动回示功能,否则无法看到输入信息。回示功能启动成功后如下图:

C# memcache 使用介绍

然后按回车输入参数stats:

C# memcache 使用介绍

C# memcache 使用介绍

安装和测试工作已完成..

实例代码

有很多c#版本的memcached客户端程序。在这里我们使用的是memcached.clientlibrary.dll客户端调用方法,调用需要二个dll:

memcached.clientlibrary.dll (memcached客户端类库)

log4net.dll (log4net是为memcached提供日志记录) dll下载地址:【】

在项目中引用这个二个dll,引用log4net.dll后还需进行一系列配置工作。在上篇博客中有对log4net的配置介绍。

log4net 日志配置[附带源码]

注意:memcached.clientlibrary.dll和log4net.dll有版本对应关系。

2.如果使用winform或控制台应用程序把log4net的配置文件独立出现,和写在app.config里面需要小小设置一下。

如图:log4net.config属性“复制到输出目录”:“始终复制”。不然在bin目录下找不到对应配置信息会产生报错。

C# memcache 使用介绍

memcache基于一个存储键/值对的hashmap进行存储对象到内存中。所以我们可以理解为主要在操作hashmap的键值对。

以下是一些简单操作[增,删,改,查,设置过期时间]:

//参数设置
string sockiopoolname = "test_sockiopoolname";
string[] memcacheservicelist = { "172.21.0.192:11211" };

//设置连接池
sockiopool spool = sockiopool.getinstance(sockiopoolname);
spool.setservers(memcacheservicelist);
spool.initialize();

//实例化client
memcachedclient mclient = new memcachedclient();
mclient.poolname = sockiopoolname;

console.writeline("1.创建memcache缓存hello world");
mclient.add("key1001", "hello world");
console.writeline("2.查询缓存信息{0}", mclient.get("key1001"));

console.writeline("3.修改memcache缓存hello world");
mclient.set("key1001", "hello world - 修改版");
console.writeline("4.查询缓存信息{0}", mclient.get("key1001"));

if (mclient.keyexists("key1001"))
{
 console.writeline("5.删除memcache缓存");
 mclient.delete("key1001");
}

if (mclient.keyexists("key1001"))
 console.writeline(mclient.get("key1001"));
else
 console.writeline("6.删除已删除");

student stud = new student() { id = "10001", name = "张三" };
mclient.add("student", stud);
student get_stud = mclient.get("student") as student;
console.writeline("6.缓存实体对象:{0} {1}", get_stud.id, get_stud.name);

mclient.add("key1002", "我已设置过期时间1分钟", datetime.now.addminutes(1));
while (true)
{
 if (mclient.keyexists("key1002"))
 {
 console.writeline("key:key1002 value:{0},当前时间:{1}", mclient.get("key1002"), datetime.now);
 thread.sleep(20000);
 }
 else
 {
 console.writeline("key:key1002 我已过期,当前时间:{0}", datetime.now);
 break;
 }
}

输出结果:

C# memcache 使用介绍

memcached缓存过期机制:

惰性删除:它并没有提供监控数据过期的机制,而是惰性的,当查询到某个key数据时,如果过期那么直接抛弃。

比如键key1002在2015-04-09 13:54 :18 我设置他的值为:”我已设置过期时间1分钟“。他的过期时间为1分钟。等到2015-04-09 13:55 :18时数据应该过期,但在内存中还是会保存这条数据,而是等客户端来请求这条数据时判断数据是否过期。过期就直接删除返回空。如果内存满了memcached会把最长时间未使用到期的缓存记录给删除,腾出空间继续使用。

memcached分布存储

下面假设memcached服务器有node1~node3三台,应用程序要保存键名为“tokyo”、“kanagawa”、“chiba”、“saitama”、“gunma”的数据。

C# memcache 使用介绍

首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存“tokyo”及其值。

C# memcache 使用介绍

同样,“kanagawa”、“chiba”、“saitama”、“gunma”都是先选择服务器再保存。接下来获取保存的数据。获取时也要将要获取的键“tokyo”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值。

C# memcache 使用介绍

这样,将不同的键保存到不同的服务器上,就实现了memcached的分布式。memcached服务器增多后,键就会分散,即使一台memcached服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。 (参考:memcached全面剖析)

//参数
string[] memcacheservicelist = { "172.21.0.192:11211", "172.21.0.28:11211", "172.21.13.246:11211" };

//设置连接池
sockiopool spool = sockiopool.getinstance();
spool.setservers(memcacheservicelist);
spool.initialize();

memcachedclient mclient = new memcachedclient();
mclient.flushall();

int count = 5;
var time = stopwatch.startnew();
for (int i = 0; i < count; i++)
{
 mclient.add(i.tostring(), "value" + i);
}
console.writeline("memcached缓存创建成功。耗时:{0}",time.elapsedticks);


time = stopwatch.startnew();
for (int i = 0; i < count; i++)
{
 if (mclient.keyexists(i.tostring()))
 {
 console.writeline("key:{0}.value:{1}", i, mclient.get(i.tostring()));
 }
 else
 {
 console.writeline("--------未能查询到数据key:{0}--------",i);
 }
}
console.writeline("memcached缓存数据查询完成。耗时:{0}", time.elapsedticks);

spool.shutdown();

【实例代码】