.NET下实现分布式缓存系统Memcached

  前几天同事提到Memcached,正好之前看disucz nt 时也见过这个东西,默认是没有启用的,所以也没有更多的去关注,不过看网上说的蛮多,真怕自己out了,参照着资料做了个小例子。

  就下Memcached_1.2.5 下了,那天我找的时候还自带了实例(memcacheddotnet_clientlib-1.1.5.zip)的,想给个原来的链接的,今天去找,尽然找不到了...

  

  缓存的出现

 

      Web应用程序中,数据通常保存在RDBMS中,应用服务器从数据库中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负载加重、数据库响应变慢、网站显示延迟等重大影响。为了缓解数据库的压力,提升Web应用程序的响应速度,人们提出了Web缓存的概念,这里缓存的概念不同于计算机硬盘控制器上的一块内存芯片。Web缓存位于Web服务器(1个或多个,内容源服务器)和客户端之间(1个或多个),缓存会根据进来的请求保存输出内容的副本,例如html页面, 图片,文件(统称为副本),然后,当下一个请求来到的时候,如果是相同的URL,缓存直接使用副本响应访问请求,而不是向内容源服务器再次发送请求。使用缓存可以减少相应延迟,因为请求在缓存服务器(离客户端更近)而不是源服务器被相应,这个过程耗时更少,让web服务器看上去相应更快;当副本被重用时还可以减少网络带宽消耗。

  Memcached介绍

  

       memcached是一个高性能的分布式的内存对象缓存系统。Memcached是为了加快访问速度而诞生的一个项目,由Danga Interactive开发的,它通过在内存里维护一个统一的巨大的hash表来存储各种格式的数据,包括图像、视 频、文件以及数据库检索的结果等。虽然最初为了加速 LiveJournal 访问速度而开发的,但是后来被很多大型的网站采用。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统,这种方法不仅解决了共享内存只能是单机的弊端,同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度,Memcached用于在动态应用中减少数据库负载,提升访问速度,但是用来加速Web应用、降低数据库负载时比较多。Memcached也完全可以用到其他地方,比如分布式数据库,分布式计算等领域。

  Memcache的特点

 

  Memcached作为高速运行的分布式缓存服务器,具有以下的特点。

   协议简单。Memcached的服务器客户端通信并不使用复杂的XML等格式, 而使用简单的基于文本行的协议。因此,通过telnet也能在memcached上保存数据、取得数据。

   基于libevent的事件处理,libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。而且libevent在使用上可以做到跨平台,而且根据libevent官方网站上公布的数据统计,似乎也有着非凡的性能。

   内置内存存储方式。为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。 在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。 但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢。

  memcached不互相通信的分布式。memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。Cache::Memcached的分布式方法简单来说,就是“根据服务器台数的余数进行分散”。 求得键的整数哈希值,再除以服务器台数,根据其余数来选择服务器。

  Memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问, 因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,磁盘开销和阻塞的发生。

  Memcached使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O, 对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表, 因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1)。

  许多语言都实现了连接memcached的客户端,其中以Perl、PHP为主。 仅仅memcached网站上列出的语言就有Perl、PHP、Python、Ruby、C#、C/C++等等。

  Memcached的工作机制

  Memcached通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,虽然和数据库是独立的,但是目前主要用来缓存数据库的数据。允许多个server通过网络形成一个大的hash,用户不必关心数据存放在哪,只调用相关接口就可。存放在内存的数据通过LRU算法进行淘汰出内存。同时可以通过删除和设置失效时间来淘汰存放在内存的数据。

  解压Memcached_1.2.5到F盘

  cmd:

  F:\>cd Memcached_1.2.5

  F:\Memcached_1.2.5>memcached.exe -h      --可以查看帮助

  F:\Memcached_1.2.5>memcacehd.exe -d instatll   安装memcached的服务

  F:\Memcached_1.2.5>telnet 192.168.1.106 11211

  stats

  可以查看Memcached状态。

  

  -m<num> 是设置分配给Memcached使用的内存数量,单位是MB,默认是64MB

  -u<username> 是运行Memcache的用户

  -l<ip_addr> 是监听的服务器IP,默认INDRR_ANY

  -p<num> 是设置Memcache监听的端口,默认是11211

  -c <num>  是设置最大运行的并发连接数,默认是1024

  -P <file> 是设置保存Memcached的pid文件

  安装后在服务中就出现 memcached Server ,启动。

  

  服务端好了,下面就写程序了,

  引用

  Commons.dll,

  ICSharpCode.SharpZipLib.dll

  log4net.dll

  Memcached.ClientLibrary.dll

  然后引用命名空间

  using Memcached.ClientLibrary;

  代码就不贴了,下了自己看好了。

  小实例

 参考:

memcached下载  http://code.jellycan.com/memcached/

.NET memcached client library http://sourceforge.net/projects/memcacheddotnet/files/

http://tech.it168.com/a2009/0907/675/000000675239.shtml

 http://www.cnblogs.com/daizhj/archive/2009/03/23/1386652.html

原文地址:https://www.cnblogs.com/lee0201/p/1754342.html