>백엔드 개발 >PHP 튜토리얼 >PHP는 redies로 캡슐화된 클래스를 운영합니다.

PHP는 redies로 캡슐화된 클래스를 운영합니다.

WBOY
WBOY원래의
2016-07-25 08:43:02804검색
  1. /**
  2. * Redis 작업, 마스터/슬레이브 로드 클러스터 지원
  3. *
  4. * @author jackluo
  5. */
  6. class RedisCluster{
  7. // M/S 읽기-쓰기 사용 여부 Cluster Scheme
  8. private $_isUseCluster = false;
  9. // 슬레이브 핸들 태그
  10. private $_sn = 0
  11. // 서버 연결 핸들
  12. private $_linkHandle = array (
  13. 'master'=>null,// 하나의 마스터만 지원합니다
  14. 'slave'=>array(),// 여러 슬레이브를 가질 수 있습니다
  15. ); *
  16. * 생성자
  17. *
  18. * @param boolean $isUseCluster M/S 방식 사용 여부
  19. */
  20. 공용 함수 __construct($isUseCluster=false){
  21. $this->_isUseCluster = $isUseCluster
  22. }
  23. /**
  24. * 서버에 연결합니다. 참고: 여기에서는 효율성을 높이기 위해 긴 연결이 사용되지만 자동으로 닫히지는 않습니다.
  25. *
  26. * @param array $config Redis 서버 구성
  27. * @param boolean $isMaster 현재 추가된 서버가 마스터 서버인지 여부
  28. * @return boolean
  29. * /
  30. 공용 함수 connect($config=array('host'=>'127.0.0.1','port'=>6379), $isMaster=true){
  31. // 기본 포트
  32. if (!isset($config['port'])){
  33. $config['port'] = 6379;
  34. }
  35. // 마스터 연결 설정
  36. if($isMaster){
  37. $this->_linkHandle['master'] = new Redis()
  38. $ret = $this->_linkHandle['master']->pconnect($config['host'],$ config ['port']);
  39. }else{
  40. // 다중 슬레이브 연결
  41. $this->_linkHandle['slave'][$this->_sn] = new Redis()
  42. $ret = $this->_linkHandle['slave'][$this->_sn]->pconnect($config['host'],$config['port'])
  43. $ this->_sn;
  44. }
  45. return $ret
  46. }
  47. /**
  48. * 연결 닫기
  49. *
  50. * @param int $flag 선택 닫기 0: 마스터 닫기 1: 슬레이브 닫기 2: 모두 닫기
  51. * @return boolean
  52. */
  53. 공개 함수 close($flag=2){
  54. switch($flag){
  55. // 마스터 닫기
  56. 사례 0:
  57. $this->getRedis()->close()
  58. break
  59. // 슬레이브 닫기;
  60. 사례 1:
  61. for($i=0; $i<$this->_sn; $i){
  62. $this->_linkHandle['slave'][$i] -> ;close();
  63. }
  64. break;
  65. // 모두 닫기
  66. 사례 1:
  67. $this->getRedis()->close(); $i=0; $i<$this->_sn; $i){
  68. $this->_linkHandle['slave'][$i]->close()
  69. }
  70. break;
  71. }
  72. true를 반환합니다.
  73. }
  74. /**
  75. * 원본 Redis 객체를 가져오면 더 많은 작업을 수행할 수 있습니다.
  76. *
  77. * @param boolean $isMaster 서버 유형을 반환합니다. true: 마스터를 반환합니다. false: 슬레이브를 반환합니다.
  78. * @param boolean $ slaveOne 반환된 슬레이브 선택 true: 로드 밸런싱이 무작위 슬레이브 선택을 반환합니다. false: 모든 슬레이브 선택을 반환합니다.
  79. * @return redis 객체
  80. */
  81. 공개 함수 getRedis($isMaster=true,$slaveOne=true) 🎜> // 마스터만 반환
  82. if($isMaster){
  83. return $this->_linkHandle['master']
  84. }else{
  85. return $this- > _getSlaveRedis() : $this->_linkHandle['slave'];
  86. }
  87. }
  88. /**
  89. * 쓰기 캐시
  90. *
  91. * @param string $key 그룹 저장 KEY
  92. * @param string $value 캐시 값
  93. * @param int $expire 만료 시간, 0: 만료 없음을 의미 시간
  94. */
  95. 공개 함수 세트($key, $value , $expire=0){
  96. // 시간 초과가 발생하지 않음
  97. if($expire == 0){
  98. $ret = $this->getRedis()->set($key , $value );
  99. }else{
  100. $ret = $this->getRedis()->setex($key, $expire, $value)
  101. }
  102. return $ret ; > }
  103. /**
  104. * 캐시 읽기
  105. *
  106. * @param string $key 캐시 KEY, 한 번에 여러 $key 가져오기 지원 = array('key1','key2')
  107. * @return string || boolean 실패 시 false를 반환하고, 성공 시
  108. 문자열을 반환합니다.*/
  109. public function get($key){
  110. // 여러 값을 동시에 가져올지 여부
  111. $func = is_array($ key) ? 'mGet' : 'get';
  112. // M/S는 사용되지 않습니다.
  113. if(! $this->_isUseCluster){
  114. return $this->getRedis()-> ; {$func}($key)
  115. }
  116. // 使用了 M/S
  117. return $this->_getSlaveRedis()->{$func}($key);
  118. }
  119. /*
  120. // 魔術函數
  121. public function __call($name,$arguments){
  122. return call_user_func($name,$arguments);
  123. }
  124. */
  125. /**
  126. * 條件形式設定緩存,如果key 不存時就設置,存在時設定失敗
  127. *
  128. * @param string $key 緩存KEY
  129. * @param string $value 快取值
  130. * @return boolean
  131. */
  132. public function setnx($key, $value){
  133. return $this->getRedis()->setnx ($鍵,$值);
  134. }
  135. /**
  136. * 刪除快取
  137. *
  138. * @param string || array $key 快取KEY,支援單一健:"key1" 或多個健:array('key1','key2')
  139. * @return int 刪除的健的數量
  140. */
  141. public function remove($key){
  142. // $key =>; “區域1”|| array('key1','key2')
  143. return $this->getRedis()->delete($key);
  144. }
  145. /**
  146. * 值加上操作,類似$i ,如果key 不存在時自動設定為0 後進行加加操作
  147. *
  148. * @param string $key 快取KEY
  149. * @param int $ default 操作時的預設值
  150. * @return int 操作後的值
  151. */
  152. public function incr($key,$default=1){
  153. if($default == 1){
  154. return $this->getRedis()->incr($key);
  155. }else{
  156. return $this->getRedis()->incrBy($key, $default);
  157. }
  158. }
  159. /**
  160. * 值減減操作,類似--$i ,如果key 不存在時自動設定為0 後進行減減操作
  161. *
  162. * @param string $key 快取KEY
  163. * @param int $default 操作時的預設值
  164. * @return int 操作後的值
  165. */
  166. public function decr($key,$default=1){
  167. if($default == 1){
  168. return $this->getRedis()->decr($key);
  169. }else{
  170. return $this->getRedis()->decrBy($key, $default);
  171. }
  172. }
  173. /**
  174. * 添空目前資料庫
  175. *
  176. * @return boolean
  177. */
  178. public function clear(){
  179. return $this->getRedis()->flushDB();
  180. }
  181. /* =======================以下導管方法============ == == === */
  182. /**
  183. * 隨機 HASH 得到 Redis Slave 伺服器句柄
  184. *
  185. * @return redis object
  186. */
  187. private function _getSlaveRedis(){
  188. // 就一個從機直接回傳
  189. if($this -> ; _sn 回傳 $this->_linkHandle['slave'][0];
  190. }
  191. // 隨機雜湊得到 Slave 的句柄
  192. $hash = $this->_hashId(mt_rand(), $this->_sn);
  193. return $this->_linkHandle['slave'][$hash];
  194. }
  195. /**
  196. * 根據ID得到 hash 後 0~m-1 之間的值
  197. *
  198. * @param string $id
  199. * @param int $m
  200. * @return int
  201. */
  202. private function _hashId($id,$m=10)
  203. {
  204. // 把字串K轉換成0~ m-1 之間的一個值作為對應記錄的雜湊位址
  205. $k = md5($id);
  206. $l = strlen($k);
  207. $b = bin2hex($k);
  208. $h = 0;
  209. for($i=0;$i {
  210. //相加模式HASH
  211. $h = substr($b,$i*2,2) ;
  212. }
  213. $hash = ($h*1)%$m;
  214. 回傳 $hash;
  215. }
  216. /**
  217. * lpush
  218. */
  219. public function lpush($key,$value){
  220. return $this->getRedis()->lpush($鍵, $值);
  221. }
  222. /**
  223. * 加 lpop
  224. */
  225. public function lpop($key){
  226. return $this->getRedis()->lpop($key){
  227. return $this->getRedis()->lpop($key );
  228. }
  229. /**
  230. * 範圍
  231. */
  232. public function lrange($key,$start,$end){
  233. return $this->getRedis()->lrange($鍵,$開始,$結束);
  234. }
  235. /**
  236. * 設定哈希操作
  237. */
  238. public function hset($name,$key,$value){
  239. if(is_array ($value)){
  240. 回傳$this->getRedis()->hset($name,$key,serialize($value));
  241. }
  242. return $this->getRedis()- >hset($name,$key,$value);
  243. }
  244. /**
  245. * 取得雜湊操作
  246. */
  247. public function hget($name,$key = null,$serialize=true){
  248. if($key){
  249. $row = $this->getRedis()->hget($name,$key);
  250. if($row && $serialize){
  251. unserialize($行);
  252. }
  253. 回傳$行}
  254. return $this->getRedis()->hgetAll($name);
  255. }
  256. /**
  257. * 해시 작업 삭제
  258. */
  259. 공개 함수 hdel($name,$key = null){
  260. if($key){
  261. return $this- >getRedis()->hdel($name,$key);
  262. }
  263. return $this->getRedis()->hdel($name);
  264. }
  265. /**
  266. * 거래 시작
  267. */
  268. 공용 함수 multi(){
  269. return $this->getRedis()->multi();
  270. }
  271. /**
  272. * 거래 보내기
  273. */
  274. 공개 함수 exec(){
  275. return $this->getRedis()->exec();
  276. }
  277. }// 수업 종료
  278. // ================= 테스트 데모 == ===============
  279. // 只有一台 Redis 용도
  280. $redis = new RedisCluster();
  281. $redis->connect(array('host'=>'127.0.0.1','port'=>6379));
  282. //*
  283. $cron_id = 10001;
  284. $CRON_KEY = 'CRON_LIST'; //
  285. $PHONE_KEY = 'PHONE_LIST:'.$cron_id;//
  286. //cron 정보
  287. $cron = $redis->hget($CRON_KEY,$cron_id);
  288. if(empty($cron)){
  289. $cron = array('id'=>10,'name'=>'jackluo');//mysql 데이터
  290. $ redis->hset($CRON_KEY,$cron_id,$cron); // redis 설정
  291. }
  292. //전화 목록
  293. $phone_list = $redis->lrange($PHONE_KEY,0,-1);
  294. print_r($phone_list);
  295. if(empty($phone_list)){
  296. $phone_list =explode(',','13228191831,18608041585'); //mysql 데이터
  297. //목록 조인
  298. if($phone_list){
  299. $redis->multi();
  300. foreach ($phone_list를 $phone으로) {
  301. $redis->lpush($PHONE_KEY,$phone);
  302. }
  303. $redis->exec();
  304. }
  305. }
  306. print_r($phone_list);
  307. /*$list = $redis->hget($cron_list,);
  308. var_dump($list);*/
  309. //*/
  310. //$redis->set('id',35);
  311. /*
  312. $redis->lpush('test','1111');
  313. $redis->lpush('test','2222');
  314. $redis->lpush('test','3333');
  315. $list = $redis->lrange('test',0,-1);
  316. print_r($list);
  317. $lpop = $redis->lpop('테스트');
  318. print_r($lpop);
  319. $lpop = $redis->lpop('테스트');
  320. print_r($lpop);
  321. $lpop = $redis->lpop('테스트');
  322. print_r($lpop);
  323. */
  324. // var_dump($redis->get('id'));
复代码

PHP, 레디스


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.