在一些用户创造内容的应用中(如: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. ASP.NET Excel导入到SQL Server数据库
  2. k8s的网络优化(metallb)
  3. oracle经常开关好吗,频繁开关机对电脑有什么影响吗?
  4. webview部分安卓机中文乱码
  5. VS2010 C# 4.0新特性一览
  6. OC 内存管理之手动内存管理MRC
  7. VFP+6.0中文版教程--初级教程
  8. CAN与CAN FD通信之间存在的问题
  9. 文件系统:NTFS、FAT32和exFAT
  10. win11系统完全使用ie浏览器的方法
  11. CFSSL 生成证书
  12. iphone手势识别(双击、捏、旋转、拖动、划动、长按)UITapGestureRecognizer
  13. 解决PyQt5程序报错Process finished with exit code -1073740791 (0xC0000409)
  14. html nav均匀分布的粘性导航栏
  15. web前端:img标签alt属性什么情况留空?
  16. 2022.05.18-使用Lightroom批量将图像从Raw转换为jpg
  17. 计算机信息技术奥赛实践,2018信息学奥赛 成绩_浅谈中学信息学奥林匹克竞赛课程的建设...
  18. SDL(Simple DirectMedia Layer)
  19. 机床数据采集之新代(SYNETC)IP网络地址参数设定
  20. 【CAP】代码即策略(CaP):编写自己代码的机器人 | Robots That Write Their Own Code

热门文章

  1. 求教Word自动生成的目录中标题无法顶格,编号与标题之间也存在空格无法消除怎么办,
  2. 展锐平台 取消蓝牙配对码弹框
  3. Android--打地鼠
  4. $.inArray()使用方法
  5. android 椭圆轨迹旋转,Android 倾斜椭圆绘制方法
  6. iPhone限制每天游戏时间,设置某些APP每天最长使用时间,未成年保护 - 《屏幕使用时间》密码设置
  7. Electron中使用bytenode保护nodejs代码实践
  8. web视频剪辑 在线视频编辑 开发类似:VE视频引擎 美摄sdk VESDK 蓝松短视频SDK 筷子saas剪辑 系统源码
  9. java怎么在文本框里输入文件,java中如何把窗体内文本框输入的内容保存到文件内?...
  10. 企业实战-Docker(三)网络