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 相关文章推荐
初学者入门:细述PHP4的核心Zend
Sep 05 PHP
PHP入门速成(2)
Oct 09 PHP
动易数据转成dedecms的php程序
Apr 07 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
Oct 14 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
Jun 30 PHP
Thinkphp连表查询及数据导出方法示例
Oct 15 PHP
php-fpm开启状态统计的方法详解
Jun 23 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
Aug 11 PHP
PHP通过get方法获得form表单数据方法总结
Sep 12 PHP
PHP设计模式之模板方法模式实例浅析
Dec 20 PHP
详解如何实现Laravel的服务容器的方法示例
Apr 15 PHP
php实现快速对二维数组某一列进行组装的方法小结
Dec 04 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
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
PHP脚本的10个技巧(7)
2006/10/09 PHP
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
Laravel5.7 Eloquent ORM快速入门详解
2019/04/12 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
js实现自动图片轮播代码
2017/03/22 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
JS中call()和apply()的功能及用法实例分析
2019/06/28 Javascript
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
python发腾讯微博代码分享
2014/01/10 Python
Python的Django框架下管理站点的基本方法
2015/07/17 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
Python虚拟环境的创建和包下载过程分析
2020/06/19 Python
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
庆祝儿童节标语
2014/10/09 职场文书
兼职安全员岗位职责
2015/02/15 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
青岛市的收音机研制与生产
2022/04/07 无线电