redis 队列操作的例子(php)


Posted in PHP onApril 12, 2012

入队操作

<?php 
$redis = new Redis(); 
$redis->connect('127.0.0.1',6379); 
while(True){ 
try{ 
$value = 'value_'.date('Y-m-d H:i:s'); 
$redis->LPUSH('key1',$value); 
sleep(rand()%3); 
echo $value."\n"; 
}catch(Exception $e){ 
echo $e->getMessage()."\n"; 
} 
} 
?>

出队操作
<?php 
$redis = new Redis(); 
$redis->pconnect('127.0.0.1',6379); 
while(True){ 
try{ 
echo $redis->LPOP('key1')."\n"; 
}catch(Exception $e){ 
echo $e->getMessage()."\n"; 
} 
sleep(rand()%3); 
}?>

如何使用Redis 做队列操作
Reids是一个比较高级的开源key-value存储系统,采用ANSI C实现。其与memcached类似,但是支持持久化数据存储,同时value支持多种类型:字符串 (同memcached中的value),列表 ,集合 (Set),有序集合 (OrderSet)和Hash 。所有的值类型均支持原子操作,如列表中追加弹出元素,集合中插入移除元素等。Rdids的数据大部分位于内存中,其读写效率非常高,其提供AOF(追加 式操作记录文件)和DUMP(定期数据备份)两种持久化方式。Redis支持自定义的VM(虚拟内存)机制,当数据容量超过内存时,可以将部分Value 存储到文件中。同时Redis支持Master-Slave机制,可以进行数据复制。
可以把Redis的list结构当队列来用.
从上面Redis的场景和作用来说,对于我们现在的开发活动,究竟能把Redis引入在那些场景,而不是把这么好的东东演变成“为了使用Redis,而Redis”的惨烈局面呢?当然,具体问题具体分析,这个真的很重要哈。
缓存?分布式缓存?
队列?分布式队列?
某些系统应用(例如,电信、银行和大型互联网应用等)都会使用到,当然,现在大行其道的memcache就是很好的证明;但从某一方面来说,memcache是否能把两张囊括其中,而且能做到更好(没有实际的应用过,所以只是抛出)。但从Redis身上,我就能感觉到,Redis,就能把队列和缓存两张都囊括其中,而且都不会产生并发环境下的困扰,因为Redis中的操作都是原子操作来着。
至于评论两者的孰好孰坏就免了,存在就是理由,选择适合的就是最好的。
下面开始玩玩Redis中的队列(分布式)设计YY吧,请大虾们多多指点。
状况场景:
现在的项目,都是部署在多个服务器,或者多个IP上,而且前台经由F5分发,所以用户的请求究竟落在那一台的服务器上,是无法确定的。对于项目中,有一秒杀设计,刚开始没有考虑到这种部署,同时也是使用最容易处理的方式,直接给数据库表锁行记录(Oracle上的)。可以说,对于不同的应用部署,而只有一台数据库服务器来说,很“轻松”的就解决了这个并发的问题。所以现在考虑一下,是不是挪到应用上,避免数据库服务器也掺杂到业务上。
比如,现在有2台应用服务器,1台数据库服务器。想法是,把Redis部署在数据库服务器上,两台服务器在操作并发缓存或者队列时,先从Redis服务器上,取得在两台应用服务器的代理对象,再做入列出列的操作。
看代码实现(PHP)
入队列操作文件 list_push.php
<?php 
$redis = getRedisInstance();//从Redis服务器拿到redis实例 
$redis->connect('Redis服务器IP', 6379); 
while (true) { 
$redis->lPush('list1', 'A_'.date('Y-m-d H:i:s')); 
sleep(rand()%3); 
} 
?>

执行# php list_push.php &
出队列操作 list_pop.php文件
<?php 
$redis = getRedisInstance();//从Redis服务器拿到redis实例 
$redis->pconnect('Redis服务器IP', 6379); 
while(true) { 
try { 
var_export( $redis->blPop('list1', 10) ); 
} catch(Exception $e) { 
//echo $e; 
} 
}

实现方法(Python)
1.入队列(write.py)
#!/usr/bin/env python 
import time 
from redis import Redis 
redis = Redis(host='127.0.0.1', port=6379) 
while True: 
now = time.strftime("%Y/%m/%d %H:%M:%S") 
redis.lpush('test_queue', now) 
time.sleep(1)

2.出队列(read.py)
#!/usr/bin/env python 
import sys 
from redis import Redis 
redis = Redis(host='127.0.0.1', port=6379) 
while True: 
res = redis.rpop('test_queue') 
if res == None: 
pass 
else: 
print str(res)

在操作时,注意,要操作的是同一个list对象。
呵呵,现在的主要思路就差不多就是如此,不过真实场景中,会有出入。
PHP 相关文章推荐
php和javascript之间变量的传递实现代码
Dec 19 PHP
探讨:web上存漏洞及原理分析、防范方法
Jun 29 PHP
一个基于phpQuery的php通用采集类分享
Apr 09 PHP
phpmyadmin打开很慢的解决方法
Apr 21 PHP
PHP 二维数组根据某个字段排序的具体实现
Jun 03 PHP
php中实现精确设置session过期时间的方法
Jul 17 PHP
PHP使用静态方法的几个注意事项
Sep 16 PHP
PHP查看当前变量类型的方法
Jul 31 PHP
PHP实现的自定义数组排序函数与排序类示例
Nov 18 PHP
PHP实现对图片的反色处理功能【测试可用】
Feb 01 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
Feb 15 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 PHP
PHP得到某段时间区间的时间戳 php定时任务
Apr 12 #PHP
比较好用的PHP防注入漏洞过滤函数代码
Apr 11 #PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
Apr 09 #PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
Apr 09 #PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
Apr 09 #PHP
PHP乱码问题,UTF-8乱码常见问题小结
Apr 09 #PHP
PHP中return 和 exit 、break和contiue 区别与用法
Apr 09 #PHP
You might like
discuz安全提问算法
2007/06/06 PHP
php邮件发送,php发送邮件的类
2011/03/24 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
详解PHP匿名函数与注意事项
2016/03/29 PHP
WordPress中设置Post Type自定义文章类型的实例教程
2016/05/10 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
PHP简单实现循环链表功能示例
2017/11/10 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
基于Jquery的开发个代阴影的对话框效果代码
2011/07/28 Javascript
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
AngularJS ng-style中使用filter
2016/09/21 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
2018/11/15 Javascript
js实现百度淘宝搜索功能
2020/02/17 Javascript
JavaScript实现tab栏切换效果
2020/03/16 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2021/01/25 Javascript
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
python计算圆周率pi的方法
2015/07/11 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
什么是反射
2012/03/17 面试题
2015初中政教处工作总结
2015/07/21 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书