缓存应用:Memcached分布式缓存

日期: 2011-01-17 作者:情缘 来源:TechTarget中国 英文

  Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。

  相信很多人都用过缓存,在.net中也有内置的缓存机制,还有很多第三方工具如apache,nginx等可以做静态资源的缓存,同时我们也可以制定自己的缓存机制,缓存数据库查询的数据以减少对数据库的频繁操作。但是很多时候我们总是感觉这些缓存总不尽人意, Memcached可以解决你不少的烦恼问题。最少在我的学习中解决了不少问题,所以决定记录下来分享。

  Memcached基于一个存储键/值对的hashmap。其守护进程是用C写的,但是客户端可以用任何语言来编写(本文使用C#作为例子),并通过memcached协议与守护进程通信。可能这些东西都太高深了,我们暂不做研究。 

  分布式缓存

  其实Memcached作为一个分布式缓存数据服务,但是每个服务之间根本没有进行相互通信,这里可能与我理解的分布式有点区别,可能是我才疏学浅,也可能是每个人思考问题的角度不同。Memcached 客户端就是通过一种分布式算法将数据保存到不同的Memcached服务器上,将数据进行缓存。分布式缓存,可以而知memcached可以进行大数据量的缓存。这点可以弥补我们之前很多人都遇到的将数据缓存到应用服务器上,而且只能缓存少量数据,否则对应用服务器的影响非常大。

Memcached应用机制图

Memcached应用机制图

  这个图是有点简陋了,但是问题还是能够描述的清楚的,缓存机制的基本原理就是先查询数据保存到memcached中,地址在此请求就直接从Memcached缓存中取数据,这样就可以减少对服务器请求压力。

  Memcached特征

  (1)协议简单:不使用复杂的xml格式,而是使用文本格式

  (2)基于libevent的事件处理机制 (不懂)

  (3)内置内存存储方式: 数据存在在内存中,所以重启机器会导致数据丢失

  (4)Memcached相互不通信的分布式: Memcached 服务器之间不会进行通信,数据都是通过客户端的分布式算法存储到各个服务器中

  Memcached的安装

  首先这里是在windows系统上做测试,Memcached在linux等非windows平台上性能会更高。

  下载Memcached 服务端: http://memcached.org/ (官网寻找适用的版本)

  1 解压缩文件到D:Program FilesMemcached

  2 命令行输入 D:Program FilesMemcachedmemcached.exe -d install

  3 命令行输入 D:Program FilesMemcachedmemcachedmemcached.exe -d start,该命令启动 Memcached ,默认监听端口为 11211

   当然我们可以在windows 服务中查看到此服务:

  .NET 平台下使用Memcached

  因为个人首先接触的客户端是memcacheddotnet ,所以习惯了适用这个核心库作为客户端。下载的工作都非常简单,因为客户端都帮我们实现了分布式程序算法,我们关心的只要怎样去存在获取这些数据。下面简单介绍一下:

以下是引用片段:
 1 static void Main(string[] args)
 2         {
 3             SockIOPool pool = SockIOPool.GetInstance();
 4             string[] servers = { “127.0.0.1:11211” };
 5             pool.SetServers(servers);
 6             pool.MinConnections = 3;
 7             pool.MaxConnections = 5;
 8             pool.InitConnections = 3;
 9             pool.SocketConnectTimeout = 5000;
10             pool.Initialize();
11 
12             MemcachedClient client = new MemcachedClient();
13             client.EnableCompression = false;
14             Console.WriteLine(“———————–Memcached Set 设置值————————–“);
15             client.Set(“key1″,”value1”);
16             Console.WriteLine(client.Get(“key1”));
17             Console.WriteLine(“———————–Memcached Add 设置值————————–“);
18             client.Add(“key2″,”value2”);
19             Console.WriteLine(client.Get(“key2”));
20             client.Set(“key2″,”value1 value2”);
21             Console.WriteLine(client.Get(“key2”));
22             Console.WriteLine(“———————–Memcached Replace 设置值————————–“);
23             client.Replace(“key2”, “value3”);
24             Console.WriteLine(client.Get(“key2”));
25 
26             Console.WriteLine(“———————–Memcached 键值是否存在————————–“);
27             if (client.KeyExists(“key2”))
28             {
29                 Console.WriteLine(“键key2 存在”);
30             }
31             if (client.KeyExists(“hechen”)==false)
32             {
33                 Console.WriteLine(“键hechen 不存在”);
34             }
35 
36             Console.WriteLine(“———————–Memcached 删除数据————————–“);
37             client.Add(“key4″,”value4”);
38             Console.WriteLine(“key4==>” + client.Get(“key4”));
39             client.Delete(“key4”);
40             if (!client.KeyExists(“key4”))
41             {
42                 Console.WriteLine(“key4 已将删除”);
43             }
44 
45             Console.WriteLine(“———————–Memcached 数据过期————————–“);
46             client.Add(“key5″,”value5”,DateTime.Now.AddMilliseconds(5000));
47             Console.WriteLine(client.Get(“key5”));
48             System.Threading.Thread.Sleep(6000);
49             Console.WriteLine(“过期: “+ client.Get(“key5”));
50         }

  上面的例子虽然简单,包括一些基本的用法,在一般使用Memcached缓存数据的时候都用得到。

  Memcached初始化数据

以下是引用片段:
1 SockIOPool pool = SockIOPool.GetInstance();
2 string[] servers = { “127.0.0.1:11211” };
3 pool.SetServers(servers);
4 pool.MinConnections = 3;
5 pool.MaxConnections = 5;
6 pool.InitConnections = 3;
7 pool.SocketConnectTimeout = 5000;
8 pool.Initialize();

 
  SockIOPool 用于初始化分布式缓存池的对象,上面设置了多种属性,我相信这些属性的意思大家都懂。这里要注意的是Initialize () ,只有调用这个方式之后,才能初始化数据。才能使用连接缓存池。

  Memcached 设置缓存值的三种方式

以下是引用片段:
 1 MemcachedClient client = new MemcachedClient();
 2 client.EnableCompression = false;
 3 Console.WriteLine(“———————–Memcached Set 设置值————————–“);
 4 client.Set(“key1″,”value1”);
 5 Console.WriteLine(client.Get(“key1”));
 6 Console.WriteLine(“———————–Memcached Add 设置值————————–“);
 7 client.Add(“key2″,”value2”);
 8 Console.WriteLine(client.Get(“key2”));
 9 client.Set(“key2″,”value1 value2”);
10 Console.WriteLine(client.Get(“key2”));
11 Console.WriteLine(“———————–Memcached Replace 设置值————————–“);
12 client.Replace(“key2”, “value3”);
13 Console.WriteLine(client.Get(“key2”));

 
  有心的可以测试一下这三个方法: Set () 如果缓存中存在相同的键值这替换原有的,Add() 只是添加数据,如果存在相同键的不再添加。 Replace() 则用于替换已有的相同的键值。

  Memcached 缓存数据过期

以下是引用片段:
1 Console.WriteLine(“———————–Memcached 数据过期————————–“);
2 client.Add(“key5″,”value5”,DateTime.Now.AddMilliseconds(5000));
3 Console.WriteLine(client.Get(“key5”));
4 System.Threading.Thread.Sleep(6000);
5  Console.WriteLine(“过期: “+ client.Get(“key5”));

  很多时候我们并不希望数据永久缓存,一般都会有一个过期时间。上面的添加缓存数据就设置了缓存时间,可以达到过期缓存的效果。

  案例下载地址 点击下载

  此篇文章到此结束,内容比较简单,而且很多都是别人写过的东西。不过为了个人的学习还是积累起来,对于缓存部分后续文章继续更新。

  Memcached分布式缓存也不是如此简单,这里记录希望对自己和各位都有一定的帮助。有意见多多拍砖头,个人不介意的。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

作者

情缘
情缘

相关推荐

  • 大数据狂想:你必须把握的未来七大趋势

    当你在百度的搜索框中输入:“如果南海爆发军事冲突,哪几只A股可从中获益?”搜索结果页将会在0.01秒内返回一串股票代码。

  • 电信业必须解决三个SOA实施挑战

    SOA的鼓励组件化软件,标准化接口等概念受到IT界相当受欢迎。但SOA在电信领域正在失去光泽,是什么使它暗淡了呢?

  • David Linthicum谈SOA和云计算

    当我们发现了熟悉的导向点的时候,软件技术的激流就更容易驾驭了。这一点也适用于面性服务架构的观点,它就像面向对象计算的升级一样,但是前提是基于Web服务。

  • Odata的黄金时间(下)

    官方OData已经有一年了。在这一年里,我们我看到用户的惊人增长,人们继续寻找更好的扩展器API的方法和处理客户端生态系统的多样性。