900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Redis消息队列发布微博

Redis消息队列发布微博

时间:2018-12-16 15:52:48

相关推荐

Redis消息队列发布微博

一些基于用户创造内容的应用中(SNS,微博),很容易出现一秒钟上万个用户同时发布消息的情况。这个时候,很容易出现MySQL的“too many connections”的情况,增大MySQL的max_connections只是治标不治本的方法,这个时候,我们就可以考虑使用reids的list来实现消息队列

使用redis的list类型作为消息队列,把用户发布的消息暂时存储在消息队列中,接着使用一个cron程序将消息队列中的消息插入mysql,这个方法,可以有效的降低MySQL的并发量。

下面是直接发布微博的接口:

<?php$uid = get_uid();$content = get_content();$timestamp = time();$weibo = new Weibo();//创建weibo对象$weibo->post($uid,$content,$timestamp);?>

上面的例子中,微博对象的post方法直接将微博写入MySQL,这样会存在一定的并发数,下面我们使用redis的list类型来实现微博发布。

第一步:将微博写入redis中

<?php$redis = new Redis('127.0.0.1',6379);$redis->connect();$weibo_info = array('uid'=>$get_uid,'content'=>get_content(),'timestamp'=>time());$redis->lpush('weibo_list',json_encode($weibo_info));$redis->close();?>

第二步:编写cron程序,来把redis的微博信息插入到MySQL:

<?php$redis = new Redis('127.0.0.1',6379);$redis->connect();$weibo = new Weibo();while(TRUE){if($redis->lsize('weibo_list')>0){$info = $redis->rpop('weibo_list');$info = json_decode($info);$weibo->post($info->uid,$info->content,$info->timestamp);}else{sleep(1);//如果队列中没有任务的时候,睡眠1s,让出cpu给其他进程}}$redis->close();?>

在cron程序中,先使用redis对象的rpop方法从weibo_list列表中取得一条微博信息,然后解码调用weibo对象的post方法插入到MySQL中。

但是使用消息队列有一个缺点:“延时”。为了将延时降到最低,运行多个cron程序同时把消息队列中的数据插入到MySQL中。使用消息队列的好处就是扩展性好,当一台redis服务器不能应付大量并发时,使用“一致性hash算法”把并发分发到不同redis服务器。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。