本文實(shí)例講述了PHP實(shí)現(xiàn)操作redis的封裝類。分享給大家供大家參考,具體如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
|
<?php /** * Redis 操作,支持 Master/Slave 的負(fù)載集群 * * @author jackluo */ class RedisCluster{ // 是否使用 M/S 的讀寫集群方案 private $_isUseCluster = false; // Slave 句柄標(biāo)記 private $_sn = 0; // 服務(wù)器連接句柄 private $_linkHandle = array ( 'master' =>null, // 只支持一臺 Master 'slave' => array (), // 可以有多臺 Slave ); /** * 構(gòu)造函數(shù) * * @param boolean $isUseCluster 是否采用 M/S 方案 */ public function __construct( $isUseCluster =false){ $this ->_isUseCluster = $isUseCluster ; } /** * 連接服務(wù)器,注意:這里使用長連接,提高效率,但不會自動關(guān)閉 * * @param array $config Redis服務(wù)器配置 * @param boolean $isMaster 當(dāng)前添加的服務(wù)器是否為 Master 服務(wù)器 * @return boolean */ public function connect( $config = array ( 'host' => '127.0.0.1' , 'port' =>6379), $isMaster =true){ // default port if (!isset( $config [ 'port' ])){ $config [ 'port' ] = 6379; } // 設(shè)置 Master 連接 if ( $isMaster ){ $this ->_linkHandle[ 'master' ] = new Redis(); $ret = $this ->_linkHandle[ 'master' ]->pconnect( $config [ 'host' ], $config [ 'port' ]); } else { // 多個 Slave 連接 $this ->_linkHandle[ 'slave' ][ $this ->_sn] = new Redis(); $ret = $this ->_linkHandle[ 'slave' ][ $this ->_sn]->pconnect( $config [ 'host' ], $config [ 'port' ]); ++ $this ->_sn; } return $ret ; } /** * 關(guān)閉連接 * * @param int $flag 關(guān)閉選擇 0:關(guān)閉 Master 1:關(guān)閉 Slave 2:關(guān)閉所有 * @return boolean */ public function close( $flag =2){ switch ( $flag ){ // 關(guān)閉 Master case 0: $this ->getRedis()->close(); break ; // 關(guān)閉 Slave case 1: for ( $i =0; $i < $this ->_sn; ++ $i ){ $this ->_linkHandle[ 'slave' ][ $i ]->close(); } break ; // 關(guān)閉所有 case 1: $this ->getRedis()->close(); for ( $i =0; $i < $this ->_sn; ++ $i ){ $this ->_linkHandle[ 'slave' ][ $i ]->close(); } break ; } return true; } /** * 得到 Redis 原始對象可以有更多的操作 * * @param boolean $isMaster 返回服務(wù)器的類型 true:返回Master false:返回Slave * @param boolean $slaveOne 返回的Slave選擇 true:負(fù)載均衡隨機(jī)返回一個Slave選擇 false:返回所有的Slave選擇 * @return redis object */ public function getRedis( $isMaster =true, $slaveOne =true){ // 只返回 Master if ( $isMaster ){ return $this ->_linkHandle[ 'master' ]; } else { return $slaveOne ? $this ->_getSlaveRedis() : $this ->_linkHandle[ 'slave' ]; } } /** * 寫緩存 * * @param string $key 組存KEY * @param string $value 緩存值 * @param int $expire 過期時間, 0:表示無過期時間 */ public function set( $key , $value , $expire =0){ // 永不超時 if ( $expire == 0){ $ret = $this ->getRedis()->set( $key , $value ); } else { $ret = $this ->getRedis()->setex( $key , $expire , $value ); } return $ret ; } /** * 讀緩存 * * @param string $key 緩存KEY,支持一次取多個 $key = array('key1','key2') * @return string || boolean 失敗返回 false, 成功返回字符串 */ public function get( $key ){ // 是否一次取多個值 $func = is_array ( $key ) ? 'mGet' : 'get' ; // 沒有使用M/S if (! $this ->_isUseCluster){ return $this ->getRedis()->{ $func }( $key ); } // 使用了 M/S return $this ->_getSlaveRedis()->{ $func }( $key ); } /* // magic function public function __call($name,$arguments){ return call_user_func($name,$arguments); } */ /** * 條件形式設(shè)置緩存,如果 key 不存時就設(shè)置,存在時設(shè)置失敗 * * @param string $key 緩存KEY * @param string $value 緩存值 * @return boolean */ public function setnx( $key , $value ){ return $this ->getRedis()->setnx( $key , $value ); } /** * 刪除緩存 * * @param string || array $key 緩存KEY,支持單個健:"key1" 或多個健:array('key1','key2') * @return int 刪除的健的數(shù)量 */ public function remove( $key ){ // $key => "key1" || array('key1','key2') return $this ->getRedis()-> delete ( $key ); } /** * 值加加操作,類似 ++$i ,如果 key 不存在時自動設(shè)置為 0 后進(jìn)行加加操作 * * @param string $key 緩存KEY * @param int $default 操作時的默認(rèn)值 * @return int 操作后的值 */ public function incr( $key , $default =1){ if ( $default == 1){ return $this ->getRedis()->incr( $key ); } else { return $this ->getRedis()->incrBy( $key , $default ); } } /** * 值減減操作,類似 --$i ,如果 key 不存在時自動設(shè)置為 0 后進(jìn)行減減操作 * * @param string $key 緩存KEY * @param int $default 操作時的默認(rèn)值 * @return int 操作后的值 */ public function decr( $key , $default =1){ if ( $default == 1){ return $this ->getRedis()->decr( $key ); } else { return $this ->getRedis()->decrBy( $key , $default ); } } /** * 添空當(dāng)前數(shù)據(jù)庫 * * @return boolean */ public function clear(){ return $this ->getRedis()->flushDB(); } /* =================== 以下私有方法 =================== */ /** * 隨機(jī) HASH 得到 Redis Slave 服務(wù)器句柄 * * @return redis object */ private function _getSlaveRedis(){ // 就一臺 Slave 機(jī)直接返回 if ( $this ->_sn <= 1){ return $this ->_linkHandle[ 'slave' ][0]; } // 隨機(jī) Hash 得到 Slave 的句柄 $hash = $this ->_hashId(mt_rand(), $this ->_sn); return $this ->_linkHandle[ 'slave' ][ $hash ]; } /** * 根據(jù)ID得到 hash 后 0~m-1 之間的值 * * @param string $id * @param int $m * @return int */ private function _hashId( $id , $m =10) { //把字符串K轉(zhuǎn)換為 0~m-1 之間的一個值作為對應(yīng)記錄的散列地址 $k = md5( $id ); $l = strlen ( $k ); $b = bin2hex( $k ); $h = 0; for ( $i =0; $i < $l ; $i ++) { //相加模式HASH $h += substr ( $b , $i *2,2); } $hash = ( $h *1)% $m ; return $hash ; } /** * lpush */ public function lpush( $key , $value ){ return $this ->getRedis()->lpush( $key , $value ); } /** * add lpop */ public function lpop( $key ){ return $this ->getRedis()->lpop( $key ); } /** * lrange */ public function lrange( $key , $start , $end ){ return $this ->getRedis()->lrange( $key , $start , $end ); } /** * set hash opeation */ public function hset( $name , $key , $value ){ if ( is_array ( $value )){ return $this ->getRedis()->hset( $name , $key ,serialize( $value )); } return $this ->getRedis()->hset( $name , $key , $value ); } /** * get hash opeation */ public function hget( $name , $key = null, $serialize =true){ if ( $key ){ $row = $this ->getRedis()->hget( $name , $key ); if ( $row && $serialize ){ unserialize( $row ); } return $row ; } return $this ->getRedis()->hgetAll( $name ); } /** * delete hash opeation */ public function hdel( $name , $key = null){ if ( $key ){ return $this ->getRedis()->hdel( $name , $key ); } return $this ->getRedis()->hdel( $name ); } /** * Transaction start */ public function multi(){ return $this ->getRedis()->multi(); } /** * Transaction send */ public function exec (){ return $this ->getRedis()-> exec (); } } // End Class // ================= TEST DEMO ================= // 只有一臺 Redis 的應(yīng)用 $redis = new RedisCluster(); $redis ->connect( array ( 'host' => '127.0.0.1' , 'port' =>6379)); //* $cron_id = 10001; $CRON_KEY = 'CRON_LIST' ; // $PHONE_KEY = 'PHONE_LIST:' . $cron_id ; // //cron info $cron = $redis ->hget( $CRON_KEY , $cron_id ); if ( empty ( $cron )){ $cron = array ( 'id' =>10, 'name' => 'jackluo' ); //mysql data $redis ->hset( $CRON_KEY , $cron_id , $cron ); // set redis } //phone list $phone_list = $redis ->lrange( $PHONE_KEY ,0,-1); print_r( $phone_list ); if ( empty ( $phone_list )){ $phone_list = explode ( ',' , '13228191831,18608041585' ); //mysql data //join list if ( $phone_list ){ $redis ->multi(); foreach ( $phone_list as $phone ) { $redis ->lpush( $PHONE_KEY , $phone ); } $redis -> exec (); } } print_r( $phone_list ); /* $list = $redis ->hget( $cron_list ,); var_dump( $list );*/ //*/ //$redis->set('id',35); /* $redis ->lpush( 'test' , '1111' ); $redis ->lpush( 'test' , '2222' ); $redis ->lpush( 'test' , '3333' ); $list = $redis ->lrange( 'test' ,0,-1); print_r( $list ); $lpop = $redis ->lpop( 'test' ); print_r( $lpop ); $lpop = $redis ->lpop( 'test' ); print_r( $lpop ); $lpop = $redis ->lpop( 'test' ); print_r( $lpop ); */ // var_dump($redis->get('id')); |
希望本文所述對大家PHP程序設(shè)計有所幫助。