memcache服务器一致性哈希算法 & 设置过期时间

直接上代码

配置文件memcache_cfg.php

这里我只开启是三个port

<?php
$memcache_config = array(
    'mem_server000' => array(
        'host' => '127.0.0.1',
        'port' => 11211
    ),
    'mem_server121' => array(
        'host' => '127.0.0.1',
        'port' => 11212
    ),
    'mem_server121' => array(
        'host' => '127.0.0.1',
        'port' => 11213
    )
);

运行文件 index.php

<?php
@header("content-Type: text/html; charset=utf-8");
	
require_once('./memcache_cfg.php');
class Mem_Host{
	private $host_ser = [];
	private $_m_server = [];
	private $memcache_config ;
	// private $mem = new class{};


	function __construct($memcache_config) {
		$this ->memcache_config =  $memcache_config;
		$this->mem = new Memcache;
		// 增加 服务器虚拟点
		$this->host_ser = array_keys($memcache_config);
		$this->_m_server = [];
		foreach ($this->host_ser as $key => $value) {
			
			for ($i=0; $i < 5 ; $i++) { 
				$this->_m_server[sprintf("%u", crc32($value.$i))] = $value;
			}
			
		}
		// 排序点 让他们分布开(错开)
		ksort($this->_m_server);
		$this->mem->_node = $this->_m_server;
	}
	
	// // 添加 相应的内容到对应的 memcache服务器
	public function add_node_mem($key_node , $val_node){
		// 获取当前key 值得位置
		$key_mem_node = sprintf("%u" , crc32($key_node));
		$val_mem_val = $val_node;

		// var_dump($mem->_node);die;
		$keys = array_keys($this->mem->_node);
		// 判断 存放位置 默认存放0号位
		$default_key  = $keys[0]; 

		foreach ($keys as $key => $val){
			if($key_mem_node < $val){
				$default_key = $val ;
				break;
			}
		}

		$this->mem ->connect($this->memcache_config[$this->mem->_node[$default_key]]['host'], $this->memcache_config[$this->mem->_node[$default_key]]['port']);
		// 设置过期时间 添加键/更新键
		$this->mem ->set ($default_key , $val_mem_val,0,10);
		$this->mem->close();
		// echo '当前的服务器是 host:'.$this->memcache_config[$this->mem->_node[$default_key]]['host'] .', 当前的端口是 port:' .$this->memcache_config[$this->mem->_node[$default_key]]['port'] ;
	}
	// print_r($mem->_node);
	public function get_node_mem($key_node){
		$key_mem_node = sprintf("%u" , crc32($key_node));
		$keys = array_keys($this->mem->_node);
		// 判断 存放位置
		$default_key  = $keys[0]; 

		foreach ($keys as $key => $val){
			if($key_mem_node < $val){
				$default_key = $val ;
				break;
			}
		}
		$this->mem ->connect($this->memcache_config[$this->mem->_node[$default_key]]['host'], $this->memcache_config[$this->mem->_node[$default_key]]['port']);
		$res = $this->mem ->get ($default_key);
		$this->mem->close();
		return $res;
	}



}
$Mem = new Mem_Host($memcache_config);
// $Mem ->add_node_mem('name' , 'lily');
// $Mem ->add_node_mem('name232' , 'lily');
// $Mem ->add_node_mem('name1212' , 'lily');

 echo $Mem ->get_node_mem('name232');


    
?>

以上就是我自己手写的一个demo ,希望大佬给点建议 ,初学memcached 对其不是特别了解!
谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值