国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

PHP實現操作redis的封裝類完整實例

2024-04-25 20:43:22
字體:
來源:轉載
供稿:網友

本文實例講述了PHP實現操作redis的封裝類。分享給大家供大家參考,具體如下:

<?php

/**

* Redis 操作,支持 Master/Slave 的負載集群

*

* @author jackluo

*/

class RedisCluster{

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

private $_isUseCluster = false;

// Slave 句柄標記

private $_sn = 0;

// 服務器連接句柄

private $_linkHandle = array(

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

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

);

/**

* 構造函數

*

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

*/

public function __construct($isUseCluster=false){

$this->_isUseCluster = $isUseCluster;

}

/**

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

*

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

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

* @return boolean

*/

public function connect($config=array('host'=>'127.0.0.1','port'=>6379), $isMaster=true){

// 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<$this->_sn; ++$i){

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

}

break;

// 關閉所有

case 1:

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

for($i=0; $i<$this->_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 set($key, $value, $expire=0){

// 永不超時

if($expire == 0){

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

}else{

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

return $ret;

}

/**

* 讀緩存

*

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

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

*/

public function get($key){

// 是否一次取多個值

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

// 沒有使用M/S

if(! $this->_isUseCluster){

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

}

// 使用了 M/S

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

}

/*

// magic function

public function __call($name,$arguments){

return call_user_func($name,$arguments);

}

*/

/**

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

*

* @param string $key 緩存KEY

* @param string $value 緩存值

* @return boolean

*/

public function setnx($key, $value){

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

}

/**

* 刪除緩存

*

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

* @return int 刪除的健的數量

*/

public function remove($key){

// $key => "key1" || array('key1','key2')

return $this->getRedis()->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(){

return $this->getRedis()->flushDB();

}

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

/**

* 隨機 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<$l;$i++)

{

//相加模式HASH

$h += substr($b,$i*2,2);

}

$hash = ($h*1)%$m;

return $hash;

}

/**

* lpush

*/

public function lpush($key,$value){

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

}

/**

* add lpop

*/

public function lpop($key){

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

}

/**

* lrange

*/

public function lrange($key,$start,$end){

return $this->getRedis()->lrange($key,$start,$end);

}

/**

* set hash opeation

*/

public function hset($name,$key,$value){

if(is_array($value)){

return $this->getRedis()->hset($name,$key,serialize($value));

}

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

}

/**

* get hash opeation

*/

public function hget($name,$key = null,$serialize=true){

if($key){

$row = $this->getRedis()->hget($name,$key);

if($row && $serialize){

unserialize($row);

}

return $row;

}

return $this->getRedis()->hgetAll($name);


}

/**

* delete hash opeation

*/

public function hdel($name,$key = null){


if($key){

return $this->getRedis()->hdel($name,$key);

}

return $this->getRedis()->hdel($name);

}

/**

* Transaction start

*/

public function multi(){

return $this->getRedis()->multi();

}

/**

* Transaction send

*/

public function exec(){

return $this->getRedis()->exec();

}

}// End Class

// ================= TEST DEMO =================

// 只有一臺 Redis 的應用

$redis = new RedisCluster();

$redis->connect(array('host'=>'127.0.0.1','port'=>6379));

//*

$cron_id = 10001;

$CRON_KEY = 'CRON_LIST'; //

$PHONE_KEY = 'PHONE_LIST:'.$cron_id;//

//cron info

$cron = $redis->hget($CRON_KEY,$cron_id);

if(empty($cron)){

$cron = array('id'=>10,'name'=>'jackluo');//mysql data

$redis->hset($CRON_KEY,$cron_id,$cron); // set redis

}

//phone list

$phone_list = $redis->lrange($PHONE_KEY,0,-1);

print_r($phone_list);

if(empty($phone_list)){

$phone_list =explode(',','13228191831,18608041585'); //mysql data

//join list

if($phone_list){

$redis->multi();

foreach ($phone_list as $phone) {

$redis->lpush($PHONE_KEY,$phone);

}

$redis->exec();

}

}

print_r($phone_list);

/*$list = $redis->hget($cron_list,);

var_dump($list);*/

//*/

//$redis->set('id',35);

/*

$redis->lpush('test','1111');

$redis->lpush('test','2222');

$redis->lpush('test','3333');

$list = $redis->lrange('test',0,-1);

print_r($list);

$lpop = $redis->lpop('test');

print_r($lpop);

$lpop = $redis->lpop('test');

print_r($lpop);

$lpop = $redis->lpop('test');

print_r($lpop);

*/

// var_dump($redis->get('id'));

希望本文所述對大家PHP程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西贡区| 房山区| 祁门县| 景东| 大姚县| 锡林浩特市| 新建县| 双江| 垣曲县| 乡宁县| 嘉义县| 张家口市| 大理市| 新郑市| 湖州市| 兰坪| 乌鲁木齐市| 习水县| 汉寿县| 石河子市| 武平县| 大余县| 衢州市| 伊金霍洛旗| 五华县| 凤台县| 高淳县| 巢湖市| 西青区| 彰化县| 拉萨市| 南昌县| 六枝特区| 陇西县| 木兰县| 东安县| 资源县| 邓州市| 榆社县| 秦安县| 宁波市|