RedisClient.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. <?php
  2. /**
  3. * This is a Redis exntend class
  4. */
  5. class RedisClient
  6. {
  7. public static $instance = NULL;
  8. public static $linkHandle = array();
  9. //construct:connect redis
  10. public function __construct($configs)
  11. {
  12. $this->initRedis($configs);
  13. }
  14. /**
  15. * Get a instance of MyRedisClient
  16. *
  17. * @param string $key
  18. * @return object
  19. */
  20. static function getInstance($configs)
  21. {
  22. if (!self::$instance) {
  23. self::$instance = new self($configs);
  24. }
  25. return self::$instance;
  26. }
  27. /**
  28. * 初始化Redis
  29. */
  30. private function initRedis($conf){
  31. foreach ($conf['master'] as $k=>$v){
  32. $obj = new Redis();
  33. if($obj->pconnect($v['host'],$v['port'])){
  34. $obj->auth($v['auth']);
  35. self::$linkHandle['master'][] = $obj;
  36. }
  37. }
  38. foreach ($conf['slave'] as $k=>$v){
  39. $obj = new Redis();
  40. if($obj->pconnect($v['host'],$v['port'])){
  41. $obj->auth($v['auth']);
  42. self::$linkHandle['slave'][] = $obj;
  43. }
  44. }
  45. }
  46. /**
  47. * 获得redis Resources
  48. *
  49. * @param $key redis存的key/或随机值
  50. * @param string $tag master/slave
  51. */
  52. public function getRedis($key=null,$tag='master'){
  53. empty($key)?$key = uniqid():'';
  54. $arr_index = $this->getHostByHash($key,count(self::$linkHandle[$tag])); //获得相应主机的数组下标
  55. return self::$linkHandle[$tag][$arr_index];
  56. }
  57. /**
  58. * 随机取出主机
  59. * @param $key $变量key值
  60. * @param $n 主机数
  61. * @return string
  62. */
  63. private function getHostByHash($key,$n){
  64. if($n<2) return 0;
  65. $u = strtolower($key);
  66. $id = sprintf("%u", crc32($key));
  67. $m = base_convert( intval(fmod($id, $n)), 10, $n);
  68. return $m{0};
  69. }
  70. /**
  71. * 关闭连接
  72. * pconnect 连接是无法关闭的
  73. *
  74. * @param int $flag 关闭选择 0:关闭 Master 1:关闭 Slave 2:关闭所有
  75. * @return boolean
  76. */
  77. public function close($flag=2){
  78. switch($flag){
  79. // 关闭 Master
  80. case 0:
  81. foreach (self::$linkHandle['master'] as $var){
  82. $var->close();
  83. }
  84. break;
  85. // 关闭 Slave
  86. case 1:
  87. foreach (self::$linkHandle['slave'] as $var){
  88. $var->close();
  89. }
  90. break;
  91. // 关闭所有
  92. case 1:
  93. $this->close(0);
  94. $this->close(1);
  95. break;
  96. }
  97. return true;
  98. }
  99. //-------------------------------------------------------------------------------
  100. public function hGetAll($key){
  101. return $this->getRedis($key,'slave')->hGetAll($key);
  102. }
  103. /**
  104. * redis 字符串(String) 类型
  105. * 将key和value对应。如果key已经存在了,它会被覆盖,而不管它是什么类型。
  106. * @param $key
  107. * @param $value
  108. * @param $exp 过期时间
  109. */
  110. public function set($key,$value,$exp=0){
  111. $redis = $this->getRedis($key);
  112. $redis->set($key,$value);
  113. !empty($exp) && $redis->expire($key,$exp);
  114. }
  115. /**
  116. * 返回key的value。如果key不存在,返回特殊值nil。如果key的value不是string,就返回错误,因为GET只处理string类型的values。
  117. * @param $key
  118. */
  119. public function get($key){
  120. return $this->getRedis($key,'slave')->get($key);
  121. }
  122. /**
  123. * KEYS pattern
  124. * 查找所有匹配给定的模式的键
  125. * @param $is_key 默认是一个非正则表达试,使用模糊查询
  126. * @param $key
  127. */
  128. public function keys($key,$is_key=true){
  129. if ($is_key) {
  130. return $this->getRedis($key,'slave')->keys("*$key*");
  131. }
  132. return $this->getRedis($key,'slave')->keys("$key");
  133. }
  134. /**
  135. * 批量填充HASH表。不是字符串类型的VALUE,自动转换成字符串类型。使用标准的值。NULL值将被储存为一个空的字符串。
  136. *
  137. * 可以批量添加更新 value,key 不存在将创建,存在则更新值
  138. *
  139. * @param $key
  140. * @param $fieldArr
  141. * @return
  142. * 如果命令执行成功,返回OK。
  143. * 当key不是哈希表(hash)类型时,返回一个错误。
  144. */
  145. public function hMSet($key,$fieldArr){
  146. return $this->getRedis($key)->hmset($key,$fieldArr);
  147. }
  148. /**
  149. * 向已存在于redis里的Hash 添加多个新的字段及值
  150. *
  151. * @param $key redis 已存在的key
  152. * @param $field_arr kv形数组
  153. */
  154. public function hAddFieldArr($key,$field_arr){
  155. foreach ($field_arr as $k=>$v){
  156. $this->hAddFieldOne($key, $k, $v);
  157. }
  158. }
  159. /**
  160. * 向已存在于redis里的Hash 添加一个新的字段及值
  161. * @param $key
  162. * @param $field_name
  163. * @param $field_value
  164. * @return bool
  165. */
  166. public function hAddFieldOne($key,$field_name,$field_value){
  167. return $this->getRedis($key)->hsetnx($key,$field_name,$field_value);
  168. }
  169. /**
  170. * 向Hash里添加多个新的字段或修改一个已存在字段的值
  171. * @param $key
  172. * @param $field_arr
  173. */
  174. public function hAddOrUpValueArr($key,$field_arr){
  175. foreach ($field_arr as $k=>$v){
  176. $this->hAddOrUpValueOne($key, $k, $v);
  177. }
  178. }
  179. /**
  180. * 向Hash里添加多个新的字段或修改一个已存在字段的值
  181. * @param $key
  182. * @param $field_name
  183. * @param $field_value
  184. * @return boolean
  185. * 1 if value didn't exist and was added successfully,
  186. * 0 if the value was already present and was replaced, FALSE if there was an error.
  187. */
  188. public function hAddOrUpValueOne($key,$field_name,$field_value){
  189. return $this->getRedis($key)->hset($key,$field_name,$field_value);
  190. }
  191. /**
  192. * 删除哈希表key中的多个指定域,不存在的域将被忽略。
  193. * @param $key
  194. * @param $field_arr
  195. */
  196. public function hDel($key,$field_arr){
  197. foreach ($field_arr as $var){
  198. $this->hDelOne($key,$var);
  199. }
  200. }
  201. /**
  202. * 删除哈希表key中的一个指定域,不存在的域将被忽略。
  203. *
  204. * @param $key
  205. * @param $field
  206. * @return BOOL TRUE in case of success, FALSE in case of failure
  207. */
  208. public function hDelOne($key,$field){
  209. return $this->getRedis($key)->hdel($key,$field);
  210. }
  211. /**
  212. * 重命名key
  213. *
  214. * @param $oldkey
  215. * @param $newkey
  216. */
  217. public function renameKey($oldkey,$newkey){
  218. return $this->getRedis($oldkey)->rename($oldkey,$newkey);
  219. }
  220. /**
  221. * 删除一个或多个key
  222. * @param $keys
  223. */
  224. public function delKey($keys){
  225. if(is_array($keys)){
  226. foreach ($keys as $key){
  227. $this->getRedis($key)->del($key);
  228. }
  229. }else {
  230. $this->getRedis($key)->del($key);
  231. }
  232. }
  233. /**
  234. * 添加一个字符串值到LIST容器的顶部(左侧),如果KEY不存在,曾创建一个LIST容器,如果KEY存在并且不是一个LIST容器,那么返回FLASE。
  235. *
  236. * @param unknown $key
  237. * @param unknown $val
  238. */
  239. public function lPush($key,$val){
  240. $this->getRedis($key)->lPush($key,$val);
  241. }
  242. /**
  243. * 返回LIST顶部(左侧)的VALUE,并且从LIST中把该VALUE弹出。
  244. * @param unknown $key
  245. */
  246. public function lPop($key){
  247. $this->getRedis($key)->lPop($key);
  248. }
  249. /**
  250. * 批量的添加多个key 到redis
  251. * @param $fieldArr
  252. */
  253. public function mSetnx($fieldArr){
  254. $this->getRedis()->mSetnx($fieldArr);
  255. }
  256. }
  257. ?>