您的位置:首页 > 数据库 > Memcache

基于memcache的分布式缓存操作

2016-08-05 14:25 330 查看
memache的分布式是在客户端实现的,memcache集群直接使用addServer就可以实现

测试:

两台memcache服务器192.168.20.193和192.168.20.194

192.168.20.193

cache_set.php

<?php
$mem = new Memcache();
$mem->addServer('192.168.20.193', 11211);
$mem->set("193_key", "这个值在194添加前添加的");
$mem->addServer('192.168.20.194', 11211);
if (!$mem) echo "Connection to memd failed";

$mem->set("str_key", "String to store in memd");
$mem->set("num_key", 123);

$object = new StdClass;
$object->attribute = 'test';
$mem->set("obj_key", $object);

$array = Array('assoc'=>123, 345, 567);
$mem->set("arr_key", $array);

print_r($mem->get('193_key'));
echo '<br/>';
print_r($mem->get('str_key'));
echo '<br/>';
print_r($mem->get('num_key'));
echo '<br/>';
print_r($mem->get('obj_key'));
echo '<br/>';
print_r($mem->get('arr_key'));


执行


现在停掉其中一台memcache服务如把193的memcached进程停了

[root@web_slave3 ~]# ps -ef | grep 11211
root      1492     1  0 11:45 ?        00:00:00 memcached -d -p 11211 -u root -m 64 -c 1024 -P /var/run/memcached/memcached.pid
root      1500  1463  0 11:45 pts/0    00:00:00 grep 11211
[root@web_slave3 ~]# service memcached stop
Stopping memcached:                                        [  OK  ]


192.168.20.194上访问

cache_get.php

<?php
$mem = new Memcache();
$mem->addServer('192.168.20.193', 11211);
$mem->addServer('192.168.20.194', 11211);
if (!$mem) echo "Connection to memd failed";

print_r($mem->get('193_key'));
echo '<br/>';
print_r($mem->get('str_key'));
echo '<br/>';
print_r($mem->get('num_key'));
echo '<br/>';
print_r($mem->get('obj_key'));
echo '<br/>';
print_r($mem->get('arr_key'));
echo '<br/>';
//echo '<pre>';
print_r($memStats = $mem->getExtendedStats());exit;




192.168.20.193上访问

cache_get.php



发现停掉一台memcache服务器后,很多缓存数据丢失了,

为什么会出现这个问题?主要是hash(key)%N中的N(服务器节点)发生了变化

具体:

假如现在有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 N 个 cache ;

hash(object)%N ,一切都运行正常,再考虑如下的两种情况;

1 一个 cache 服务器 m down 掉了(在实际应用中必须要考虑这种情况),这样所有映射到 cache m 的对象都会失效,怎么办,需要把 cache m 从 cache 中移除,这时候 cache 是 N-1 台,映射公式变成了 hash(object)%(N-1) ;

2 由于访问加重,需要添加 cache ,这时候 cache 是 N+1 台,映射公式变成了 hash(object)%(N+1) ;

1 和 2 意味着什么?这意味着突然之间几乎所有的 cache 都失效了。对于服务器而言,这是一场灾难,洪水般的访问都会直接冲向后台服务器;

再来考虑第三个问题,由于硬件能力越来越强,你可能想让后面添加的节点多做点活,显然上面的 hash 算法也做不到。

有什么方法可以改变这个状况呢,这就是memache的一致性hash算法:consistent hashing,怎么操作

参考我另外的博文:http://blog.csdn.net/nuli888/article/details/52128606
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: