日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php redis 读写分离类,yii实现redis读写分离

發布時間:2023/12/19 php 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php redis 读写分离类,yii实现redis读写分离 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

/**

* FileName:RedisCluster

* 配置說明

* 配置為1主多從 或者 1個獨立的服務器

* 寫往主的里面寫

* 讀是從從的里面讀

* 'class'=>'RedisCache',

* 'servers'=>array(

* array(

* 'host'=>'IP1',

* 'port'=>'6380',

* 'master'=>true //主機

* ),

* array(

* 'host'=>'IP2',

* 'port'=>'6381'

* )

*

* 單獨

* 'class'=>'RedisCache',

* 'servers'=>array(

* array(

* 'host'=>'IP1',

* 'port'=>'6380',

* ),

* @author zhonghailin

* @version v1.0

* @since v1.0

* @Date 2015-3-10 下午4:57:02

*/

class ERedisCache extends CCache{

// 是否使用 M/S 的讀寫集群方案

private $_isUseCluster = false;

// Slave 句柄標記

private $_sn = 0;

// 服務器連接句柄

private $_linkHandle = array(

'master'=>null,// 只支持一臺 Master

'slave'=>array(),// 可以有多臺 Slave

);

//配置文件

private $_servers=array();

/**

* 構造函數

*

* @param boolean $isUseCluster 是否采用 M/S 方案

*/

/*

* 初始化

*/

public function init()

{

$this->keyPrefix = "";

parent::init();

if(is_array($this->_servers)){

foreach($this->_servers as $servers){

if($servers->master){

$this->_isUseCluster = true;//如果設置了主服務器那么就是1主多從

$this->connect($servers,true);

}else{

$this->connect($servers);

}

}

}

}

/**

* @return array list of memcache server configurations. Each element is a {@link CMemCacheServerConfiguration}.

*/

public function getServers()

{

return $this->_servers;

}

/**

* @param array $config list of memcache server configurations. Each element must be an array

* with the following keys: host, port, persistent, weight, timeout, retryInterval, status.

* @see http://www.php.net/manual/en/function.Memcache-addServer.php

*/

public function setServers($config)

{

foreach($config as $c)

$this->_servers[]=new CRedisServerConfiguration($c);

}

/**

* 連接服務器,注意:這里使用長連接,提高效率,但不會自動關閉

*

* @param array $config Redis服務器配置

* @param boolean $isMaster 當前添加的服務器是否為 Master 服務器

* @return boolean

*/

public function connect($config, $isMaster=false){

// default port

if(!isset($config->port)){

$config->port = 6379;

}

// 設置 Master 連接

if($isMaster){

$this->_linkHandle['master'] = new Redis();

$ret = $this->_linkHandle['master']->pconnect($config->host,$config->port);

}else{

// 多個 Slave 連接

$this->_linkHandle['slave'][$this->_sn] = new Redis();

$ret = $this->_linkHandle['slave'][$this->_sn]->pconnect($config->host,$config->port);

++$this->_sn;

}

return $ret;

}

/**

* 關閉連接

*

* @param int $flag 關閉選擇 0:關閉 Master 1:關閉 Slave 2:關閉所有

* @return boolean

*/

public function close($flag=2){

switch($flag){

// 關閉 Master

case 0:

$this->getRedis()->close();

break;

// 關閉 Slave

case 1:

for($i=0; $i_sn; ++$i){

$this->_linkHandle['slave'][$i]->close();

}

break;

// 關閉所有

case 2:

if(!empty( $this->_linkHandle['master'])){

$this->_linkHandle['master']->close();

}

for($i=0; $i_sn; ++$i){

$this->_linkHandle['slave'][$i]->close();

}

break;

}

return true;

}

/**

* 得到 Redis 原始對象可以有更多的操作

*

* @param boolean $isMaster 返回服務器的類型 true:返回Master false:返回Slave

* @param boolean $slaveOne 返回的Slave選擇 true:負載均衡隨機返回一個Slave選擇 false:返回所有的Slave選擇

* @return redis object

*/

public function getRedis($isMaster=true,$slaveOne=true){

// 只返回 Master

if($isMaster){

return $this->_linkHandle['master'];

}else{

return $slaveOne ? $this->_getSlaveRedis() : $this->_linkHandle['slave'];

}

}

/**

* 寫緩存

*

* @param string $key 組存KEY

* @param string $value 緩存值

* @param int $expire 過期時間, 0:表示無過期時間

*/

public function setValue($key, $value, $expire=0){

// 永不超時

if($expire == 0){

if($this->_isUseCluster){

$ret = $this->getRedis()->set($key, $value);

}else{

$ret = $this->getRedis(false)->set($key, $value);

}

}else{

if($this->_isUseCluster){

$ret = $this->getRedis()->setex($key, $expire, $value);

}else{

$ret = $this->getRedis(false)->setex($key, $expire, $value);

}

}

return $ret;

}

/**

* 讀緩存

*

* @param string $key 緩存KEY,支持一次取多個 $key = array('key1','key2')

* @return string || boolean 失敗返回 false, 成功返回字符串

*/

public function getValue($key){

// 是否一次取多個值

$func = is_array($key) ? 'mGet' : 'get';

// 使用了 M/S

return $this->_getSlaveRedis()->{$func}($key);

}

/**

* 條件形式設置緩存,如果 key 不存時就設置,存在時設置失敗

*

* @param string $key 緩存KEY

* @param string $value 緩存值

* @return boolean

*/

public function setnx($key, $value){

if($this->_isUseCluster){

return $this->getRedis()->setnx($key, $value);

}else{

return $this->getRedis(false)->setnx($key, $value);

}

}

/**

* 刪除緩存

*

* @param string || array $key 緩存KEY,支持單個健:"key1" 或多個健:array('key1','key2')

* @return int 刪除的健的數量

*/

public function remove($key){

if($this->_isUseCluster){

return $this->getRedis()->delete($key);

}else{

return $this->getRedis(false)->delete($key);

}

}

/* (non-PHPdoc)

* @see BaseCache::delete()

*/

public function deleteValue($key){

if($this->_isUseCluster){

return $this->getRedis()->delete($key);

}else{

return $this->getRedis(false)->delete($key);

}

}

/**

* 值加加操作,類似 ++$i ,如果 key 不存在時自動設置為 0 后進行加加操作

*

* @param string $key 緩存KEY

* @param int $default 操作時的默認值

* @return int 操作后的值

*/

public function incr($key,$default=1){

if($default == 1){

return $this->getRedis()->incr($key);

}else{

return $this->getRedis()->incrBy($key, $default);

}

}

/**

* 值減減操作,類似 --$i ,如果 key 不存在時自動設置為 0 后進行減減操作

*

* @param string $key 緩存KEY

* @param int $default 操作時的默認值

* @return int 操作后的值

*/

public function decr($key,$default=1){

if($default == 1){

return $this->getRedis()->decr($key);

}else{

return $this->getRedis()->decrBy($key, $default);

}

}

/**

* 添空當前數據庫

*

* @return boolean

*/

public function clear(){

if(!empty( $this->_linkHandle['master'])){

$this->_linkHandle['master']->flushDB();

}

for($i=0; $i_sn; ++$i){

$this->_linkHandle['slave'][$i]->flushDB();

}

return true;

}

/* =================== 以下私有方法 =================== */

/**

* 隨機 HASH 得到 Redis Slave 服務器句柄

*

* @return redis object

*/

private function _getSlaveRedis(){

// 就一臺 Slave 機直接返回

if($this->_sn <= 1){

return $this->_linkHandle['slave'][0];

}

// 隨機 Hash 得到 Slave 的句柄

$hash = $this->_hashId(mt_rand(), $this->_sn);

return $this->_linkHandle['slave'][$hash];

}

/**

* 根據ID得到 hash 后 0~m-1 之間的值

*

* @param string $id

* @param int $m

* @return int

*/

private function _hashId($id,$m=10)

{

//把字符串K轉換為 0~m-1 之間的一個值作為對應記錄的散列地址

$k = md5($id);

$l = strlen($k);

$b = bin2hex($k);

$h = 0;

for($i=0;$i$value)

$this->$key=$value;

if($this->host===null)

throw new CException(Yii::t('yii','CMemCache server configuration must have "host" value.'));

}

else

throw new CException(Yii::t('yii','CMemCache server configuration must be an array.'));

}

}

總結

以上是生活随笔為你收集整理的php redis 读写分离类,yii实现redis读写分离的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 可以免费观看的av网站 | 午夜视频a | 非洲黑人毛片 | 丁香花完整视频在线观看 | 99国产精品视频免费观看一公开 | 精品国产乱码久久久久久牛牛 | 成人做爰的视频 | 茄子视频懂你更多在线观看 | 国产激情第一页 | 国产www在线观看 | 性视频在线| 蝌蚪网在线视频 | 求个黄色网址 | 97精品在线视频 | 91啦丨九色丨刺激 | 国产乱淫av一区二区三区 | 扒开jk护士狂揉免费 | 黄色a一级视频 | 欧美日韩xxxx | 国产精品字幕 | www.超碰| 成年女人毛片 | sao虎视频在线精品永久 | 成人毛片网站 | 亚洲欧美激情精品一区二区 | 97超级碰碰人妻中文字幕 | 成年人黄色片网站 | 国产91一区二区三区在线精品 | 精品日本一区二区 | 91在线第一页 | 日韩亚洲影院 | 久久精品无码中文字幕 | 久久免费精品视频 | 国产视频精品视频 | 亚洲欧美自拍视频 | 日韩另类av | 可以免费观看av | 伊人久久青青草 | 国产3p在线播放 | 免费av不卡 | 国产欧美精品在线 | 好吊色一区二区 | 国产主播一区二区三区 | 国产在线专区 | 国产碰碰 | 色亭亭| 日本大尺度吃奶做爰视频 | 国产精品久草 | 亚洲aa在线观看 | 国语对白做受xxxxx在线中国 | 午夜精品久久久久久久99黑人 | 黄色高清无遮挡 | 亚洲欧美激情在线 | 青青草视频在线观看 | 欧美 日韩 国产 高清 | 黄色a毛片| 黄色大毛片 | 成片免费观看 | 日日夜夜精品免费视频 | 狠狠做深爱婷婷久久综合一区 | 欧美特黄一区二区三区 | 久久精品亚洲精品国产欧美 | 九色视频在线播放 | 欧美成人三级在线观看 | 爽爽视频在线观看 | 精品xxxxx| 深夜福利一区二区三区 | 一区二区日韩av | 亚洲综合久久av一区二区三区 | 国产 欧美 日韩 | 男女裸体无遮挡做爰 | 色偷偷91| 日韩欧美视频免费观看 | 国产午夜精品一区 | 肉肉h | 亚洲色图美腿丝袜 | 凸凹人妻人人澡人人添 | 国产无套粉嫩白浆内谢 | 黄色av电影在线 | 黄色草逼视频 | 黑人专干日本人xxxx | 免费日本视频 | 性爱一级视频 | 久久婷婷精品 | 亚洲怡春院 | 国产视频第一区 | 东北女人啪啪ⅹxx对白 | 久草久操 | 成人区精品一区二区婷婷 | 亚洲私人影院 | 国产一毛片 | 欧美日韩久久婷婷 | 日韩中文第一页 | 国产主播中文字幕 | 精品黑人一区二区三区观看时间 | www.奇米.com | 天天做夜夜爱 | 国产五月天婷婷 | 蜜桃臀aⅴ精品一区二区三区 |