说明
memcache是一个多线程缓存服务器,通常用作缓存、存储session等非重要信息的存储
php有memcache、memcached两个扩展,memcached支持CAS
启动
|
|
访问
|
|
命令
基本命令
stats 查看所有memcache服务器运行状态信息
add 添加一个条目到服务器
set 替换一个已经存在的数据,如果数据不存在则和add命令相同
get 从服务器获取指定数据
delete 删除单条数据,如要清楚所有数据,可使用flush
stats items 获取所有数据,可看到flag号
stats cachedump 3 0 返回指定的key 这里3表示flag号,0显示所有数据,如果是1表示显示1条
* add/set <key> <flag> <ttl> <数据长度>
PHP中命令使用
|
|
数据
使用LRU算法淘汰数据(近期最少使用算法)
当使用内存超过最大可用内存时,memcached会启用LRU算法淘汰旧数据
默认限制存储数据不能超过1M
分布式
通过addServer()方法添加memcache服务器,memcache自动实现分布式
目前分布式有2种哈希策略
- 哈希
memcache默认使用的哈希策略
缺点是容错性和扩容性不好,一旦集群数量改变,缓存会大量失效,造成“雪崩” 一致性哈希 资料 资料2
一致性哈希的好处是当集群中机器数量发生变化时,减少缓存失效范围,防止“雪崩”。php的memcache扩展在2.20版本后可通过配置memcache.hash_strategy=consistent
支持一致性哈希,免去手动代码编写 资料一致性哈希PHP手动实现
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115/*** 一致性哈希查找*/class ConsistentHash{//服务器列表private $serverList = array();//服务器列表是否已排序private $isSorted = false;/*** 添加服务器* @param String $server 服务器IP*/public function addServer($server){$server = trim($server);$serverHash = $this->hash($server);if(!in_array($server,$this->serverList)){$this->serverList[$serverHash] = $server;$this->isSorted = false;return true;}else{return false;}}/*** 移除服务器* @param String $server 服务器IP* @return Boolean*/public function removeServer($server){$server = trim($server);$serverHash = $this->hash($server);foreach($this->serverList as $k=>$v){if($v==$server){unset($this->serverList[$k]);$this->isSorted = false;return true;}}return false;}/*** 查找key所在服务器* @param String $key key字符串* @return String/Boolean 服务器IP*/public function lookup($key){$keyHash = $this->hash($key);if(count($this->serverList)==0){return false;}if($this->isSorted == false){$this->sort();}foreach($this->serverList as $k=>$v){if($keyHash>$k){return $v;}}//无匹配返回key最大的服务器return $this->serverList[0];}/*** hash算法* @param String $key key字符串* @return String 哈希值*/public function hash($key){return crc32($key);}/*** 排序*/public function sort(){krsort($this->serverList,SORT_NUMERIC);$this->isSorted = true;}/*** 获取服务器列表* @return Array 服务器列表*/public function getServerList(){return $this->serverList;}}$strategy = new ConsistentHash();$strategy->addServer('192.1.1.1');$strategy->addServer('192.1.1.2');$strategy->addServer('192.1.1.3');$strategy->addServer('192.1.1.4');$strategy->removeServer('192.1.1.2');echo $strategy->lookup(1).PHP_EOL;echo $strategy->lookup(2).PHP_EOL;echo $strategy->lookup(3).PHP_EOL;echo $strategy->lookup(4).PHP_EOL;echo $strategy->lookup(5).PHP_EOL;echo $strategy->lookup(7).PHP_EOL;echo $strategy->lookup(8).PHP_EOL;echo $strategy->lookup(9).PHP_EOL;var_dump($strategy->getServerList());exit;
安全防护
1.内网访问
启动时通过-l指定特定可访问ip
memcached -l 192.158.0.10 -m ...
2.设置防火墙
iptables -F
iptables -P INPUT DROP
iptables -A INPUT -p tcp -s 192.158.0.10 -dport 11211 -j ACCEPT
iptables -A INPUT -p udp -s 172.158.0.10 -dport 11211 -j ACCEPT