基于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
执行
现在停掉其中一台memcache服务如把193的memcached进程停了
192.168.20.194上访问
cache_get.php
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
测试:
两台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
相关文章推荐
- 基于 libmemcahce 的memcache 操作
- 基于Visual C++6.0工具下的声音文件操作1
- 基于JMS的数据交换既数据互操作平台的解决方案
- 图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)
- 通过memcache动态运行库操作memcached服务,进行CURD
- Python基于列表list实现的CRUD操作功能示例
- Webservice_09_Stax的基本操作(基于光标,基于迭代模型和过滤器)
- php操作memcache的步骤
- 基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作
- 基于PyQt5的数据库可视化操作界面
- 在telnet下操作memcache详解(操作命令详解)
- 基于ip san的iscsi操作执行过程
- 字符串的基本操作--基于堆分配存储
- 如何对memcache的数据(key-value)进行遍历操作
- [原创]实现基于Memcache存储的Session类
- php 操作 Memcache
- 基于服务发现的操作日志服务 foruo-sc-log
- 解决java和.NET互相操作memcache差异问题
- 面向对象的方法操作memcache 面向过程编程
- 扩展:基于Python操作ElasticSearch