当前位置:Gxlcms > PHP教程 > php操作redies封装的类

php操作redies封装的类

时间:2021-07-01 10:21:17 帮助过:23人阅读

  1. /**
  2. * Redis 操作,支持 Master/Slave 的负载集群
  3. *
  4. * @author jackluo
  5. */
  6. class RedisCluster{
  7. // 是否使用 M/S 的读写集群方案
  8. private $_isUseCluster = false;
  9. // Slave 句柄标记
  10. private $_sn = 0;
  11. // 服务器连接句柄
  12. private $_linkHandle = array(
  13. 'master'=>null,// 只支持一台 Master
  14. 'slave'=>array(),// 可以有多台 Slave
  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 当前添加的服务器是否为 Master 服务器
  29. * @return boolean
  30. */
  31. public function connect($config=array('host'=>'127.0.0.1','port'=>6379), $isMaster=true){
  32. // default port
  33. if(!isset($config['port'])){
  34. $config['port'] = 6379;
  35. }
  36. // 设置 Master 连接
  37. if($isMaster){
  38. $this->_linkHandle['master'] = new Redis();
  39. $ret = $this->_linkHandle['master']->pconnect($config['host'],$config['port']);
  40. }else{
  41. // 多个 Slave 连接
  42. $this->_linkHandle['slave'][$this->_sn] = new Redis();
  43. $ret = $this->_linkHandle['slave'][$this->_sn]->pconnect($config['host'],$config['port']);
  44. ++$this->_sn;
  45. }
  46. return $ret;
  47. }
  48. /**
  49. * 关闭连接
  50. *
  51. * @param int $flag 关闭选择 0:关闭 Master 1:关闭 Slave 2:关闭所有
  52. * @return boolean
  53. */
  54. public function close($flag=2){
  55. switch($flag){
  56. // 关闭 Master
  57. case 0:
  58. $this->getRedis()->close();
  59. break;
  60. // 关闭 Slave
  61. case 1:
  62. for($i=0; $i<$this->_sn; ++$i){
  63. $this->_linkHandle['slave'][$i]->close();
  64. }
  65. break;
  66. // 关闭所有
  67. case 1:
  68. $this->getRedis()->close();
  69. for($i=0; $i<$this->_sn; ++$i){
  70. $this->_linkHandle['slave'][$i]->close();
  71. }
  72. break;
  73. }
  74. return true;
  75. }
  76. /**
  77. * 得到 Redis 原始对象可以有更多的操作
  78. *
  79. * @param boolean $isMaster 返回服务器的类型 true:返回Master false:返回Slave
  80. * @param boolean $slaveOne 返回的Slave选择 true:负载均衡随机返回一个Slave选择 false:返回所有的Slave选择
  81. * @return redis object
  82. */
  83. public function getRedis($isMaster=true,$slaveOne=true){
  84. // 只返回 Master
  85. if($isMaster){
  86. return $this->_linkHandle['master'];
  87. }else{
  88. return $slaveOne ? $this->_getSlaveRedis() : $this->_linkHandle['slave'];
  89. }
  90. }
  91. /**
  92. * 写缓存
  93. *
  94. * @param string $key 组存KEY
  95. * @param string $value 缓存值
  96. * @param int $expire 过期时间, 0:表示无过期时间
  97. */
  98. public function set($key, $value, $expire=0){
  99. // 永不超时
  100. if($expire == 0){
  101. $ret = $this->getRedis()->set($key, $value);
  102. }else{
  103. $ret = $this->getRedis()->setex($key, $expire, $value);
  104. }
  105. return $ret;
  106. }
  107. /**
  108. * 读缓存
  109. *
  110. * @param string $key 缓存KEY,支持一次取多个 $key = array('key1','key2')
  111. * @return string || boolean 失败返回 false, 成功返回字符串
  112. */
  113. public function get($key){
  114. // 是否一次取多个值
  115. $func = is_array($key) ? 'mGet' : 'get';
  116. // 没有使用M/S
  117. if(! $this->_isUseCluster){
  118. return $this->getRedis()->{$func}($key);
  119. }
  120. // 使用了 M/S
  121. return $this->_getSlaveRedis()->{$func}($key);
  122. }
  123. /*
  124. // magic function
  125. public function __call($name,$arguments){
  126. return call_user_func($name,$arguments);
  127. }
  128. */
  129. /**
  130. * 条件形式设置缓存,如果 key 不存时就设置,存在时设置失败
  131. *
  132. * @param string $key 缓存KEY
  133. * @param string $value 缓存值
  134. * @return boolean
  135. */
  136. public function setnx($key, $value){
  137. return $this->getRedis()->setnx($key, $value);
  138. }
  139. /**
  140. * 删除缓存
  141. *
  142. * @param string || array $key 缓存KEY,支持单个健:"key1" 或多个健:array('key1','key2')
  143. * @return int 删除的健的数量
  144. */
  145. public function remove($key){
  146. // $key => "key1" || array('key1','key2')
  147. return $this->getRedis()->delete($key);
  148. }
  149. /**
  150. * 值加加操作,类似 ++$i ,如果 key 不存在时自动设置为 0 后进行加加操作
  151. *
  152. * @param string $key 缓存KEY
  153. * @param int $default 操作时的默认值
  154. * @return int 操作后的值
  155. */
  156. public function incr($key,$default=1){
  157. if($default == 1){
  158. return $this->getRedis()->incr($key);
  159. }else{
  160. return $this->getRedis()->incrBy($key, $default);
  161. }
  162. }
  163. /**
  164. * 值减减操作,类似 --$i ,如果 key 不存在时自动设置为 0 后进行减减操作
  165. *
  166. * @param string $key 缓存KEY
  167. * @param int $default 操作时的默认值
  168. * @return int 操作后的值
  169. */
  170. public function decr($key,$default=1){
  171. if($default == 1){
  172. return $this->getRedis()->decr($key);
  173. }else{
  174. return $this->getRedis()->decrBy($key, $default);
  175. }
  176. }
  177. /**
  178. * 添空当前数据库
  179. *
  180. * @return boolean
  181. */
  182. public function clear(){
  183. return $this->getRedis()->flushDB();
  184. }
  185. /* =================== 以下私有方法 =================== */
  186. /**
  187. * 随机 HASH 得到 Redis Slave 服务器句柄
  188. *
  189. * @return redis object
  190. */
  191. private function _getSlaveRedis(){
  192. // 就一台 Slave 机直接返回
  193. if($this->_sn <= 1){
  194. return $this->_linkHandle['slave'][0];
  195. }
  196. // 随机 Hash 得到 Slave 的句柄
  197. $hash = $this->_hashId(mt_rand(), $this->_sn);
  198. return $this->_linkHandle['slave'][$hash];
  199. }
  200. /**
  201. * 根据ID得到 hash 后 0~m-1 之间的值
  202. *
  203. * @param string $id
  204. * @param int $m
  205. * @return int
  206. */
  207. private function _hashId($id,$m=10)
  208. {
  209. //把字符串K转换为 0~m-1 之间的一个值作为对应记录的散列地址
  210. $k = md5($id);
  211. $l = strlen($k);
  212. $b = bin2hex($k);
  213. $h = 0;
  214. for($i=0;$i<$l;$i++)
  215. {
  216. //相加模式HASH
  217. $h += substr($b,$i*2,2);
  218. }
  219. $hash = ($h*1)%$m;
  220. return $hash;
  221. }
  222. /**
  223. * lpush
  224. */
  225. public function lpush($key,$value){
  226. return $this->getRedis()->lpush($key,$value);
  227. }
  228. /**
  229. * add lpop
  230. */
  231. public function lpop($key){
  232. return $this->getRedis()->lpop($key);
  233. }
  234. /**
  235. * lrange
  236. */
  237. public function lrange($key,$start,$end){
  238. return $this->getRedis()->lrange($key,$start,$end);
  239. }
  240. /**
  241. * set hash opeation
  242. */
  243. public function hset($name,$key,$value){
  244. if(is_array($value)){
  245. return $this->getRedis()->hset($name,$key,serialize($value));
  246. }
  247. return $this->getRedis()->hset($name,$key,$value);
  248. }
  249. /**
  250. * get hash opeation
  251. */
  252. public function hget($name,$key = null,$serialize=true){
  253. if($key){
  254. $row = $this->getRedis()->hget($name,$key);
  255. if($row && $serialize){
  256. unserialize($row);
  257. }
  258. return $row;
  259. }
  260. return $this->getRedis()->hgetAll($name);
  261. }
  262. /**
  263. * delete hash opeation
  264. */
  265. public function hdel($name,$key = null){
  266. if($key){
  267. return $this->getRedis()->hdel($name,$key);
  268. }
  269. return $this->getRedis()->hdel($name);
  270. }
  271. /**
  272. * Transaction start
  273. */
  274. public function multi(){
  275. return $this->getRedis()->multi();
  276. }
  277. /**
  278. * Transaction send
  279. */
  280. public function exec(){
  281. return $this->getRedis()->exec();
  282. }
  283. }// End Class
  284. // ================= TEST DEMO =================
  285. // 只有一台 Redis 的应用
  286. $redis = new RedisCluster();
  287. $redis->connect(array('host'=>'127.0.0.1','port'=>6379));
  288. //*
  289. $cron_id = 10001;
  290. $CRON_KEY = 'CRON_LIST'; //
  291. $PHONE_KEY = 'PHONE_LIST:'.$cron_id;//
  292. //cron info
  293. $cron = $redis->hget($CRON_KEY,$cron_id);
  294. if(empty($cron)){
  295. $cron = array('id'=>10,'name'=>'jackluo');//mysql data
  296. $redis->hset($CRON_KEY,$cron_id,$cron); // set redis
  297. }
  298. //phone list
  299. $phone_list = $redis->lrange($PHONE_KEY,0,-1);
  300. print_r($phone_list);
  301. if(empty($phone_list)){
  302. $phone_list =explode(',','13228191831,18608041585'); //mysql data
  303. //join list
  304. if($phone_list){
  305. $redis->multi();
  306. foreach ($phone_list as $phone) {
  307. $redis->lpush($PHONE_KEY,$phone);
  308. }
  309. $redis->exec();
  310. }
  311. }
  312. print_r($phone_list);
  313. /*$list = $redis->hget($cron_list,);
  314. var_dump($list);*/
  315. //*/
  316. //$redis->set('id',35);
  317. /*
  318. $redis->lpush('test','1111');
  319. $redis->lpush('test','2222');
  320. $redis->lpush('test','3333');
  321. $list = $redis->lrange('test',0,-1);
  322. print_r($list);
  323. $lpop = $redis->lpop('test');
  324. print_r($lpop);
  325. $lpop = $redis->lpop('test');
  326. print_r($lpop);
  327. $lpop = $redis->lpop('test');
  328. print_r($lpop);
  329. */
  330. // var_dump($redis->get('id'));

php, redies

人气教程排行