返回列表 发帖

memcache.redundancy的应用

这篇文章旨在用一个php实例来说明php memcache扩展3.0版本新增的memcache.redundancy指令的功能。memcache.redundancy可以将数据同时写入多个memcached。

注意:本文的实现环境:memcached 2.2.6 + php memcache 3.0.6,版本过低则会导致无法实现。

关于session数据的存储请参考之前写过《使用memcached集群存储php session》一文。

  1. <?php
  2. ini_set('memcache.redundancy', 3);

  3. $link = new Memcache();
  4. $link -> addserver('localhost', 11211);
  5. $link -> addserver('localhost', 11212);
  6. $link -> addserver('localhost', 11213);

  7. $link -> set('key1', 'string1', false, 3600);
  8. $link -> set('key2', 'string2', false, 3600);
  9. $link -> set('key3', 'string3', false, 3600);

  10. $link -> close();
复制代码

使用memcached-tool查看memcached中的内容,发现3个key都被插入到memcached中了,时间戳也是一样的。
  1. # for i in 1 2 3;do memcached-tool localhost:1121$i dump;done
  2. -----------------------------------------
  3. Dumping memcache contents
  4.   Number of buckets: 1
  5.   Number of items  : 3
  6. Dumping bucket 1 - 3 total items
  7. add key2 0 1326962381 7
  8. string2
  9. add key1 0 1326962381 7
  10. string1
  11. add key3 0 1326962381 7
  12. string3
  13. -----------------------------------------
  14. Dumping memcache contents
  15.   Number of buckets: 1
  16.   Number of items  : 3
  17. Dumping bucket 1 - 3 total items
  18. add key2 0 1326962381 7
  19. string2
  20. add key1 0 1326962381 7
  21. string1
  22. add key3 0 1326962381 7
  23. string3
  24. -----------------------------------------
  25. Dumping memcache contents
  26.   Number of buckets: 1
  27.   Number of items  : 3
  28. Dumping bucket 1 - 3 total items
  29. add key2 0 1326962381 7
  30. string2
  31. add key1 0 1326962381 7
  32. string1
  33. add key3 0 1326962381 7
  34. string3
复制代码

memcached-tool是一个perl脚本,编译安装的memcached没有这一脚本。
  1. #!/usr/bin/perl
  2. #
  3. # memcached-tool:
  4. #   stats/management tool for memcached.
  5. #
  6. # Author:
  7. #   Brad Fitzpatrick <brad@danga.com>
  8. #
  9. # License:
  10. #   public domain.  I give up all rights to this
  11. #   tool.  modify and copy at will.
  12. #

  13. use strict;
  14. use IO::Socket::INET;

  15. my $host = shift;
  16. my $mode = shift || "display";
  17. my ($from, $to);

  18. if ($mode eq "display") {
  19.     undef $mode if @ARGV;
  20. } elsif ($mode eq "move") {
  21.     $from = shift;
  22.     $to = shift;
  23.     undef $mode if $from < 6 || $from > 17;
  24.     undef $mode if $to   < 6 || $to   > 17;
  25.     print STDERR "ERROR: parameters out of range\n\n" unless $mode;
  26. } elsif ($mode eq 'dump') {
  27.     ;
  28. } elsif ($mode eq 'stats') {
  29.     ;
  30. } else {
  31.     undef $mode;
  32. }

  33. undef $mode if @ARGV;

  34. die
  35.     "Usage: memcached-tool <host[:port]> [mode]\n
  36.        memcached-tool 10.0.0.5:11211 display    # shows slabs
  37.        memcached-tool 10.0.0.5:11211            # same.  (default is display)
  38.        memcached-tool 10.0.0.5:11211 stats      # shows general stats
  39.        memcached-tool 10.0.0.5:11211 dump       # dumps keys and values
  40. " unless $host && $mode;

  41. $host .= ":11211" unless $host =~ /:\d+/;

  42. my $sock = IO::Socket::INET->new(PeerAddr => $host,
  43.                                  Proto    => 'tcp');
  44. die "Couldn't connect to $host\n" unless $sock;

  45. if ($mode eq 'dump') {
  46.     my %items;
  47.     my $totalitems;

  48.     print $sock "stats items\r\n";

  49.     while (<$sock>) {
  50.         last if /^END/;
  51.         if (/^STAT items:(\d*):number (\d*)/) {
  52.             $items{$1} = $2;
  53.             $totalitems += $2;
  54.         }
  55.     }
  56.     print STDERR "Dumping memcache contents\n";
  57.     print STDERR "  Number of buckets: " . scalar(keys(%items)) . "\n";
  58.     print STDERR "  Number of items  : $totalitems\n";

  59.     foreach my $bucket (sort(keys(%items))) {
  60.         print STDERR "Dumping bucket $bucket - " . $items{$bucket} . " total items\n";
  61.         print $sock "stats cachedump $bucket $items{$bucket}\r\n";
  62.         my %keyexp;
  63.         while (<$sock>) {
  64.             last if /^END/;
  65.             # return format looks like this
  66.             # ITEM foo [6 b; 1176415152 s]
  67.             if (/^ITEM (\S+) \[.* (\d+) s\]/) {
  68.                 $keyexp{$1} = $2;
  69.             }
  70.         }

  71.         foreach my $k (keys(%keyexp)) {
  72.             print $sock "get $k\r\n";
  73.             my $response = <$sock>;
  74.             if ($response =~ /VALUE (\S+) (\d+) (\d+)/) {
  75.                 my $flags = $2;
  76.                 my $len = $3;
  77.                 my $val;
  78.                 read $sock, $val, $len;
  79.                 print "add $k $flags $keyexp{$k} $len\r\n$val\r\n";
  80.                 # get the END
  81.                 $_ = <$sock>;
  82.                 $_ = <$sock>;
  83.             }
  84.         }
  85.     }
  86.     exit;
  87. }

  88. if ($mode eq 'stats') {
  89.     my %items;

  90.     print $sock "stats\r\n";

  91.     while (<$sock>) {
  92.         last if /^END/;
  93.         chomp;
  94.         if (/^STAT\s+(\S*)\s+(.*)/) {
  95.             $items{$1} = $2;
  96.         }
  97.     }
  98.     printf ("#%-17s %5s %11s\n", $host, "Field", "Value");
  99.     foreach my $name (sort(keys(%items))) {
  100.         printf ("%24s %12s\n", $name, $items{$name});

  101.     }
  102.     exit;
  103. }

  104. # display mode:

  105. my %items;  # class -> { number, age, chunk_size, chunks_per_page,
  106. #            total_pages, total_chunks, used_chunks,
  107. #            free_chunks, free_chunks_end }

  108. print $sock "stats items\r\n";
  109. while (<$sock>) {
  110.     last if /^END/;
  111.     if (/^STAT items:(\d+):(\w+) (\d+)/) {
  112.         $items{$1}{$2} = $3;
  113.     }
  114. }

  115. print $sock "stats slabs\r\n";
  116. while (<$sock>) {
  117.     last if /^END/;
  118.     if (/^STAT (\d+):(\w+) (\d+)/) {
  119.         $items{$1}{$2} = $3;
  120.     }
  121. }

  122. print "  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM\n";
  123. foreach my $n (1..40) {
  124.     my $it = $items{$n};
  125.     next if (0 == $it->{total_pages});
  126.     my $size = $it->{chunk_size} < 1024 ?
  127.         "$it->{chunk_size}B" :
  128.         sprintf("%.1fK", $it->{chunk_size} / 1024.0);
  129.     my $full = $it->{free_chunks_end} == 0 ? "yes" : " no";
  130.     printf("%3d %8s %9ds %7d %7d %7s %8d %8d %4d\n",
  131.            $n, $size, $it->{age}, $it->{total_pages},
  132.            $it->{number}, $full, $it->{evicted},
  133.            $it->{evicted_time}, $it->{outofmemory});
  134. }
复制代码

TOP

返回列表