一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - PHP實(shí)現(xiàn)操作redis的封裝類完整實(shí)例

PHP實(shí)現(xiàn)操作redis的封裝類完整實(shí)例

2020-12-01 16:12jackluo PHP教程

這篇文章主要介紹了PHP實(shí)現(xiàn)操作redis的封裝類,以完整實(shí)例形式較為詳細(xì)的分析了PHP操作redis的自定義類及其相關(guān)使用方法,具有一定參考借鑒價值,需要的朋友可以參考下

本文實(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è)計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲天堂精品在线 | 亚洲第一页综合 | 午夜福利08550| 久草高清在线 | 国产不卡视频一区二区在线观看 | 国内精品国语自产拍在线观看55 | 四虎精品视频在线永久免费观看 | 男人的天堂久久精品激情 | 成人中文字幕在线观看 | 羞羞答答免费人成黄页在线观看国产 | 国产伦精品一区二区三区免费迷 | 人与善交大片免费看 | 经典欧美gifxxoo动态图暗网 | 欧美一级视 | 亚洲欧美日韩精品高清 | 91精品婷婷国产综合久久8 | 久久九九久精品国产尤物 | free chinese麻豆| 日本高清视频网站 | 日韩视频一区二区三区 | 大象视频污 | 国产麻豆精品视频 | 91大神在线精品播放 | 爽爽影院免费观看 | 色老大在线 | 精品一产品大全 | 国色天香社区视频免费高清在线观看 | 国产高清视频一区二区 | 500福利第一巨人导航 | 2021国产麻豆剧传媒剧情 | ass天天裸妇pics | 黑人女性猛交xxxxxⅹxx | 暴露狂婷婷医院暴露tx | 天美麻豆| 黄篇网站在线观看 | 日韩欧美在线视频一区二区 | 四虎2020紧急免费入口 | 久久精品国产视频澳门 | 国产精品刺激好大好爽视频 | 香港论理午夜电影网 | 日本在线观看www鲁啊鲁视频 |