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一句话cmdshell新型 (非一句话木马)
Apr 18 PHP
shopex中集成的站长统计功能的代码简单分析
Aug 11 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
Nov 07 PHP
PHP读取数据库并按照中文名称进行排序实现代码
Jan 29 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
Jun 25 PHP
PHP字符串长度计算 - strlen()函数使用介绍
Oct 15 PHP
destoon整合UCenter图文教程
Jun 21 PHP
在SAE上搭建最新wordpress的方法
Dec 21 PHP
简单谈谈php浮点数精确运算
Mar 10 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 PHP
PHP检测一个数组有没有定义的方法步骤
Jul 20 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
中国第一家无线电行
2021/03/01 无线电
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
PHP中echo和print的区别
2014/08/28 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
『jQuery』名称冲突使用noConflict方法解决
2013/04/22 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
基于javascript 闭包基础分享
2013/07/10 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
vue.js iview打包上线后字体图标不显示解决办法
2020/01/20 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
[55:42]VG vs VGJ.T 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python装饰器的函数式编程详解
2015/02/27 Python
Python基于select实现的socket服务器
2016/04/13 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
通过canvas转换颜色为RGBA格式及性能问题的解决
2019/11/22 HTML / CSS
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
毕业生动漫设计求职信
2013/10/11 职场文书
自荐书模板
2013/12/15 职场文书
《观舞记》教学反思
2014/04/16 职场文书
环保宣传标语
2014/06/12 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
金融专业求职信
2014/08/05 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
工作后的感想
2015/08/07 职场文书