那点所谓的分布式——memcache

来源:互联网 发布:惊艳的名字知乎 编辑:程序博客网 时间:2024/06/05 06:38

一: 安装

     memcahce像redis,mongodb一样都需要开启他们自己的服务端,我们下载Memcached_1.2.5.zip,然后放到C盘,修改文件

名为memcached。

1:install

     install可以说是万能通用命令,首先我们转到memcached目录,然后 memcached.exe -d install 即可。

        

2:start

    现在我们只要启动start即可,要注意的就是memecache默认的端口是11211,当然我也不想重新指定端口了。

        

3:stop,uninstall

     这两个就不截图了,一个是停止,一个是卸载,反正都是万能通用命令。

 

二:驱动程序

   memcache的服务器我们就已经开启好了,由于在公司最近一直都在用php,算了还是用C#驱动吧,谁让这是.net

社区呢,下载C#驱动,既然是缓存服务器,只要有基本的CURD,我想应该就差不多了。

using System;using System.Collections.Generic;namespace BeIT.MemCached{    class Example    {        public static void Main(string[] args)        {            //通过配置文件初始化memcache实例            MemcachedClient cache = MemcachedClient.GetInstance("MyConfigFileCache");            //编辑(可以模拟session操作,缓存20分钟)            cache.Set("name", "一线码农", DateTime.Now.AddMinutes(20));            //获取            var result = cache.Get("name");            Console.WriteLine("获取name的缓存数据为: " + result);            //删除            cache.Delete("name");            Console.WriteLine("\n成功删除cache中name的数据");            result = cache.Get("name");            Console.WriteLine("\n再次获取cache中name的数据为:" + (result ?? "null") + "\n");            //查看下memecahce的运行情况            foreach (KeyValuePair<string, Dictionary<string, string>> host in cache.Status())            {                Console.Out.WriteLine("Host: " + host.Key);                foreach (KeyValuePair<string, string> item in host.Value)                {                    Console.Out.WriteLine("\t" + item.Key + ": " + item.Value);                }                Console.Out.WriteLine();            }            Console.Read();        }    }}


我们再定义下配置文件,既然memcache可以用于分布式,那就避免不了将cache分摊到几台服务器上去,可以看到,下面的

配置也是非常简单的,当然分配的法则自然是memcache自身的算法决定的,最后别忘了在另一台服务器上开放一个端口就它

就行了。

<?xml version="1.0" encoding="utf-8" ?><configuration>  <configSections>    <section name="beitmemcached" type="System.Configuration.NameValueSectionHandler" />  </configSections>  <appSettings>  </appSettings>  <beitmemcached>    <add key="MyConfigFileCache" value="127.0.0.1:11211" />    <!--<add key="MyConfigFileCache" value="127.0.0.1:11211,127.0.0.1:8888" />-->  </beitmemcached></configuration>


 

下面是打包程序:BeITMemcached ,也可以到codegoogle去下载。


三、memcached 的工作原理

首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

与许多 cache 工具类似,Memcached 的原理并不复杂。它采用了C/S的模式,在 server 端启动服务进程,在启动时可以指定监听的 ip,自己的端口号,所使用的内存大小等几个关键参数。一旦启动,服务就一直处于可用状态。Memcached 的目前版本是通过C实现,采用了单进程,单线程,异步I/O,基于事件 (event_based) 的服务方式.使用 libevent 作为事件通知实现。多个 Server 可以协同工作,但这些 Server 之间是没有任何通讯联系的,每个 Server 只是对自己的数据进行管理。Client 端通过指定 Server 端的 ip 地址(通过域名应该也可以)。需要缓存的对象或数据是以 key->value 对的形式保存在Server端。key 的值通过 hash 进行转换,根据 hash 值把 value 传递到对应的具体的某个 Server 上。当需要获取对象数据时,也根据 key 进行。首先对 key 进行 hash,通过获得的值可以确定它被保存在了哪台 Server 上,然后再向该 Server 发出请求。Client 端只需要知道保存 hash(key) 的值在哪台服务器上就可以了。

其实说到底,memcache 的工作就是在专门的机器的内存里维护一张巨大的 hash 表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率(当然花钱就是必不可免的事了,听说 MySpace 的每台 Cache 服务器都配备了至少 64G 的内存)。但是也要注意 memcache 不是万能的,他的速度还是要比本地的文件读取慢很多,如果不是很大的应用,我建议大家使用一些轻量级的 Cache 库,比如 PHP 的 Cache_Lite 就不错,最后希望大家读完这篇能有所收获 :)

0 0