ホームページ > バックエンド開発 > PHPチュートリアル > PHPはrediesによってカプセル化されたクラスを操作します

PHPはrediesによってカプセル化されたクラスを操作します

WBOY
リリース: 2016-07-25 08:43:02
オリジナル
799 人が閲覧しました
  1. /**
  2. * Redis 操作、マスター/スレーブ ロード クラスターをサポート
  3. *
  4. * @author jackluo
  5. */
  6. class RedisCluster{
  7. // M/S 読み取り/書き込みクラスター ソリューションを使用するかどうか
  8. private $_isUseCluster = false;
  9. // スレーブ ハンドルtag
  10. private $_sn = 0;
  11. // サーバー接続ハンドル
  12. private $_linkHandle = array(
  13. 'master'=>null,// 1 つのマスターのみサポート
  14. 'slave'=>array(),//はい、複数のスレーブがあります
  15. );
  16. /**
  17. * コンストラクター
  18. *
  19. * @param boolean $isUseCluster M/S スキームを使用するかどうか
  20. */
  21. public function __construct($isUseCluster=false){
  22. $this->_isUseCluster = $isUseCluster
  23. }
  24. /**
  25. * サーバーに接続します。注意: ここでは効率を上げるために長い接続が使用されていますが、自動的には閉じられません
  26. *
  27. * @param array $config Redis サーバー設定
  28. * @param boolean $isMaster 現在追加されているサーバーがマスターかどうかサーバー
  29. * @ return boolean
  30. * /
  31. public function connect($config=array('host'=>'127.0.0.1','port'=>6379), $isMaster=true){
  32. // デフォルトのポート
  33. if(!isset( $ config['port'])){
  34. $config['port'] = 6379;
  35. }
  36. // マスター接続を設定します
  37. if($isMaster){
  38. $this->_linkHandle['master'] = new Redis ();
  39. $ret = $this->_linkHandle['master']->pconnect($config['host'],$config['port']);
  40. }else{
  41. // 複数のスレーブ接続
  42. $this->_linkHandle['slave'][$this->_sn] = new Redis();
  43. $ret = $this->_linkHandle['slave'][$this->_sn] ->pconnect($config['host'],$config['port']);
  44. ++$this->_sn;
  45. return $ret
  46. }
  47. /**
  48. * 接続を閉じる
  49. *
  50. * @param int $flag 選択を閉じる 0: マスターを閉じる 1: スレーブを閉じる 2: すべて閉じる
  51. * @return boolean
  52. * /
  53. public function close($flag=2){
  54. switch($flag){
  55. // マスターを閉じる
  56. case 0:
  57. $this->getRedis()->close();
  58. //スレーブを閉じる
  59. ケース 1:
  60. for($i=0; $i_sn; ++$i){
  61. $this->_linkHandle['slave'][$i]->close (); }
  62. Break;
  63. // すべて閉じる
  64. ケース 1:
  65. $i=0; $i<$this->_sn ; ++$i){
  66. $this->_linkHandle['slave'][$i]->close();
  67. ブレーク
  68. }
  69. /**
  70. * より多くの操作を行うために元の Redis オブジェクトを取得します
  71. *
  72. * @param boolean $isMaster サーバーのタイプを返します true: マスターを返します false: スレーブを返します
  73. * @param boolean $slaveOne スレーブの選択を返します true: 負荷分散はランダムに A を返しますスレーブ選択 false: すべてのスレーブ選択を返します
  74. * @return redis オブジェクト
  75. */
  76. public function getRedis($isMaster=true,$slaveOne=true){
  77. // マスターのみを返す
  78. if($isMaster){
  79. return $this->_linkHandle['master']
  80. }else{
  81. return $slaveOne ? $this->_getSlaveRedis() : $this->_linkHandle['slave'];
  82. /**
  83. * ライトキャッシュ
  84. *
  85. * @param string $key グループストレージ KEY
  86. * @param string $value キャッシュ値
  87. * @param int $expire 有効期限、0: 有効期限がないことを意味します
  88. */
  89. public function set($key, $value) , $expire=0){
  90. // タイムアウトしません
  91. if($expire == 0){
  92. $ret = $this->getRedis()->set($key, $value);
  93. }else {
  94. $ret = $this->getRedis()->setex($key, $expire, $value);
  95. }
  96. return $ret; }
  97. /**
  98. * キャッシュを読み取ります
  99. *
  100. * @param string $key キャッシュ KEY、一度に複数の $key の取得をサポート = array('key1','key2')
  101. * @return string 失敗した場合は false を返し、string を返します成功について
  102. */
  103. public function get ($key){
  104. // 複数の値を一度に取得するかどうか
  105. $func = is_array($key) ? 'mGet' : 'get'
  106. // M/S は使用されません
  107. if(! $this -> _isUseCluster){
  108. $this->getRedis()->{$func}($key); }
  109. // M/S を使用します
  110. return $this->_getSlaveRedis()->{$func}($key);
  111. }
  112. /*
  113. // マジック関数
  114. public function __call($name,$arguments){
  115. return call_user_func($name,$arguments);
  116. }
  117. */
  118. /**
  119. * キャッシュを設定するための条件形式。キーが存在しない場合、設定は失敗します。
  120. *
  121. * @param string $value キャッシュ値。
  122. * @return ブール値
  123. */
  124. public function setnx($key, $value){
  125. return $this->getRedis()->setnx($key, $value);
  126. }
  127. /**
  128. * キャッシュを削除します
  129. *
  130. * @param string || 配列 $key キャッシュ KEY、単一のキー: "key1" または複数のキーをサポートします: array('key1','key2')
  131. * @return int selected key 数量
  132. */
  133. public function Remove($key){
  134. // $key => "キー1" || array('key1','key2')
  135. return $this->getRedis()->delete($key);
  136. }
  137. /**
  138. * ++$i と同様の値の加算演算。キーが存在しない場合、自動的に 0 に設定されてから加算演算が実行されます
  139. *
  140. * @param string $key Cache KEY
  141. * @param int $ default 演算時のデフォルト値
  142. * @return int 演算後の値
  143. */
  144. public function incr($key,$default=1){
  145. if($default == 1){
  146. return $this->getRedis()->incr ($key);
  147. }else{
  148. return $this->getRedis()->incrBy($key, $default);
  149. }
  150. }
  151. /**
  152. * --$i と同様の値の減算操作。キーが存在しない場合、自動的に 0 に設定されてから減算されます。
  153. *
  154. * @param string $key Cache KEY
  155. * @param int $default デフォルト。演算中の値
  156. * @return int 演算後の値
  157. */
  158. public function decr($key,$default=1){
  159. if($default == 1){
  160. return $this->getRedis()-> ;decr($key);
  161. }else{
  162. return $this->getRedis()->decrBy($key, $default);
  163. }
  164. }
  165. /**
  166. * 現在のデータベースを空にする
  167. *
  168. * @return boolean
  169. */
  170. public function clear(){
  171. return $this->getRedis()->flushDB();
  172. }
  173. /* =================== 以下、私有方法 =================== */
  174. /**
  175. * Redis スレーブサーバーハンドルを取得するためのランダムハッシュ
  176. *
  177. * @return redis オブジェクト
  178. */
  179. private function _getSlaveRedis(){
  180. // 就一台スレーブ机を直接返す
  181. if($this->_sn <= 1){
  182. return $this->_linkHandle[ 'スレーブ'][0];
  183. }
  184. //随机ハッシュがスレーブに到達する句文
  185. $hash = $this->_hashId(mt_rand(), $this->_sn);
  186. return $this->_linkHandle['slave'][$hash];
  187. }
  188. /**
  189. * IDを元にハッシュ化後の0~m-1の値を取得
  190. *
  191. * @param string $id
  192. * @param int $m
  193. * @return int
  194. */
  195. private function _hashId($id,$m=10)
  196. {
  197. //握り字符串K转换は0~m-1の間の间的一值作对应记录的散列地址
  198. $k = md5($id);
  199. $l = strlen($k);
  200. $b = bin2hex($k);
  201. $h = 0;
  202. for($i=0;$i<$l;$i++)
  203. {
  204. //相加模式ハッシュ
  205. $h += substr($b,$i*2,2);
  206. }
  207. $hash = ($h*1)%$m;
  208. $hash を返します;
  209. }
  210. /**
  211. * プシュ
  212. */
  213. public function lpush($key,$value){
  214. return $this->getRedis()->lpush($key,$value);
  215. }
  216. /**
  217. * lpopを追加します
  218. */
  219. public function lpop($key){
  220. return $this->getRedis()->lpop($key);
  221. }
  222. /**
  223. * lrange
  224. */
  225. public function lrange($key,$start,$end){
  226. return $this->getRedis()->lrange($key,$start,$end) ;
  227. }
  228. /**
  229. * ハッシュ操作の設定
  230. */
  231. public function hset($name,$key,$value){
  232. if(is_array($value)){
  233. return $this->getRedis()-> hset($name,$key,serialize($value));
  234. }
  235. return $this->getRedis()->hset($name,$key,$value);
  236. }
  237. /**
  238. * ハッシュ操作を取得します
  239. */
  240. public function hget($name,$key = null,$serialize=true){
  241. if($key){
  242. $row = $this->getRedis()- >hget($name,$key);
  243. if($row && $serialize){
  244. unserialize($row);
  245. }
  246. $row を返します。
  247. }
  248. return $this->getRedis()->hgetAll($name);
  249. }
  250. /**
  251. * ハッシュ操作を削除します
  252. */
  253. public function hdel($name,$key = null){
  254. if($key){
  255. return $this->getRedis()->hdel($name ,$キー);
  256. }
  257. return $this->getRedis()->hdel($name);
  258. }
  259. /**
  260. *取引開始
  261. */
  262. public function multi(){
  263. return $this->getRedis()->multi();
  264. }
  265. /**
  266. * トランザクション送信
  267. */
  268. public function exec(){
  269. return $this->getRedis()->exec();
  270. }
  271. }// クラス終了
  272. // ================= テストデモ ================ =
  273. // 只有一台 Redis 的应用
  274. $redis = new RedisCluster();
  275. $redis->connect(array('host'=>'127.0.0.1','port'=>6379));
  276. //*
  277. $cron_id = 10001;
  278. $CRON_KEY = 'CRON_LIST'; //
  279. $PHONE_KEY = 'PHONE_LIST:'.$cron_id;//
  280. //cron 情報
  281. $cron = $redis->hget($CRON_KEY,$cron_id);
  282. if(empty($cron)){
  283. $cron = array('id'=>10,'name'=>'jackluo');//mysql データ
  284. $redis->hset($CRON_KEY) ,$cron_id,$cron); // redis を設定します
  285. }
  286. // 電話リスト
  287. $phone_list = $redis->lrange($PHONE_KEY,0,-1);
  288. print_r($phone_list);
  289. if(empty($phone_list)){
  290. $phone_list =explode(',','13228191831,18608041585'); //mysql データ
  291. //リストに参加
  292. if($phone_list){
  293. $redis->multi();
  294. foreach ($phone_list as $phone) {
  295. $redis->lpush($PHONE_KEY,$phone);
  296. }
  297. $redis->exec();
  298. }
  299. }
  300. print_r($phone_list);
  301. /*$list = $redis->hget($cron_list,);
  302. var_dump($list);*/
  303. //*/
  304. //$redis->set('id',35);
  305. /*
  306. $redis->lpush('test','1111');
  307. $redis->lpush('test','2222');
  308. $redis->lpush('test','3333');
  309. $list = $redis->lrange('test',0,-1);
  310. print_r($list);
  311. $lpop = $redis->lpop('test');
  312. print_r($lpop);
  313. $lpop = $redis->lpop('test');
  314. print_r($lpop);
  315. $lpop = $redis->lpop('test');
  316. print_r($lpop);
  317. */
  318. // var_dump($redis->get('id'));
复制代

php、レディ


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート