首頁 > 後端開發 > php教程 > php操作redies封裝的類

php操作redies封裝的類

WBOY
發布: 2016-07-25 08:43:02
原創
791 人瀏覽過
  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. * 조건부 형식으로 캐시를 설정합니다. 키가 존재하지 않으면 설정이 실패합니다.
  127. *
  128. * @param string $key Cache KEY
  129. * @param string $value 캐시 값
  130. * @return 부울
  131. */
  132. 공개 함수 setnx($key, $value){
  133. return $this->getRedis()->setnx ($키, $값);
  134. }
  135. /**
  136. * 캐시 삭제
  137. *
  138. * @param string || 배열 $key 캐시 KEY, 단일 키 지원: "key1" 또는 다중 키: array('key1','key2')
  139. * @return int 삭제된 키의 개수
  140. */
  141. 공개 함수 제거($key){
  142. // $key => "키1" || array('key1','key2')
  143. return $this->getRedis()->delete($key);
  144. }
  145. /**
  146. * 값 추가 연산은 $i와 마찬가지로 키가 존재하지 않으면 자동으로 0으로 설정된 후 추가 연산을 수행합니다.
  147. *
  148. * @param string $key 캐시 KEY
  149. * @param int $ default 연산 중 기본값
  150. * @return int 연산 후 값
  151. */
  152. 공개 함수 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와 유사한 값 빼기 연산, 키가 존재하지 않으면 자동으로 0으로 설정된 후 빼기
  161. *
  162. * @param string $key 캐시 KEY
  163. * @param int $default 작업 중 기본값
  164. * @return int 작업 후 값
  165. */
  166. 공용 함수 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. 공용 함수clear(){
  179. return $this->getRedis()->flushDB();
  180. }
  181. /* =================== 以下私유방법 ================ === */
  182. /**
  183. * Redis 슬레이브 서버 핸들을 얻기 위한 무작위 HASH
  184. *
  185. * @return redis 객체
  186. */
  187. private function _getSlaveRedis(){
  188. // 就一台 슬레이브 机直接返回
  189. if($this-> _sn <= 1){
  190. return $this->_linkHandle['slave'][0];
  191. }
  192. // 随机 Hash 得到 Slave 的句柄
  193. $hash = $this->_hashId(mt_rand(), $this->_sn);
  194. return $this->_linkHandle['slave'][$hash];
  195. }
  196. /**
  197. * ID를 기준으로 해싱한 후 0에서 m-1 사이의 값을 가져옵니다.
  198. *
  199. * @param string $id
  200. * @param int $m
  201. * @return int
  202. */
  203. 비공개 함수 _hashId($id,$m=10)
  204. {
  205. //把字符串K转换为 0~ m-1 之间的一个值work为对应记录的散列地址
  206. $k = md5($id);
  207. $l = strlen($k);
  208. $b = bin2hex($k);
  209. $h = 0;
  210. for($i=0;$i<$l;$i )
  211. {
  212. //상加模式HASH
  213. $h = substr($b,$i*2,2) ;
  214. }
  215. $hash = ($h*1)%$m;
  216. $hash를 반환합니다.
  217. }
  218. /**
  219. * lpush
  220. */
  221. 공개 함수 lpush($key,$value){
  222. return $this->getRedis()->lpush($ 키,$값);
  223. }
  224. /**
  225. * lpop 추가
  226. */
  227. 공용 함수 lpop($key){
  228. return $this->getRedis()->lpop($key);
  229. }
  230. /**
  231. *레인지
  232. */
  233. 공용 함수 lrange($key,$start,$end){
  234. return $this->getRedis()->lrange($ 키,$시작,$끝);
  235. }
  236. /**
  237. * 해시 연산 설정
  238. */
  239. 공개 함수 hset($name,$key,$value){
  240. if(is_array($value)){
  241. return $this->getRedis()->hset($name,$key,serialize($value));
  242. }
  243. return $this->getRedis()->hset($name,$key,$value);
  244. }
  245. /**
  246. * 해시 연산 가져오기
  247. */
  248. 공개 함수 hget($name,$key = null,$serialize=true){
  249. if($key){
  250. $row = $this->getRedis()->hget($name,$key);
  251. if($row && $serialize){
  252. unserialize($row);
  253. }
  254. $행 반환;
  255. }
  256. return $this->getRedis()->hgetAll($name);
  257. }
  258. /**
  259. * 刪除雜湊操作
  260. */
  261. public function hdel($name,$key = null){
  262. if($key){
  263. return $this- >getRedis()->hdel($name,$key);
  264. }
  265. return $this->getRedis()- >hdel($name);
  266. }
  267. /**
  268. * 交易開始
  269. */
  270. public function multi(){
  271. return $this->getRedis()->multi();
  272. }
  273. /**
  274. * 交易發送
  275. */
  276. public function exec(){
  277. return $this->getRedis()->exec();
  278. }
  279. }// 結束課程
  280. // ================= 測試示範== ======== =======
  281. // 只有一個Redis 的應用
  282. $redis = new RedisCluster();
  283. $redis->connect(array('host'=>'127.0. 0.1','port'=>6379));
  284. //*
  285. $cron_id = 10001;
  286. $CRON_KEY = 'CRON_LIST'; //
  287. 'PHONE_LIST:'.$cron_id;//
  288. //cron 訊息
  289. $cron = $redis->hget($CRON_KEY,$cron_id);
  290. if(empty($cron)) {
  291. $cron = array('id'=>10,'name'=>'jackluo');//mysql資料
  292. $ redis->hset($CRON_KEY,$cron_id,$cron ); // 設定redis
  293. }
  294. //電話清單
  295. $phone_list = $redis->lrange($PHONE_KEY,0,-1);
  296. print_r($phone_list);
  297. if(empty($phone_list)){
  298. $phone_list =explode(',','13228191831,18608041585'); //mysql 資料
  299. //連線清單
  300. if($phone_list > $redis->multi();
  301. foreach ($phone_list as $phone) {
  302. $redis->lpush($PHONE_KEY,$phone);
  303. }
  304. $redis->exec( );
  305. }
  306. }
  307. print_r($phone_list);
  308. /*$list = $redis->hget($cron_list,);
  309. /*$list = $redis->hget($cron_list,);
  310. var_dump($list);*/
  311. //*/
  312. //$redis->set('id',35);
  313. /*
  314. $redis->lpush('test','1111');
  315. $redis->lpush('test','2222');
  316. $redis->lpush('test',' 3333');
  317. $list = $redis->lrange('test',0,-1);
  318. print_r($list);
  319. $lpop = $redis->lpop( 'test');
  320. print_r($lpop);
  321. $lpop = $redis->lpop('test');
  322. print_r($lpop);
  323. $lpop = $redis-> lpop('test');
  324. print_r($lpop);
  325. */
  326. // var_dump($redis->get('id'));
複製代碼

php,雷迪斯


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板