C# memcache
概述
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服务端。
- 首先下载memcache安装文件:【安装包】。安装包里面会有x64和x86两个文件夹,根据操作系统选择一个打开会找到memcached.exe。这个文件不能直接双击运行安装,需要通过cmd进行安装。
- 安装步骤如图所示:
步骤:
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
进入后先按ctrl+]启动回示功能,否则无法看到输入信息。回示功能启动成功后如下图:
然后按回车输入参数stats:
安装和测试工作已完成..
实例代码
有很多C#版本的Memcached客户端程序。在这里我们使用的是Memcached.ClientLibrary.dll客户端调用方法,调用需要二个DLL:
Memcached.ClientLibrary.dll (Memcached客户端类库)
log4net.dll (log4net是为Memcached提供日志记录) DLL下载地址:【点击下载】
在项目中引用这个二个dll,引用log4net.dll后还需进行一系列配置工作。在上篇博客中有对log4net的配置介绍。
注意:Memcached.ClientLibrary.dll和log4net.dll有版本对应关系。
2.如果使用WinForm或控制台应用程序把log4net的配置文件独立出现,和写在App.config里面需要小小设置一下。
如图:Log4Net.config属性“复制到输出目录”:“始终复制”。不然在bin目录下找不到对应配置信息会产生报错。
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 = "", 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());
while (true)
{
if (MClient.KeyExists("Key1002"))
{
Console.WriteLine("key:Key1002 Value:{0},当前时间:{1}", MClient.Get("Key1002"), DateTime.Now);
Thread.Sleep();
}
else
{
Console.WriteLine("key:Key1002 我已过期,当前时间:{0}", DateTime.Now);
break;
}
}
输出结果:
Memcached缓存过期机制:
比如键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”的数据。
首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存“tokyo”及其值。
同样,“kanagawa”、“chiba”、“saitama”、“gunma”都是先选择服务器再保存。接下来获取保存的数据。获取时也要将要获取的键“tokyo”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值。
这样,将不同的键保存到不同的服务器上,就实现了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 = ;
var time = Stopwatch.StartNew();
for (int i = ; i < count; i++)
{
MClient.Add(i.ToString(), "value" + i);
}
Console.WriteLine("memcached缓存创建成功。耗时:{0}",time.ElapsedTicks); time = Stopwatch.StartNew();
for (int i = ; 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();
C# memcache的更多相关文章
- PHP之Memcache缓存详解
Mem:memory缩写(内存):内存缓存 1. 断电或者重启服务器内存数据即消失,即临时数据: Memcache默认端口:11211 存入方式:key=>>value ...
- 走进缓存的世界(三) - Memcache
系列文章 走进缓存的世界(一) - 开篇 走进缓存的世界(二) - 缓存设计 走进缓存的世界(三) - Memcache 简介 Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用 ...
- 网站缓存技术总结( ehcache、memcache、redis对比)
网站技术高速发展的今天,缓存技术已经成为大型网站的一个关键技术,缓存设计好坏直接关系的一个网站访问的速度,以及购置服务器的数量,甚至影响到用户的体验. 网站缓存按照存放的地点不同,可以分为客户端缓存. ...
- MemCache超详细解读
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- 如何在腾讯开放平台的云服务器上安装php和memcache 一
由于被通知腾讯的CEE要关闭了,必须自己切换到服务器,自己装php.烦到一个B. 首先找到官方wiki: http://wiki.qcloud.com/wiki/SUSE%E7%8E%AF%E5%A2 ...
- 搭建LNAMP环境(七)- PHP7源码安装Memcached和Memcache拓展
上一篇:搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展 一.安装Memcached 1.yum安装libevent事件触发管理器 yum -y install libe ...
- 前端学PHP之PHP操作memcache
× 目录 [1]安装 [2]连接 [3]增删改查[4]分布式[5]状态[6]安全[7]应用 前面的话 和访问mysql服务器类似,PHP也是作为客户端API访问memcached服务器的,所以同样需要 ...
- 前端学PHP之MemCache
× 目录 [1]作用 [2]安装 [3]管理[4]命令 前面的话 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括 ...
- Memcache缓存系统构建一
在如今这个高效率的社会中,怎样将这个高效率应用到自己的程序中,是一个值得追寻和值得探讨的问题.因为这个memcache能够很好的提高检索速度,提升用户体验,而且重要的是减少数据库的访问.这就大大的提高 ...
- PHP实现查询Memcache内存中的所有键与值
使用Memcache时,我们可以用memcache提供的get方法,通过键查询到当前的数据,但是有时候需要查询内存中所有的键和值,这个时候可以使用下面的代码实现: <?php /** * Cre ...
随机推荐
- C# 类构造函数赋值里属性与字段赋值注意项
public class Test { public Test(int age) { this.Age=age;//如果这里使用的是this.age=age;那么属性里的判断将不会执行 } priva ...
- linux下开发板网络速度测试记录
由于做的项目对于网络和USB的读写速度有很高的要求,因此新拿回来的板子要测试网络和usb的最佳传输速度.要考虑不少因素,先把我能想到的记录下来. 测试的环境是开发板和ubuntu虚拟机 ...
- ARC小知识
ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting).简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管 ...
- ADO.NET笔记——将DataReader作为函数返回值
相关知识: 在很多情况下,可能把数据库的访问封装到一个函数中,通过该函数返回一个DataReader对象给调用者.例如定义函数:SqlDataReader returnDR(),然后再Main函数中调 ...
- jquery easyui combox实用方法记录
// combogrid刷新 $(“#cc").combogrid('grid').datagrid('load'); // combogrid设置默认选中哪一行 $('#cc').comb ...
- js----DOM的三大节点及部分用法
DOM有三种节点:元素节点.属性节点.文本节点. 一.用nodeType可以检测节点的类型 节点类型 nodeType属性值 元素节点 1 属性节点 2 文本节点 3 这样方便在js中对各个节点进行操 ...
- ASP.NET MVC 2 验证
来源:http://www.cnblogs.com/jhxk/articles/2612885.html 只为把自己觉的好的存起来 对用户输入的验证以及强制业务规则/逻辑是大多数web应用的核心需求 ...
- 安装mongodb后服务启动不了的问题
安装mongodb后,在命令行进入mongoDB安装目录执行如下: mongod --dbpath [数据存放的本地路径] 提示如下错误: ERROR: dbpath (数据存放的本地路径) does ...
- jeecms子栏目或者文章页导航父栏目选中解决方法
jeecms在子栏目或者文章页导航父栏目选中,看例子 <div class="nav"> <ul> [@cms_channel_list ] <li ...
- HTML5 input新增的几种类型(数字、日期、颜色选取、范围)
你可能已经听说过,HTML5里引入了几种新的input类型.在HTML5之前,大家熟知的input类型包括:text(输入框),hidden(隐藏域),submit(提交按钮)等.而HTML5到来之后 ...