Windows环境安装PHP redis扩展
发布时间:2017-11-01, 18:13:40 分类:PHP | 编辑 off 网址 | 辅助
图集1/5
正文 1795字数 556,178阅读
1、简介
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,
2、windows下安装
下载地址。下载到的Redis支持32bit和64bit。把文件内容拷贝到需要安装的目录下,比如:D:\dev\redis-2.4.5。
打开一个cmd窗口(不能关闭),使用cd命令切换到指定目录(D:\dev\redis-2.4.5)运行 。运行以后出现如下界面。
这就说明Redis服务端已经安装成功。
重新打开一个cmd窗口(不能关闭)(windows系统环境服务器安装使用Sphinx和coreseek中文分词核心配置uni.lib词典 将SPHINX安装成windows服务程序,这样系统启动时会自行运行sphinx),使用cd命令切换到指定目录(D:\dev\redis-2.4.5)运行,其中 127.0.0.1是本地ip,6379是redis服务端的默认端口。运行成功如下图所示。
这样,Redis windows环境下搭建已经完成,
测试:存储一个key为test,value为hello word的字符串,然后获取key值。
正确输出 hell word,
下载地址。下载到的Redis支持32bit和64bit。把文件内容拷贝到需要安装的目录下,比如:D:\dev\redis-2.4.5。
打开一个cmd窗口(不能关闭),使用cd命令切换到指定目录(D:\dev\redis-2.4.5)运行
redis-server.exe redis.conf
Run code
Cut to clipboard
重新打开一个cmd窗口(不能关闭)(windows系统环境服务器安装使用Sphinx和coreseek中文分词核心配置uni.lib词典 将SPHINX安装成windows服务程序,这样系统启动时会自行运行sphinx),使用cd命令切换到指定目录(D:\dev\redis-2.4.5)运行
redis-cli.exe -h 127.0.0.1 -p 6379
Run code
Cut to clipboard
测试:存储一个key为test,value为hello word的字符串,然后获取key值。
3、PHP中使用
下载 dll文件 官方
首先把php_redis.dll 和 php_igbinary.dll 放入PHP的ext文件夹,
Non Thread Safe 和 Thread Safe 两个版本
然后在php.ini配置文件里添加如下代码(可能需要填写完整路径):
重启web服务器(可能需要重启服务器)
注意:extension=php_igbinary.dll一定要放在extension=php_redis.dll的前面,否则此扩展不会生效
下载 dll文件 官方
首先把php_redis.dll 和 php_igbinary.dll 放入PHP的ext文件夹,
Non Thread Safe 和 Thread Safe 两个版本
通过phpinfo();
<?php phpinfo(); ?>
查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,
如果是:enabled,一般来说应该是ts版,否则是nts版。
Run code
Cut to clipboard
然后在php.ini配置文件里添加如下代码(可能需要填写完整路径):
extension=php_igbinary.dll
extension=php_redis.dll
extension="D:\UPUPW_NP5.6-1511\UPUPW_NP5.6\PHP5\ext\php_igbinary.dll"
extension="D:\UPUPW_NP5.6-1511\UPUPW_NP5.6\PHP5\ext\php_redis.dll"
Run code
Cut to clipboard
重启web服务器(可能需要重启服务器)
注意:extension=php_igbinary.dll一定要放在extension=php_redis.dll的前面,否则此扩展不会生效
4、PHP中使用
输出 hello redis 成功!
<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$redis->set('test','hello redis');
echo $redis->get('test');
?>
Run code
Cut to clipboard
输出 hello redis 成功!
(支付宝)给作者钱财以资鼓励 (微信)→
有过 5 条评论 »
官方php_redis.dll http://windows.php.net/downloads/pecl/releases/redis/2.2.7/ 官方 linux版本的 https://pecl.php.net/package/redis 官方 php_memcache.dll http://windows.php.net/downloads/pecl/releases/memcache/3.0.8/ 更多 http://windows.php.net/downloads/pecl/ PHP7.1 php_redis.dll 下载地址:http://windows.php.net/downloads/pecl/releases/redis/3.1.2/
将请求存入redis
为了模拟多个用户的请求,使用一个for循环替代
//redis数据入队操作 $redis = new Redis(); $redis->connect('127.0.0.1',6379); for($i=0;$i<50;$i++){ try{ $redis->LPUSH('click',rand(1000,5000)); }catch(Exception $e){ echo $e->getMessage(); } }
在后台进行数据处理
守护进程
//redis数据出队操作,从redis中将请求取出 $redis = new Redis(); $redis->pconnect('127.0.0.1',6379); while(true){ try{ $value = $redis->LPOP('click'); if(!$value){ break; } //var_dump($value)."\n"; /* * 利用$value进行逻辑和数据处理 */ }catch(Exception $e){ echo $e->getMessage(); } }
针对并发控制可以使用 memcacheq ,redis channle 等方式处理
这里我单单的说一下redis 怎么去控制并发
redis控制并发主要采用 redis list api 中的 lPush llen lPop 这三个函数
lLen - 获得列表的长度
lPop - 删除列表的第一个值并返回它
lPush - 插入一个值到列表中,如果列表不存在,新建一个列表
比如我这边现在有个抢购的需求。一个商品只运行抢200个 大概思路如下
每次查看 redis 消息队列 长度是否已经超过 或 = 200 这种写法有可能会有多抢的情况。
所以我们这边后端的单独起一个程序做队列处理。如果说数量太多那就后面的不进行处理操作。
当然。这个前端已经进入队列的用户。你不能告诉人家您已经抢到了。应该让他5分钟后再去看看结果。
这样处理的数量不会去超出。当然如果并发太大的话可以专门寻找处理并发架构,
如果要求用户体验友好那就用socket获取后端处理结果告诉用户是否抢到。redis处理还是蛮快的所以不用担心用户等待时间过长
队列是一种线性表,按照先进先出的原则进行的:
PHP实现队列原理看看各语言实现队列的方法:
各语言实现队列的方法PHP实现队列:第一个元素作为队头,最后一个元素作为队尾
<?php /** * 队列就是这么简单 * * @link http://www.phpddt.com */ $array = array('PHP', 'JAVA'); array_push($array, 'PYTHON'); //入队列 array_shift($array); //出队列
什么是双端队列(或双向队列)Deque,全名double-ended queue?
即元素可以在队列的任意一段入队或出队,如果我们把这些方法叫做insertLeft()和insertRight(),以及removeLeft()和removeRight()。如果严格禁止调用insertLeft()和removeLeft()方法(或禁用右段的操作),双端队列功能就和栈一样。禁止调用insertLeft()和removeRight()(或相反的另一对方法),它的功能就和队列一样了。双端队列与栈或队列相比,是一种多用途的数据结构。
PHP实现双端队列:
<?php class Deque { public $queue = array(); /**(尾部)入队 **/ public function addLast($value) { return array_push($this->queue,$value); } /**(尾部)出队**/ public function removeLast() { return array_pop($this->queue); } /**(头部)入队**/ public function addFirst($value) { return array_unshift($this->queue,$value); } /**(头部)出队**/ public function removeFirst() { return array_shift($this->queue); } /**清空队列**/ public function makeEmpty() { unset($this->queue); } /**获取列头**/ public function getFirst() { return reset($this->queue); } /** 获取列尾 **/ public function getLast() { return end($this->queue); } /** 获取长度 **/ public function getLength() { return count($this->queue); } }
队列的用途:
队列可以很好地异步处理数据传送和存储,当你频繁地向数据库中插入数据、频繁地向搜索引擎提交数据,就可采取队列来异步插入。另外,还可以将较慢的处理逻辑、有并发数量限制的处理逻辑,通过消息队列放在后台处理,例如FLV视频转换、发送手机短信、发送电子邮件等。
此队列算法中有两个类一个是data类,这个类是存放数据;第二个是queue也就是队列类这个就是队列的一些操作。
首先队列里包含front(队列的头,也就是出队是要出去的) rear(队列的尾部在这里永远指向0) queue(存放所有入队的data对像,queue中默认存在一个元素当空时front和rear都指向他) maxsize(队列的长度)四个属性
应用说明:
1初始化队列:生成一个队列传入一个参数作为maxsize初始化队列把rear设为0 ,front设为0此时queue中只有0号元素rear和front都指向他
2.入队:判断队列是否已满(front-rear==maxsize),如果满提示,若果没满先让front+1,然后让所有队列中的元素像前移动一位(也就是给新来的让出队尾位置),然后生成data对象插入到队尾+1的位置。此时入队成功!
3.出队:判断队列是否为空(front==rear),如空提示,如不为空,删除front指向的对象,front-1(向后移动一位),出队成功!
<?php /** * php队列算法 * * Create On 2010-6-4 * Author Been * QQ:281443751 * Email:binbin1129@126.com **/ class data { //数据 private $data; public function __construct($data){ $this->data=$data; echo $data.":哥进队了!<br>"; } public function getData(){ return $this->data; } public function __destruct(){ echo $this->data.":哥走了!<br>"; } } class queue{ protected $front;//队头 protected $rear;//队尾 protected $queue=array('0'=>'队尾');//存储队列 protected $maxsize;//最大数 public function __construct($size){ $this->initQ($size); } //初始化队列 private function initQ($size){ $this->front=0; $this->rear=0; $this->maxsize=$size; } //判断队空 public function QIsEmpty(){ return $this->front==$this->rear; } //判断队满 public function QIsFull(){ return ($this->front-$this->rear)==$this->maxsize; } //获取队首数据 public function getFrontDate(){ return $this->queue[$this->front]->getData(); } //入队 public function InQ($data){ if($this->QIsFull())echo $data.":我一来咋就满了!(队满不能入队,请等待!)<br>"; else { $this->front++; for($i=$this->front;$i>$this->rear;$i--){ //echo $data; if($this->queue[$i])unset($this->queue[$i]); $this->queue[$i]=$this->queue[$i-1]; } $this->queue[$this->rear+1]=new data($data); //print_r($this->queue); //echo $this->front; echo '入队成功!<br>'; } } //出队 public function OutQ(){ if($this->QIsEmpty())echo "队空不能出队!<br>"; else{ unset($this->queue[$this->front]); $this->front--; //print_r($this->queue); //echo $this->front; echo "出队成功!<br>"; } } } $q=new queue(3); $q->InQ("小苗"); $q->InQ('马帅'); $q->InQ('溜冰'); $q->InQ('张世佳'); $q->OutQ(); $q->InQ("周瑞晓"); $q->OutQ(); $q->OutQ(); $q->OutQ(); $q->OutQ();