thinkphp3.1 redis驱动

  1 <?php
  2 // +----------------------------------------------------------------------
  3 // | © 2015 DBRedis.class.php
  4 // +----------------------------------------------------------------------
  5 // | Author: banpingshui
  6 // +----------------------------------------------------------------------
  7
  8 defined(‘THINK_PATH‘) or exit();
  9 class DbRedis extends Db{
 10     protected $_redis           =   null; // Redis Object
 11     protected $_keyname      =   null; // Redis Key
 12     protected $_dbName          =   ‘‘; // dbName
 13     protected $_cursor          =   null; // Reids Cursor Object
 14     /**
 15      * 架构函数 读取数据库配置信息
 16      * @access public
 17      * @param array $config 数据库配置数组
 18      */
 19     public function __construct($config=‘‘){
 21         if ( !class_exists(‘redis‘) ) {
 22             throw_exception(L(‘_NOT_SUPPERT_‘).‘:redis‘);
 23         }
 24         if(!empty($config)) {
 25             $this->config = $config;
 26             if(empty($this->config[‘params‘])) {
 27                 $this->config[‘params‘] =   array();
 28             }
 29
 30         }
 31     }
 32     /**
 33      * 连接数据库方法
 34      * @access public
 35      */
 36     public function connect($config=‘‘,$linkNum=0) {
 37         if ( !isset($this->linkID[$linkNum]) ) {
 38             if(empty($config))  $config =   $this->config;
 39
 40             $redis = new Redis();
 41             $redis->connect($config["hostname"]?$config["hostname"]:"localhost",$config["hostport"]?$config["hostport"]:6379);
 42             //$redis->auth($config["username"]?$config["username"]:"");
 43             //$info=$redis->info(); //如果连接的是twemproxy,这里必须要注释~~~
 44             // 标记连接成功
 45             if (true){
 46             //if (!empty($info["redis_version"])){
 47                 $this->linkID[$linkNum] = $redis;
 48                 $this->connected    =   true;
 49             }
 50             // 注销数据库连接配置信息
 51             if(1 != C(‘DB_DEPLOY_TYPE‘)) unset($this->config);
 52         }
 53         return $this->linkID[$linkNum];
 54     }
 55     /**
 56      * 切换当前操作的Db和redis key
 57      * @access public
 58      * @param string $keyname  redis key
 59      * @param string $db  db
 60      * @param boolean $master 是否主服务器
 61      * @return void
 62      */
 63     public function switchKey($keyname,$db=‘‘,$master=true){
 64         // 当前没有连接 则首先进行数据库连接
 65         if ( !$this->_linkID ) $this->initConnect($master);
 66         try{
 67             if(!empty($db)) { // 传入Db则切换数据库
 68                 // 当前MongoDb对象
 69                 $this->_dbName  =  $db;
 70                 $this->_redis = $this->_linkID->select($db);
 71             }
 72             // 当前MongoCollection对象
 73             if(C(‘DB_SQL_LOG‘)) {
 74                 $this->queryStr   =  $this->_dbName.‘.getKey(‘.$keyname.‘)‘;
 75             }
 76             if($this->_keyname != $keyname) {
 77                 N(‘db_read‘,1);
 78                 // 记录开始执行时间
 79                 G(‘queryStartTime‘);
 80                 $this->debug();
 81                 $this->_keyname  = $keyname;
 82             }
 83         }catch (Exception $e){
 84             throw_exception($e->getMessage());
 85         }
 86     }
 87     /**
 88      * 释放查询结果
 89      * @access public
 90      */
 91     public function free() {
 92         $this->_cursor = null;
 93     }
 94     /**
 95      * 关闭数据库
 96      * @access public
 97     */
 98     public function close() {
 99         if($this->_linkID) {
100             $this->_linkID->close();
101             $this->_linkID = null;
102             $this->_redis = null;
103             $this->_keyname =  null;
104             $this->_cursor = null;
105         }
106     }
107     /**
108      * 查找记录
109      * @access public
110      * @param array $options 表达式
111      * @return iterator
112      */
113     public function select($options=array()) {
115         if(isset($options[‘table‘])) {
116             $this->switchKey($options[‘table‘],‘‘,false);
117         }
118         $cache  =  isset($options[‘cache‘])?$options[‘cache‘]:false;
119         if($cache) { // 查询缓存检测
120             $key =  is_string($cache[‘key‘])?$cache[‘key‘]:md5(serialize($options));
121             $value   =  S($key,‘‘,‘‘,$cache[‘type‘]);
122             if(false !== $value) {
123                 return $value;
124             }
125         }
126         $this->model  =   $options[‘model‘];
127         N(‘db_query‘,1);
128         //$query  =  $this->parseWhere($options[‘where‘]);
129         $field =  $this->parseField($options[‘field‘]);
130         try{
131             if(C(‘DB_SQL_LOG‘)) {
132                // $this->queryStr   =  $this->_dbName.‘查询出错:‘.$field;
133             }
134             // 记录开始执行时间
135             G(‘queryStartTime‘);
136
137             if ($options[‘limit‘]){
138                 $limit=$this->parseLimit($options[‘limit‘]);
139             }else{
140                 $limit=array("0"=>0,"1"=>19);
141             }
142             if($options[‘type‘]) {
143                 if ($options["type"]==strtolower("list")){
144                     //列表
145                     $_cursor   = $this->_linkID->lRange($this->_keyname, $limit[0],$limit[1]);
146                 }elseif ($options["type"]==strtolower("sets")){
147                     //集合
148
149                     switch (strtolower($options["where"])) {
150                         case "sinterstore":
151                             //求交集
152                             $_cursor   = $this->_linkID->sInter($field);
153                             break;
154                         case "sunion":
155                             //求并集
156                             $_cursor   = $this->_linkID->sUnion($field);
157                             break;
158                         case "sdiff":
159                             //求差值
160                             $_cursor   = $this->_linkID->sDiff($field);
161                             break;
162                         default:
163                             $_cursor   = $this->_linkID->sMembers($this->_keyname);
164                     }
165                 }elseif ($options["type"]==strtolower("zset")){
166                     //有序集合
167                     if ($options["zscore"]){
168                         $_cursor   = $this->_linkID->zScore($this->_keyname, $options["zscore"]);
169                     } else {
170                         $zsets=$options["order"][0];
171                         $page=$options["page"]?$options["page"]:1;
172                         $limit[0]+=($page-1)*$options["limit"];
173                         $limit[1]+=($page-1)*$options["limit"];
174                         switch (strtolower($zsets)) {
175                             case strtolower("zRevRange"):
176                                 $_cursor   = $this->_linkID->zRevRange($this->_keyname, $limit[0],$limit[1],$options["order"][1]);
177                             break;
178
179                             default:
180                                 $_cursor   = $this->_linkID->zRange($this->_keyname, $limit[0],$limit[1],$options["order"][1]);
181                             break;
182                        }
183                     }
184                 }elseif ($options["type"]==strtolower("string")){
185                     //字符串
186                     $_cursor   = $this->_linkID->mget($field);
187                 }elseif ($options["type"]==strtolower("hash")){
188                     //HASH
189                     if (empty($field)){
190                         $_cursor   = $this->_linkID->hGetAll($this->_keyname);
191                     }else{
192                         $_cursor   = $this->_linkID->hmGet($this->_keyname,$field);
193                     }
194                 }
195             }else{
196                 $_cursor   = $this->_linkID->lRange($this->_keyname, $limit[0],$limit[1]);
197             }
198             $this->debug();
199             $this->_cursor =  $_cursor;
200             $resultSets  =  $_cursor;
201             if($cache && $resultSet ) { // 查询缓存写入
202                 S($key,$resultSet,$cache[‘expire‘],$cache[‘type‘]);
203             }
204             return $resultSets;
205         } catch (Exception $e) {
206             throw_exception($e->getMessage());
207         }
208
209     }
210     /**
211      * 统计记录数
212      * @access public
213      * @param array $options 表达式
214      * @return iterator
215      */
216     public function count($options=array()){
218         $count=0;
219         if(isset($options[‘table‘])) {
220             $this->switchKey($options[‘table‘],‘‘,false);
221         }
222         $this->model  =   $options[‘model‘];
223         N(‘db_query‘,1);
224         //$query  =  $this->parseWhere($options[‘where‘]);
225         $field =  $this->parseField($options[‘field‘]);
226         try{
227             if(C(‘DB_SQL_LOG‘)) {
228                 $this->queryStr   =  $this->_dbName.‘查询出错:‘.$field;
229             }
230             // 记录开始执行时间
231             G(‘queryStartTime‘);
232
233             if($options[‘type‘]) {
234                 if ($options["type"]==strtolower("list")){
235                     //列表
236                     $count = $this->_linkID->lSize($this->_keyname);
237                 }elseif ($options["type"]==strtolower("sets")){
238                     //集合
239                     $count = $this->_linkID->sCard($this->_keyname);
240                 }elseif ($options["type"]==strtolower("zset")){
241                     //有序集合
242                     $count = $this->_linkID->zCard($this->_keyname);
243                 }elseif ($options["type"]==strtolower("string")){
244                     //字符串
245                 }elseif ($options["type"]==strtolower("hash")){
246                     //HASH
247                     $count = $this->_linkID->hLen($this->_keyname);
248                 }elseif ($options["type"]==strtolower("hllc")){
249                     //HASH
250                     $count = $this->_linkID->pfCount($this->_keyname);
251                 }
252             }else{
253                 $count = $this->_linkID->lSize($this->_keyname);
254             }
255             $this->debug();
256             return $count;
257         } catch (Exception $e) {
259             throw_exception($e->getMessage());
260         }
261
262
263
264     }
265     /**
266      * 添加数据
267      * Enter description here ...
268      * @param unknown_type $options
269      * @param unknown_type $data
270      */
271     public function add($options=array(),$data){
272         if(isset($options[‘table‘])) {
273             $this->switchKey($options[‘table‘],‘‘,false);
274         }
275         $this->model  =   $options[‘model‘];
276         N(‘db_query‘,1);
277         //$query  =  $this->parseWhere($options[‘where‘]);
278         $field =  $this->parseField($options[‘field‘]);
279         try{
280             if(C(‘DB_SQL_LOG‘)) {
281                 $this->queryStr   =  $this->_dbName.‘查询出错:‘.$field;
282             }
283             // 记录开始执行时间
284             G(‘queryStartTime‘);
285             if($options[‘type‘]) {
286                 if ($options["type"]==strtolower("list")){
287                     //列表
288                     $add   = $this->_linkID->lPush($this->_keyname,$data);
289                 }elseif ($options["type"]==strtolower("sets")){
290                     //集合
291                     $add   = $this->_linkID->sAdd($this->_keyname,$data);
292                 }elseif ($options["type"]==strtolower("zset")){
293                     //有序集合
294                     foreach ($data as $key=>$value) {
295                         $add   = $this->_linkID->zAdd($this->_keyname,$key,$value);
296                     }
297
298                 }elseif ($options["type"]==strtolower("string")){
299                     //字符串
300                     $add   = $this->_linkID->mset($data);
301                 }elseif ($options["type"]==strtolower("hash")){
302                     //HASH
303                     $add   = $this->_linkID->hmSet($this->_keyname,$data);
304                 }
305             }else{
306                 $add   = $this->_linkID->lPush($this->_keyname,$data);
307             }
308             $this->debug();
309             return $add;
310         } catch (Exception $e) {
311             throw_exception($e->getMessage());
312         }
313     }
314     /**
315      * 删除数据
316      * Enter description here ...
317      * @param unknown_type $options
318      * @param unknown_type $data
319      */
320     public function delete($options=array(),$way=""){
321         if(isset($options[‘table‘])) {
322             $this->switchKey($options[‘table‘],‘‘,false);
323         }
324         $this->model  =   $options[‘model‘];
325         N(‘db_query‘,1);
326         //$query  =  $this->parseWhere($options[‘where‘]);
327         $field =  $this->parseField($options[‘field‘]);
328         try{
329             if(C(‘DB_SQL_LOG‘)) {
330                 $this->queryStr   =  $this->_dbName.‘查询出错:‘.$field;
331             }
332             // 记录开始执行时间
333             G(‘queryStartTime‘);
334             if ($options["type"]==strtolower("list") || empty($options["type"])){
335                     //列表
336                     switch (strtolower($way)) {
337                         case "lpop":
338                             $delete=$this->_linkID->lPop($this->_keyname);
339                             break;
340                         case "ltrim":
341                             $delete=$this->_linkID->lTrim(‘key‘, $options["where"][0], $options["where"][1]);
342                             break;
343                         default:
344                             if ($this->_linkID->lSet($this->_keyname,intval($options["where"]),"_deleted_")){
345                                 $delete=$this->_linkID->lRem($this->_keyname,"_deleted_",0);
346                             }
347                             break;
348                     }
349             }elseif ($options["type"]==strtolower("sets")){
350                     //集合
351                     $delete   = $this->_linkID->sRem($this->_keyname,$options["where"]);
352             }elseif ($options["type"]==strtolower("zset")){
353                     //有序集合
354                      switch (strtolower($way)) {
355                         case strtolower("zremrangebyscore"):
356                             $delete   = $this->_linkID->zRemRangeByScore($this->_keyname,$options["where"][0],$options["where"][1]);
357                         break;
358                         case strtolower("zRemRangeByRank"):
359                             $delete   = $this->_linkID->zRemRangeByRank($this->_keyname,$options["where"][0],$options["where"][1]);
360                         break;
361                         default:
362                             $delete   = $this->_linkID->zDelete($this->_keyname,$options["where"]);
363                         break;
364                     }
365
366             }elseif ($options["type"]==strtolower("string")){
367                     //字符串
368                     $delete   = $this->_linkID->delete($field);
369             }elseif ($options["type"]==strtolower("hash")){
370                     //HASH
371                     $delete   = $this->_linkID->hDel($this->_keyname, $options["where"]);
372             }
373             $this->debug();
374             return $delete;
375         } catch (Exception $e) {
376             throw_exception($e->getMessage());
377         }
378     }
379
380     /**
381      * limit分析
382      * @access protected
383      * @param mixed $limit
384      * @return array
385      */
386     protected function parseLimit($limit) {
387         $limit = $limit - 1;
388         if(strpos($limit,‘,‘)) {
389             $array  =  explode(‘,‘,$limit);
390         }else{
391             $array   =  array(0,$limit);
392         }
393         return $array;
394     }
395
396     /**
397      * field分析
398      * @access protected
399      * @param mixed $fields
400      * @return array
401      */
402     public function parseField($fields){
403         if (is_array($fields)){
404             return $fields;
405         }
406     }
407      /**
408      * 取得数据表的字段信息
409      * @access public
410      * @return array
411      */
412     public function getFields($keyname=‘‘){
413         if(!empty($keyname) && $keyname != $this->_keyname) {
414             $this->switchKey($keyname,‘‘,false);
415         }
416         N(‘db_query‘,1);
417         if(C(‘DB_SQL_LOG‘)) {
418             //$this->queryStr   =  $this->_dbName.‘.‘.$this->_collectionName.‘.findOne()‘;
419         }
420         try{
421             // 记录开始执行时间
422             G(‘queryStartTime‘);
423             $result   =  $this->_linkID->hkeys($this->_keyname);
424             $this->debug();
425         } catch (Exception $e) {
426             throw_exception($e->getMessage());
427         }
428         if($result) { // 存在数据则分析字段
429             $info =  array();
430             foreach ($result as $key=>$val){
431                 $info[$key] =  array(
432                     ‘name‘=>$key,
433                     ‘type‘=>getType($val),
434                     );
435             }
436             return $info;
437         }
438         // 暂时没有数据 返回false
439         return false;
440     }
441 }
442 ?>
443  
 1 <?php
 2 // +----------------------------------------------------------------------
 3 // | © 2015 RedisModel.class.php
 4 // +----------------------------------------------------------------------
 5 // | Author: banpingshui
 6 // +----------------------------------------------------------------------
 7
 8 class RedisModel extends Model{
 9     /**
10      * 利用__call方法实现一些特殊的Model方法
11      * @access public
12      * @param string $method 方法名称
13      * @param array $args 调用参数
14      * @return mixed
15      */
16     public function __call($method,$args) {
17         if(in_array(strtolower($method),array(‘type‘,‘where‘,‘order‘,‘limit‘,‘page‘,‘zscore‘),true)) {
18             // 连贯操作的实现
19             $this->options[strtolower($method)] =   $args[0];
20             return $this;
21         }else if(in_array(strtolower($method),array(‘key‘),true)){
22             $this->options[‘table‘] = $args[0];
23             return $this;
24         }else{
25             throw_exception(__CLASS__.‘:‘.$method.L(‘_METHOD_NOT_EXIST_‘));
26             return;
27         }
28     }
29     /**
30      * count统计 配合where连贯操作
31      * @access public
32      * @return integer
33      */
34
35     public function count($key){
36         // 分析表达式
37         $options =  $this->_parseOptions();
38         return $this->db->count($options);
39     }
40     public function add($data){
41         // 分析表达式
42         $options =  $this->_parseOptions();
43         return $this->db->add($options,$data);
44     }
45     public function delete($way=""){
46         // 分析表达式
47         $options =  $this->_parseOptions();
48         return $this->db->delete($options,$way);
49     }
50 }
51
52 ?>

目前还没有实现expire

时间: 2024-10-07 05:06:51

thinkphp3.1 redis驱动的相关文章

.net core redis 驱动推荐,为什么不使用 StackExchange.Redis

原文:.net core redis 驱动推荐,为什么不使用 StackExchange.Redis 前言 本人从事 .netcore 转型已两年有余,对 .net core 颇有好感,这一切得益于优秀的语法.框架设计. 2006年开始使用 .net 2.0,从 asp.net 到 winform 到 winservice 等等领域开发都些许涉猎.对.net和大多数同胞有着类似的感触,那是又爱又恨,波段大致是这样: 2010年以前,坚信 .net framework 能一统江湖霸业,不料在此之后

令人抓狂的Python redis和rediscluster驱动包的安装

本文环境:centos 7,Python3编译安装成功,包括pip3,然后需要安装redis相关的Python3驱动包,本的redis指redis包而非redis数据库,rediscluster类似. 先理清楚几个概念1,redis包更准确地说是redis-py包,是Python连接Redis的驱动文件,如果下载原始文件的话,文件名称就是redis-py-***.tar.gz2,rediscluster 包更准确地说是redis-py-cluster包,是Python连接Redis Cluste

使用redis减小数据库访问压力及提高系统性能

什么是redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会

Redis集群~StackExchange.redis连接Twemproxy代理服务器

回到目录 本文是Redis集群系列的一篇文章,主要介绍使用StackExchange.Redis进行Twemproxy(文中简称TW)代理服务的连接过程,事务上,对于TW来说,我们需要理解一下它的物理架构,它类似于Nugix,主要实现的是请求转发,但它还有一个重要的功能,那就是自动分片,这对于大数据是很必要的,你的服务器需要横向扩展时,不需要告诉客户端,这是一种很理解化的设计模式,当然,也对于Redis来说,在配置TW之后,是可以被全美支持的! 关于tw和Redis集群的设计图 关于StackE

Redis消息队列

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现. 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息:即对于每个消息只能被最多一个消费者拥有: 发布者订阅者模式:发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息:即正常情况下每个消费者收到的消息应该都是一样的: 对应的使用场景包括:A系统向队列中存放数据:B系统在队列中取数据: 1.redis队列模式:可

服务器上部署redis并且设置远程访问(Thinkphp5项目)

lnmp.org 安装的环境, 安装redis, 只需要目录下, 进入lnmp解压后的目录,执行:./addons.sh install redis 即可. 然后开启redis. 修改配置文件./usr/local/redis/etc/redis.conf protected-mode 要设置成no daemonize yes # bind 127.0.0.1requirepass ****** 开启运行. cd /usr/local/redis/bin ./redis-server /usr/

Java 连接使用 Redis

1. 开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java. 首先你需要下载驱动包,下载 jedis.jar,确保下载最新驱动包.(还有common-pool2...jar,见jedis.jar 的依赖jar包) 在你的classpath中包含该驱动包. 2. 连接到 redis 服务 import redis.clients.jedis.Jedis; public class RedisJava {

PHP 安装 Redis

安装 开始在 PHP 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 PHP redis 驱动,且你的机器上能正常使用 PHP. 接下来让我们安装 PHP redis 驱动:下载地址为:https://github.com/phpredis/phpredis/releases. PHP安装redis扩展 以下操作需要在下载的 phpredis 目录中完成: $ wget https://github.com/phpredis/phpredis/archive/2.2.4.t

Java 使用 Redis

安装 开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java. Java的安装配置可以参考我们的 Java开发环境配置 接下来让我们安装 Java redis 驱动: 首先你需要下载驱动包,下载 jedis.jar,确保下载最新驱动包. 在你的classpath中包含该驱动包. 连接到 redis 服务 import redis.clients.jedis.Jedis; public class Red