您的位置:首页 > 数据库 > Redis

Redis队列 实现消息推送功能

2013-04-03 18:23 806 查看
1.【redi.class.php】Redis基础类库

<?php
/**Redis基类
* @Author    ying.hui.xiao@163.com
* @Version 1.0
* @Date    2013-03-13
*/

class RedisClass{

//存储实例对象write/read
private static $redis_server = array();

//防止克隆对象
public function __clone(){
trigger_error('Clone is not allowed!', E_USER_ERROR);
}

//单利模式
public static function connect($CONFIG){
if(!isset(self::$redis_server[$CONFIG['server']])){
$redis = new Redis;
$redis -> connect($CONFIG['server'], $CONFIG['port']);
self::$redis_server[$CONFIG['server']] = $redis;
}
return self::$redis_server[$CONFIG['server']];
}

//存储
public function set($key, $value){
global $CONFIG;
$redis = self::connect($CONFIG['write']);
$redis -> set(md5($key), $value);
}

//存储(可设置缓存时间)
public function setex($key, $cache_time = 3600, $value){
global $CONFIG;
$redis = self::connect($CONFIG['write']);
$redis -> setex(md5($key), $cache_time, $value);
}

//存储(若$key不存在则存储返回TURE,存在不执行返回FALSE)
public function setnx($key, $value){
global $CONFIG;
$redis = self::connect($CONFIG['write']);
$redis -> setnx(md5($key), $value);
}

//读取
public function get($key){
global $CONFIG;
$redis = self::connect($CONFIG['read']);
return $redis -> get(md5($key));
}

//删除(一个或一组键值)
public function delete($keys){
global $CONFIG;
$redis = self::connect($CONFIG['write']);
foreach($keys as &$key){
$key = md5($key);
}
return $redis -> delete($keys);
}

//List相关操作(处理队列)
//在$key的list的左边(头) 添加一个元素
public function lpush($key, $value){
global $CONFIG;
$redis = self::connect($CONFIG['write']);
$redis -> lPush(md5($key), $value);
}

//在$key的list的右边(尾) 添加一个元素
public function rpush($key, $value){
global $CONFIG;
$redis = self::connect($CONFIG['write']);
$redis -> rPush(md5($key), $value);
}

//在$key的list的左边(头) 添加一个元素 如果value已经存在,则不添加
public function lpushx($key, $value){
global $CONFIG;
$redis = self::connect($CONFIG['write']);
$redis -> lPushx(md5($key), $value);
}

//在$key的list的右边(尾) 添加一个元素 如果value已经存在,则不添加
public function rpushx($key, $value){
global $CONFIG;
$redis = self::connect($CONFIG['write']);
$redis -> rPushx(md5($key), $value);
}

//在$key的list的左边(头) 添加一个元素 如果value已经存在,则不添加
public function lpop($key){
global $CONFIG;
$redis = self::connect($CONFIG['write']);
return $redis -> lPop(md5($key));
}

//在$key的list的右边(尾) 添加一个元素 如果value已经存在,则不添加
public function rpop($key){
global $CONFIG;
$redis = self::connect($CONFIG['write']);
return $redis -> rPop(md5($key));
}

//获取list列表中索引为index的元素
public function lget($key, $index){
global $CONFIG;
$redis = self::connect($CONFIG['read']);
return $redis -> lGet(md5($key), $index);
}

//为list列表中索引为index的元素赋值
public function lset($key, $index, $value){
global $CONFIG;
$redis = self::connect($CONFIG['write']);
$redis -> lSet(md5($key), $index, $value);
}

//为list列表中元素个数
public function lsize($key){
global $CONFIG;
$redis = self::connect($CONFIG['read']);
return $redis->lSize(md5($key));
}

}


2.【config_inc.php】服务器配置文件

//Config配置文件
//写服务器
$CONFIG['write']['server'] = '127.0.0.1';
$CONFIG['write']['port']   = 6379;
//读服务器
$CONFIG['read']['server']  = '127.0.0.1';
$CONFIG['read']['port']    = 6379;


3.【redis_push.php】入队操作

/**Redis入队操作
* @Author    ying.hui.xiao@163.com
* @Version 1.0
* @Date    2013-03-13
*/

include_once('config_inc.php');
include_once('redis.class.php');

//供数据库操作类中调用
$redis = new RedisClass();

//右侧入队
for($i = 0; $i < 1000; $i ++){
$redis -> rpush('redis_push', 'SID:' . $i);
}


4.【redis_pop.php】出队操作

/**Redis出队操作
* @Author    ying.hui.xiao@163.com
* @Version 1.0
* @Date    2013-03-13
*/

include_once('config_inc.php');
include_once('redis.class.php');

//供数据库操作类中调用
$redis = new RedisClass();

//出队操作(使用push.sh执行出队)
echo $redis -> lpop('redis_push');
echo '<br />';
echo $redis -> lsize('redis_push');


5.【pop.sh】出队shell脚本操作

#!/bin/bash
#执行出队
url="http://localhost/redis/push/redis_pop.php";
CURL=$(which curl)
while true
do
#$CURL $url
#$CURL $url >> /usr/local/apache2/htdocs/redis/push/push.log 2>&1
sleep 2
done


6.【push.log】出队日志文件

空文件push.log

1.执行redis_push.php 入队

2.执行shell脚本让redis_pop.php执行出队 并入日志
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: