在一些用户创造内容的应用中(如:SNS、微博),可能出现1秒有上万个用户同时发布消息的情况,此时如果只只用MySQL数据库,很可能出现“too many connections”的错误,当然,我们可以把MySQL的max_connections参数设置为更大的值,但这是一个治标不治本的方法。这时,可以考虑使用Redis。
Redis非常适合处理这类高并发的写操作,使用Redis的list类型作为消息队列,把用户发布的消息暂时存储在消息队列中,接着使用一个cron程序把消息队列中的消息插入MySQL。这样,就可以有效减少MySQL的并发量。
例如,发布一条微博使用以下接口:
post($uid, $content, $timestamp);  // 写入MySQL数据库
?>
这种直接将用户提交的微博数据写入MySQL的方式,在高并发的情况下,很容易出现问题。Weibo对象的post方法就是发布微博的接口,它直接把微博写入MySQL。
为了降低MySQL的并发数,先把用户发布的微博存在Redis中,代码如下:
connect('127.0.0.1') || die('连接redis服务器失败!');        // 连接redis服务器
$redis->auth('foobared');    // 密码验证
$redis->select(0);        // 选择0号数据库
$redis->setOption(Redis::OPT_PREFIX, 'my-prefix:');    // 设置键名的前缀(相当于MySQL的表前缀)
$data = array('uid'        =>    strip_tags(trim($_POST['uid'])),  // 用户的id'content'    =>    strip_tags(trim($_POST['content'])),  // 微博的内容'timestamp'    =>    time()
);
$redis->lPush('weibo_list', json_encode($data));
$redis->close();    // 关闭redis数据库连接
?>
注意:要想在PHP中创建Redis对象,必须先安装phpredis扩展,安装方法可参考: http://blog.csdn.net/lamp_yang_3533/article/details/52555111
先把微博数据信息使用json_encode转换为json字符串,然后使用Redis对象的lpush方法把微博信息插入到weibo_list队列(链表类型)。
然后,编写一个cron程序(计划任务)把Redis中的微博信息依次插入到MySQL中,代码如下:
connect('127.0.0.1') || die('连接redis服务器失败!');        // 连接redis服务器
$redis->auth('foobared');    // 密码验证
$redis->select(0);        // 选择0号数据库
$redis->setOption(Redis::OPT_PREFIX, 'my-prefix:');    // 设置键名的前缀(相当于MySQL的表前缀)$weibo = new Weibo();    // 创建Weibo对象
while (true) {if ($redis->lSize('weibo_list')>0) {$value = $redis->rPop('weibo_list');  // rpop方法配合lpush方法实现队列的先进先出$info = json_decode($value);$weibo->post($info->uid, $info->content, $info->timestamp);    // 写入MySQL数据库} else {sleep(1);    // 如果队列中没有任务,就睡眠1s,让出CPU给其他进程}
}
$redis->close();
?>
在该cron程序中,先使用Redis对象的rpop()方法从weibo_list列表中取得一条微博信息,然后使用json_decode()函数解码,最后调用Weibo对象的post方法把微博信息插入到MySQL。
使用消息队列有一个缺点,就是“延时”。为了把延时降到最低,运行多个cron程序同时把消息队列中的数据插入MySQL。使用消息队列的好处是扩展性好,当一台Redis服务器不能应付大量并发时,使用“一致性Hash算法”把并发分发到多个Redis服务器。

Redis应用——使用消息队列发布微博相关推荐

  1. Redis应用实践-使用消息队列发布微博

    使用消息队列发布微博 有时候我们的应用中(如:微博)会出现这样的情况,一秒钟有很多用户同时发布消息.这个时候数据库Mysql可能会出现"too many connections". ...

  2. Redis消息队列发布微博

    一些基于用户创造内容的应用中(SNS,微博),很容易出现一秒钟上万个用户同时发布消息的情况.这个时候,很容易出现MySQL的"too many connections"的情况,增大 ...

  3. PHP下使用Redis消息队列发布微博(复制)

    phpRedisAdmin :github地址  图形化管理界面 git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git cd ph ...

  4. 微博群发私信 php,PHP下使用Redis消息队列发布微博

    phpRedisAdmin :github地址  图形化管理界面 git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git cd ph ...

  5. php 队列 与 radis,php和redis怎么实现消息队列

    把瞬间服务器的请求处理换成异步处理,缓解服务器的压力,实现数据顺序排列获取.本文主要和大家分享php和redis如何实现消息队列,希望能帮助到大家. redis实现消息队列步骤如下: 1).redis ...

  6. Java实现redis消息队列发布/订阅模式

    最近在一个老项目中需要用消息队列,本来想着用卡夫卡,但是试了几个版本之后发现jdk和卡夫卡版本一直对不上,最后选择用redis来实现消息队列的发布/订阅模式.感谢这位大佬的博客给了我很多的帮助,htt ...

  7. 调试笔记 — Redis 消息队列发布信息被消费者重复订阅多次牵扯到的 Tomcat 配置问题 [#00001]

    最近在项目中发现了一个奇葩的 BUG ,当用户调用后台时,后台向消息队列中发布一条消息,这条消息会被监听器(消费者)监听到,有趣的事情就在这里,此时由于只发送了一条消息,照理说监听器应该只会触发一次, ...

  8. 使用 Redis Stream 实现消息队列

    使用 Redis Stream 实现消息队列 Intro Redis 5.0 中增加了 Stream 的支持,利用 Stream 我们可以实现可靠的消息队列,并且支持一个消息被多个消费者所消费,可以很 ...

  9. redis 消息队列 过段时间不能下发_以Redis来谈消息队列

    首先 我先引入一个大家熟知的观点:Reids可以作为消息队列来使用 redis提供了两种方式来做消息队列,一种是生产者消费者模式,一种是发布订阅模式. 本篇文章将从 异步,解耦,分布式,可靠四部分来探 ...

最新文章

  1. 2019-2020-3 《Java 程序设计》第三周知识总结
  2. 请别埋没了URL Routing
  3. 程序间数据共享与传递(3):EXPORT/IMPORT、SAP/ABAP Memory
  4. Kafka如何实现每秒上百万的超高并发写入?
  5. variable 'xxx' unsafe in 'case'的处理
  6. C语言试题三之计算并输出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5))
  7. QT连接多种数据库f方法及测试
  8. MySQL系统自带的数据库information schema
  9. Struts2 自定义验证器
  10. Spring MVC学习总结(4)——SpringMVC权限管理
  11. Android Studio 设置主题及字体
  12. 架构师速成8.3-可用性之分库分表
  13. 最短路径(二维矩阵)
  14. sumk 2.0.0 发布,轻量级互联网框架
  15. vue 父子之间通信及非父子之间通信
  16. 网站地图(sitemap)在线生成
  17. echats统计图表的设计与实现
  18. JSP页面如何从一个页面传递一个参数到另外一个页面
  19. 并行计算与集群技术(2)
  20. 关于Ubuntu14.04拼音不能正常使用的解决方案

热门文章

  1. MySQL8读写分离集群
  2. sql语句查询表字段
  3. sql语句查询数据库中所有表名
  4. 计算机专业对手速要求高吗,想好玩星际争霸2 需要什么配置,手速要达到多少比较好呢...
  5. html打造动画【系列3】- 小猫笑脸动画
  6. 如何熟练地配置和微调 MacBook Pro 的显示屏幕
  7. 基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)
  8. python是否高送转预测股票_用Python分析公开数据选出高送转预期股票
  9. docker配置java环境(dockerfile方式)
  10. cpu对推动计算机发展的作用,一篇能让你详细了解CPU的作用与发展的文章!