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服务端。
1.首先下载memcache安装文件:【安装包】。安装包里面会有x64和x86两个文件夹,根据操作系统选择一个打开会找到memcached.exe。这个文件不能直接双击运行安装,需要通过cmd进行安装。
2.安装步骤如图所示:

步骤:

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的配置介绍。

【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 = "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;
 }
}

输出结果:

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”的数据。

首先向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 = 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();

【实例代码】

(0)

相关推荐

  • C# Memcached缓存用法实例详解

    本文实例讲述了C#中Memcached缓存的用法,分享给大家供大家参考.具体方法如下: ICacheStrategy.cs文件如下: 复制代码 代码如下: public interface ICacheStrategy {         /// <summary>         /// 添加数据到缓存         /// </summary>         /// <param name="objId">缓存名称</param>

  • .net/c# memcached缓存获取所有缓存键的方法步骤

    使用组件 memcached 1.2.6 .net 类库 memcacheddotnet_clientlib-1.1.5 1.增加memcacheddotnet_clientlib-1.1.5代码 下载好组件后,用vs打开.net类库memcacheddotnet_clientlib-1.1.5,打开MemCachedClient.cs,增加如下方法: 复制代码 代码如下: public Hashtable Stats(ArrayList servers, string command)    

  • asp.net(C#)遍历memcached缓存对象

    STATS命令 遍历memcached缓存对象(C#)转载之青草堂 出于性能考虑,memcached没有提供遍历功能,不过我们可以通过以下两个stats命令得到所有的缓存对象. 1.stats items 显示各个slab中item的数目. 2.stats cachedump slab_id limit_num 显示某个slab中的前limit_num个key列表,显示格式:ITEM key_name [ value_length b; expire_time|access_time s] 除了

  • C# memcached缓存使用实例代码

    复制代码 代码如下: public interface ICacheStrategy    {        /// <summary>        /// 添加数据到缓存        /// </summary>        /// <param name="objId">缓存名称</param>        /// <param name="o">缓存内容</param>      

  • C# memcache 使用介绍

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

  • PHP操作Memcache实例介绍

    b/s: 基于浏览器和服务器架构 web程序 c/s: QQ SVN client客户端+ 服务器 简单的基于文本行的协议: redis memcache 区别: 都是存储数据的,memcache直接保存到内存中,redis 保存到内存中,关闭之后保存到硬盘中,memcache 重启电脑,关闭服务都会造成数据丢失 (1)保存在内存中 (2)重启电脑,重启服务全部数据都消失 (3)LRU算法,根据最近使用的变量,将长时间没使用的变量删除 PHP如何操作memcache 1,php加载扩展php_m

  • PHP数据库操作三:redis用法分析

    本文实例讲述了PHP数据库操作redis用法.分享给大家供大家参考,具体如下: memcache虽然好用,解决了数据库遇到高并发时的IO问题,但还有很多问题丞待解决: 1.数据持久性问题,memcache用内存进行存储,一旦memcache服务器宕机,那么所存储的数据全部丢失. 2.memcache存储的数据类型单一,只支持key-value型的数据,要存储复杂类型的数据,必然需要PHP脚本的大量逻辑操作. redis基本介绍 redis也是一个内存非关系型数据库,它拥有memcache在数据存

  • PHP MemCached高级缓存配置图文教程

    1.Memcache相关介绍 memcache是一个高性能的分布式的内存对象缓存系统,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等. 使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取. 2.Memcache Win32的安装 (1)下载地址: http://www.jehiah.cz/projects/memcached-win32/ (2)安装步骤: step1

  • 如何设置一个严格30分钟过期的Session示例介绍

    SESSION和COOKIE是每个面试官必问的知识点,所以希望同学能深刻学习理解这部分以获得更好的工作机会 以下内容转之laruence博客(这是个学习PHP的好地方,详情点击http://www.laruence.com/) 我在面试的时候, 经常会问一个问题: "如何设置一个30分钟过期的Session?", 大家不要觉得看似简单, 这里面包含的知识挺多, 特别适合考察基本功是否扎实, 谁来回答试试? 呵呵 为什么问这个问题呢? 1. 我在Twitter上看到了有人讨论这个问题,

  • MVC使用Memcache+Cookie解决分布式系统共享登录状态学习笔记6

    为了解决单机处理的瓶颈,增强软件的可用性,我们需要将软件部署在多台服务器上启用多个二级子域名以频道化的方式,根据业务功能将网站分布部署在独立的服务器上,或通过负载均衡技术(如:DNS轮询.Radware.F5.LVS等)让多个频道共享一组服务器.当我们将网站程序分部到多台服务器上后,由于Session受实现原理的局限,无法跨服务器同步更新Session,使得登录状态难以通过Session共享. 我们使用MemCache+Cookie方案来解决分布式系统共享登录状态的问题. Memcache服务器

  • PHP使用memcache缓存技术提高响应速度的方法

    本文实例讲述了PHP使用memcache缓存技术提高响应速度的方法.分享给大家供大家参考.具体分析如下: php虽然己经做到很好很快了,但是如果大数据量时还是会有些卡了,这里介绍一下PHP中使用memcache缓存技术提高响应速度方法,有需要了解的朋友可参考. memcache既可以在linux下使用,也可以在windows系统下使用,当然首推linux系统,至于如何安装memcache,google一下就什么都出来了. 下面贴一段memcache的使用例子,代码如下: 复制代码 代码如下: <

  • PHP实现的memcache环形队列类实例

    本文实例讲述了PHP实现的memcache环形队列类.分享给大家供大家参考.具体如下: 这里介绍了PHP实现的memcache环形队列类.没咋学过数据结构,因为业务需要,所以只是硬着头皮模拟的! 参考PHP memcache 队列代码.为使队列随时可入可出,且不受int长度越界危险(单链采取Head自增的话不作处理有越界可能),所以索性改写成环形队列.可能还有BUG,忘见谅! <?php /** * PHP memcache 环形队列类 * 原作者 LKK/lianq.net * 修改 FoxH

  • 在php中设置session用memcache来存储的方法总结

    memcached提供了一个自定义的session处理器可以被用于存储用户session数据到memcached服务端.一个完全独立的memcached实例将会在内部使用,因此如果需要您可以设置一个不同的服务器池.session的key被存储在前缀memc.sess.key.之下,因此, 如果你对session和通常的缓存使用了同样的服务器池,请注意这一点.译注:另外一个session和通常缓存分离的原因是当通常的缓存占满了memcached服务端后,可能会导致你的session被从缓存中踢除,

  • PHP扩展Memcache分布式部署方案

    基础环境 其实基于PHP扩展的Memcache客户端实际上早已经实现,而且非常稳定.先解释一些名词,Memcache是danga.com的一个开源项目,可以类比于MySQL这样的服务,而PHP扩展的Memcache实际上是连接Memcache的方式. 首先,进行Memcache被安装具体可查看博客里的其它几篇文章; 其次,进行PHP扩展的安装,官方地址是http://pecl.php.net/package/memcache 最后,启动Memcache服务,比如这样,通过不同端口启动多个进程模拟

随机推荐