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

  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_sn; $i){
  62. $this->_linkHandle['slave'][$i] -> ;close();
  63. }
  64. break;
  65. // 모두 닫기
  66. 사례 1:
  67. $this->getRedis()->close(); $i=0; $i_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으로 문의하세요.
PHP와 Python : 다른 패러다임이 설명되었습니다PHP와 Python : 다른 패러다임이 설명되었습니다Apr 18, 2025 am 12:26 AM

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP와 Python : 그들의 역사에 깊은 다이빙PHP와 Python : 그들의 역사에 깊은 다이빙Apr 18, 2025 am 12:25 AM

PHP는 1994 년에 시작되었으며 Rasmuslerdorf에 의해 개발되었습니다. 원래 웹 사이트 방문자를 추적하는 데 사용되었으며 점차 서버 측 스크립팅 언어로 진화했으며 웹 개발에 널리 사용되었습니다. Python은 1980 년대 후반 Guidovan Rossum에 의해 개발되었으며 1991 년에 처음 출시되었습니다. 코드 가독성과 단순성을 강조하며 과학 컴퓨팅, 데이터 분석 및 기타 분야에 적합합니다.

PHP와 Python 중에서 선택 : 가이드PHP와 Python 중에서 선택 : 가이드Apr 18, 2025 am 12:24 AM

PHP는 웹 개발 및 빠른 프로토 타이핑에 적합하며 Python은 데이터 과학 및 기계 학습에 적합합니다. 1.PHP는 간단한 구문과 함께 동적 웹 개발에 사용되며 빠른 개발에 적합합니다. 2. Python은 간결한 구문을 가지고 있으며 여러 분야에 적합하며 강력한 라이브러리 생태계가 있습니다.

PHP 및 프레임 워크 : 언어 현대화PHP 및 프레임 워크 : 언어 현대화Apr 18, 2025 am 12:14 AM

PHP는 현대화 프로세스에서 많은 웹 사이트 및 응용 프로그램을 지원하고 프레임 워크를 통해 개발 요구에 적응하기 때문에 여전히 중요합니다. 1.PHP7은 성능을 향상시키고 새로운 기능을 소개합니다. 2. Laravel, Symfony 및 Codeigniter와 같은 현대 프레임 워크는 개발을 단순화하고 코드 품질을 향상시킵니다. 3. 성능 최적화 및 모범 사례는 응용 프로그램 효율성을 더욱 향상시킵니다.

PHP의 영향 : 웹 개발 및 그 이상PHP의 영향 : 웹 개발 및 그 이상Apr 18, 2025 am 12:10 AM

phphassignificallyimpactedwebdevelopmentandextendsbeyondit

스칼라 유형, 반환 유형, 노조 유형 및 무효 유형을 포함한 PHP 유형의 힌트 작업은 어떻게 작동합니까?스칼라 유형, 반환 유형, 노조 유형 및 무효 유형을 포함한 PHP 유형의 힌트 작업은 어떻게 작동합니까?Apr 17, 2025 am 12:25 AM

PHP 유형은 코드 품질과 가독성을 향상시키기위한 프롬프트입니다. 1) 스칼라 유형 팁 : PHP7.0이므로 int, float 등과 같은 기능 매개 변수에 기본 데이터 유형을 지정할 수 있습니다. 2) 반환 유형 프롬프트 : 기능 반환 값 유형의 일관성을 확인하십시오. 3) Union 유형 프롬프트 : PHP8.0이므로 기능 매개 변수 또는 반환 값에 여러 유형을 지정할 수 있습니다. 4) Nullable 유형 프롬프트 : NULL 값을 포함하고 널 값을 반환 할 수있는 기능을 포함 할 수 있습니다.

PHP는 객체 클로닝 (클론 키워드) 및 __clone 마법 방법을 어떻게 처리합니까?PHP는 객체 클로닝 (클론 키워드) 및 __clone 마법 방법을 어떻게 처리합니까?Apr 17, 2025 am 12:24 AM

PHP에서는 클론 키워드를 사용하여 객체 사본을 만들고 \ _ \ _ Clone Magic 메소드를 통해 클로닝 동작을 사용자 정의하십시오. 1. 복제 키워드를 사용하여 얕은 사본을 만들어 객체의 속성을 복제하지만 객체의 속성은 아닙니다. 2. \ _ \ _ 클론 방법은 얕은 복사 문제를 피하기 위해 중첩 된 물체를 깊이 복사 할 수 있습니다. 3. 복제의 순환 참조 및 성능 문제를 피하고 클로닝 작업을 최적화하여 효율성을 향상시키기 위해주의를 기울이십시오.

PHP vs. Python : 사용 사례 및 응용 프로그램PHP vs. Python : 사용 사례 및 응용 프로그램Apr 17, 2025 am 12:23 AM

PHP는 웹 개발 및 컨텐츠 관리 시스템에 적합하며 Python은 데이터 과학, 기계 학습 및 자동화 스크립트에 적합합니다. 1.PHP는 빠르고 확장 가능한 웹 사이트 및 응용 프로그램을 구축하는 데 잘 작동하며 WordPress와 같은 CMS에서 일반적으로 사용됩니다. 2. Python은 Numpy 및 Tensorflow와 같은 풍부한 라이브러리를 통해 데이터 과학 및 기계 학습 분야에서 뛰어난 공연을했습니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기