Chinaunix首页 | 论坛 | 博客
  • 博客访问: 924582
  • 博文数量: 245
  • 博客积分: 11429
  • 博客等级: 上将
  • 技术积分: 2662
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-15 00:16
文章存档

2011年(56)

2010年(174)

2009年(15)

分类: LINUX

2011-07-20 15:00:35

  1. 对于目前来说,使用memcache 前端缓存的公司越来越多,那么memcache的优点在哪呢?
  2. 其实memecached是高性能的分布式内存缓存服务器,一般使用的目的是,通过缓存数据库查询的结果(得第二次访问才能有效),减少数据库访问次数,提高动态web应用的速度,提高可扩展行。
  3.      memcached 作为告诉运行的分布式缓存服务器,有以下优点。
  4.          协议简单
  5.          基于libevent的事件处理
  6.          内置内存缓存方式
  7.          memcached不互相通信的分布式
  8. 关于libevent事件处理可以访问:http://www.monkey.org/~provos/libevent/
  9. memcached 内置的内存储存方式,由于存储在内存中,重启memcached,操作系统都会导致数据丢失。还有就是当内容达到指定值后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。
  10.      链接memcached客户端,目前以php,perl为主。
  11. 1.那就先介绍下perl的链接方式
  12.  Perl 的memcached客户端有
  13.      Cache::Memcached
  14.      Cache::Memcached::Fast
  15.      Cache::Memcached::libmemcached
  16. 等几个CPAN模块。这里介绍的Cache::Memcached是memcached的作者Brad Fitzpatric的作品,应
  17. 该算是memcached的客户端中应用最为广泛的模块了,就是根据服务器太熟的余数进行分散,求得键的证书哈希值,在除以服务器台数,根据余数来选择服务器。其计算方法简单,数据的分散性也相对优秀,但是其缺点是,当添加或移除服务器时,缓存重组的代价相当巨大,添加服务器后,余数就会产生巨变,这样就无法获取与保存时间相同的服务器,从而影响缓存的命中率,那就就导致无法添加服务器。
  18.       为了解决这个问题,又有了新的分布式方法,现在可以轻易的添加了,这种方法称为Consistent Hashing。
  19.        首先求出memcached服务器(节点)的哈希值,并将其配置到0~2(32次方)的园上。然后同样的方法求出存储数据的键的哈希值,并映射到园上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上,如果超过范围仍招不到服务器,就会保存到第一台memcached服务器上。
  20.        由于Cache::Memcached不支持Consisitent Hashing,但以后几个客户端函数库支持。第一个支持的是名为libketama的php库,有last.fm开发。
  21.         Cache::Memcached::Fast 重新实现了libketama,在创建对象时就可以指定ketama_points选项。
  22.         my $memcached = Cache::Memcached::Fast>new({
  23.                         servers => ["192.168.0.1:11211","192.168.0.2:11211"],
  24.                         ketama_points => 150
  25.         });
  26. 2.Cache::Memcached的情况下,与memcached的连接(文件句柄)保存在Cache::Memcached包内的
  27. 类变量中。在mod_perl和FastCGI等环境下,包内的变量不会像CGI那样随时重新启动,而是在进
  28. 程中一直保持。其结果就是不会断开与memcached的连接,减少了TCP连接建立时的开销,同时
  29. 也能防止短时间内反复进行TCP连接、断开而导致的TCP端口资源枯竭。
  30. 但是,Cache::Memcached::Fast没有这个功能,所以需要在模块之外将Cache::Memcached::Fast对象
  31. 保持在类变量中,以保证持久连接。

  32. package Gihyo::Memcached;
  33. use strict;
  34. use warnings;
  35. use Cache::Memcached::Fast;
  36. my @server_list = qw/192.168.1.1:11211 192.168.1.1:11211/;
  37. my $fast; ## 用于保持对象
  38. sub new {
  39.     my $self = bless {}, shift;
  40.     if ( !$fast ) {
  41.         $fast = Cache::Memcached::Fast>new({ servers => \@server_list });
  42.     }
  43.     $self>{_fast} = $fast;
  44.     return $self;
  45. }
  46. sub get {
  47.    my $self = shift;
  48.    $self>{_fast}>get(@_);
  49. }
  50. 上面的例子中,Cache::Memcached::Fast对象保存到类变量$fast中。
  51. 3.Cache::Memcached拥有rehash功能,即在无法
  52. 连接保存数据的服务器的情况下,会再次计算hash值,连接其他的服务器。
  53. 但是,Cache::Memcached::Fast没有这个功能。不过,它能够在连接服务器失败时,短时间内不再
  54. 连接该服务器的功能。
  55. my $fast = Cache::Memcached::Fast>new({
  56.     max_failures => 3,
  57.     failure_timeout => 1
  58. });
  59. 在failure_timeout秒内发生max_failures以上次连接失败,就不再连接该memcached服务器。我们
  60. 的设置是1秒钟3次以上。
  61. 此外,mixi还为所有用户共享的缓存数据的键名设置命名规则,符合命名规则的数据会自动保存到
  62. 多台memcached服务器中,取得时从中仅选取一台服务器。创建该函数库后,就可以使memcached
  63. 服务器故障不再产生其他影响。
  64. 例子: 测试memcached 处理形式
  65. #!/usr/bin/perl -w
  66. use strict;
  67. use warnings;
  68. use Cache::Memcached;

  69. my $key = "foo";
  70. my $value = "bar";
  71. my $times = 3600;
  72. my $memcached = Cache::Memcached->new({
  73.         servers => ["127.0.0.1:11211"],
  74.         compress_threshold =>10_000

  75. });
  76. $memcached->add($key,$value,$times);
  77. my $ret = $memcached->get($key);
  78. print "$ret \n";

  79. 2.测试存储效果
  80.  perl]# cat mem1.pl
  81. #!/usr/bin/perl -w
  82. use Cache::Memcached;
  83. my $memd = new Cache::Memcached{
  84.    'servers'=>["127.0.0.1:11211"]
  85. };
  86. my $val = $memd->get("my_key");
  87. if($val){
  88.    print "Value is $val\n";
  89. }
  90. $memd->set("my_key","fei");
  91. $memd->disconnect_all();

  92. 测试
  93.  perl mem1.pl
  94. 结果:
  95. <30 new auto-negotiating client connection
  96. 30: Client using the ascii protocol
  97. <30 get my_key
  98. >30 sending key my_key 0 3
  99. fei

  100. >30 END
  101. Value is fei
  102. <30 set my_key 0 0 3
  103. >30 STORED
  104. <30 connection closed.
  105. 第一次没有输出,第二次输出。
阅读(1760) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~