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 sprintf()函数让你的sql操作更安全
Jul 23 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 PHP
php5 图片验证码实现代码
Dec 11 PHP
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
Mar 27 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
Jul 05 PHP
php生成QRcode实例
Sep 22 PHP
php实现字符串反转输出的方法
Mar 14 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
Aug 07 PHP
PHPTree――php快速生成无限级分类
Mar 30 PHP
PHP实现的多进程控制demo示例
Jul 22 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 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
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
2011/07/23 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
2016/12/02 PHP
因str_replace导致的注入问题总结
2019/08/08 PHP
jquery ui dialog实现弹窗特效的思路及代码
2013/08/03 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python面向对象编程之继承与多态详解
2018/01/16 Python
python sys.argv[]用法实例详解
2018/05/25 Python
django1.11.1 models 数据库同步方法
2018/05/30 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
2018/10/11 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
详解python列表生成式和列表生成式器区别
2019/03/27 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
应届毕业生应聘自荐信范文
2014/02/26 职场文书
采购求职信
2014/03/17 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
计划生育工作汇报
2014/10/28 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书
布达拉宫的导游词
2015/02/02 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
投诉书范文
2015/07/02 职场文书
老人院义工活动感想
2015/08/07 职场文书
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang
JS + HTML 罗盘式时钟的实现
2021/05/21 Javascript
python获取对象信息的实例详解
2021/07/07 Python
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS