PHP使用redis消息队列发布微博的方法示例

本文实例讲述了PHP使用redis消息队列发布微博的方法。分享给大家供大家参考,具体如下:

在一些用户发布内容应用中,可能出现1秒上万个用户同时发布消息的情况,此时使用mysql可能会出现" too many connections"错误,当然把Mysql的max_connections参数设置为更大数,不过这是一个治标不治本的方法。而使用redis的消息队列,把用户发布的消息暂时存储在消息队列中,然后使用多个cron程序把消息队列中的数据插入到Mysql。这样就有效的降低了Mysql的高并发。具体实现原理如下:

现有微博发布接口:

$weibo = new Weibo();
$uid = $weibo->get_uid();
$content =$weibo->get_content;
$time = time();
$webi->post($uid,$content,$time);

此方法直接把微博内容写入Mysql。具体过程省略。

把消息写入到redis:

$redis = new Redis(localhost,6379);
$redis->connect();
$webiInfo = array('uid'=>get_uid(),'content'=>get_content(),'time'=>time());
$redis->lpush('weibo_list',json_encode($weiboInfo));
$redis->close();

从redis中取出数据:

while(true){
   if($redis->lsize('weibo_list') > 0){
     $info = $redis->rpop('weibo_list');
     $info = json_decode($info);
   }else{
     sleep(1);
   }
}
$weibo->post($info->uid,$info->content,$info->time);
//插入数据的时候可以用一次性插入多条数据的方法,避免循环插入,不停的循环插入可能会导致死锁问题。

提示:可以运行多个cron程序同时把消息队列的数据插入到Mysql中,当一台Redis服务器不能应付大量并发时,使用一致性Hash算法,把并发分发到不同的Redis服务器。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php+redis数据库程序设计技巧总结》、《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

时间: 2017-06-19

php 使用redis锁限制并发访问类示例

本文介绍了php 使用redis锁限制并发访问类,并详细的介绍了并发访问限制方法. 1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功. 例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制的情况下,用户则可以使用同一个换领码同时兑换到多张优惠券. 伪代码如下: if A(可以换领)     B(执行换领)     C(更新为已换领) D(结束) 如果用户并发提交换领码,都能通过可以换领(A)的判断,因

PHP的Laravel框架结合MySQL与Redis数据库的使用部署

相对于熟读官方文档,更重要的是要把框架环境搭起来. 零.环境介绍 操作系统:centOS 数据库: mysql 5.6 (阿里云RDS) PHP 5.4.4 (>=5.4即可) Laravel 5.0 一.安装LNMP 在安装Laravel之前,需要把Linux + Nginx + Mysql + Php的环境搭建好.具体的搭建步骤这里就不再详述了. P.S. Linux阿里云已经自带了,本文使用的是centOS 6.5 64位的ECS 关于Nginx和Apache的选择看自己喜好,本文使用的是

redis 队列操作的例子(php)

入队操作 复制代码 代码如下: <?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->g

PHP实现操作redis的封装类完整实例

本文实例讲述了PHP实现操作redis的封装类.分享给大家供大家参考,具体如下: <?php /** * Redis 操作,支持 Master/Slave 的负载集群 * * @author jackluo */ class RedisCluster{ // 是否使用 M/S 的读写集群方案 private $_isUseCluster = false; // Slave 句柄标记 private $_sn = 0; // 服务器连接句柄 private $_linkHandle = array

PHP实现电商订单自动确认收货redis队列

一.场景 之前做的电商平台,用户在收到货之后,大部分都不会主动的点击确认收货,导致给商家结款的时候,商家各种投诉,于是就根据需求,要做一个订单在发货之后的x天自动确认收货.所谓的订单自动确认收货,就是在在特定的时间,执行一条update语句,改变订单的状态. 二.思路 最笨重的做法,通过linux后台定时任务,查询符合条件的订单,然后update.最理想情况下,如果每分钟都有需要update的订单,这种方式也还行.奈何平台太小,以及卖家发货时间大部分也是密集的,不会分散在24小时的每分钟.那么,

PHP实现Session入库/存入redis的方法

对于大访问量的站点使用默认的Session 并不合适,我们可以将其存入数据库.或者使用Redis KEY-VALUE数据存储方案 首先新建一个session表 CREATE TABLE `sessions` ( `sid` char(40) NOT NULL, `updatetime` int(20) NOT NULL, `data` varchar(200) NOT NULL, UNIQUE KEY `sid` (`sid`) USING HASH ) ENGINE=MEMORY DEFAUL

PHP实现的Redis多库选择功能单例类

本文实例讲述了PHP实现的Redis多库选择功能单例类.分享给大家供大家参考,具体如下: 前言 qq群里有同学问redis如何进行多库选择,用php实现了一下,还望各位多多指点 代码 <?php class MultiRedisConnect { /** * hostname * * @var string */ const REDISHOSTNAME = "127.0.0.1"; /** * port * * @var int */ const REDISPORT = 6379

php操作redis中的hash和zset类型数据的方法和代码例子

前面一篇博客主要是string类型,list类型和set类型,下面hash类型和zset类型 1,hset 描述:将哈希表key中的域field的值设为value.如果key不存在,一个新的哈希表被创建并进行HSET操作.如果域field已经存在于哈希表中,旧值将被覆盖. 参数:key field value 返回值:如果field是哈希表中的一个新建域,并且值设置成功,返回1.如果哈希表中域field已经存在且旧值已被新值覆盖,返回0. 2,hsetnx 描述:将哈希表key中的域field的

ThinkPHP自定义Redis处理SESSION的实现方法

本文实例讲述了ThinkPHP自定义Redis处理SESSION的实现方法.分享给大家供大家参考,具体如下: 日常中我们都会使用到session来保存用户登录的信息,常用的session的保存方式有:文件保存(默认).数据库保存.Redis保存.memcached等.这里主要记录一下在用ThinkPHP处理session用Redis来保存session的用法. 1.在配置项中定义: 'SESSION_TYPE' => 'Redis', //session保存类型 'SESSION_PREFIX'

CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录

启动ssh服务 service sshd start yum -y update 查看centos版本 centos 5 执行: 复制代码 代码如下: rpm -Uvh http://mirror.webtatic.com/yum/el5/latest.rpm centos 6 执行: 复制代码 代码如下: rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm yum安装php 复制代码 代码如下: yum install php55w 

PHP实现的redis主从数据库状态检测功能示例

本文实例讲述了PHP实现的redis主从数据库状态检测功能.分享给大家供大家参考,具体如下: 实例: <?php /** * 检测多个主从redis数据库是否挂掉 * 建立从数据库$redis_db的二维数组,内容包含每个从服务器的配置数据 */ header("Content-Type: text/html; charset=utf-8"); set_time_limit(0); $redis_db = array( 'db1'=>array( 'hostname' =&

PHP实现的mysql主从数据库状态检测功能示例

本文实例讲述了PHP实现的mysql主从数据库状态检测功能.分享给大家供大家参考,具体如下: 实例: <?php /** * 检测多个主从数据库是否挂掉 * 建立从数据库$slave_db的二维数组,内容包含每个从服务器的配置数据 */ header("Content-Type: text/html; charset=utf-8"); set_time_limit(0); $slave_db = array( 'db1'=>array( 'hostname' => '

thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例

本文实例讲述了thinkphp 5框架实现登陆,登出及session登陆状态检测功能.分享给大家供大家参考,具体如下: 1,访问http://localhost/tp5/admin.php时,判断有没有登陆: 想法:写一个父类,继承controller,然后定义一个初始化方法,在控制器调用时就判断是否登陆 <?php namespace app\Admin\controller; use think\Controller; use think\Session; class Basic exten

centos6使用docker部署redis主从数据库操作示例

本文实例讲述了centos6使用docker部署redis主从数据库操作.分享给大家供大家参考,具体如下: 目录结构: /redis /Dockerfile /Readme /redis-3.2.8.tar.gz /start.sh Dockerfile: FROM centos MAINTAINER qiongtao.li hnatao@126.com ADD ./redis-3.2.8.tar.gz /opt ADD ./start.sh /opt/start_redis.sh RUN ec

JS实现的四级密码强度检测功能示例

本文实例讲述了JS实现的四级密码强度检测功能.分享给大家供大家参考,具体如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title> 密码强度检测 </title> <meta http-equiv=&quo

UDP DUP超时UPD端口状态检测代码示例

我之前写过一个示例,简单UDP服务端和客户端示例 ,里面写过,如果你把自己当作客户端,那么客户端是可以指定自己的端口去发数的. ds.setSoTimeout(5000);即为收数超时时间,如果不设置,那就是等待,比电视剧里面爱情片都漫长的等待,而且结果是一样的,都是把自己等死了就不再等了.但是这个超时时间不能当作是你这个请求的超时时间,请注意这个概念,因为这个超时只是用于标记这段时间没有从网络中获取数据,但是即使获取数据了,那也不一定是你的,这个下面看示例就会明白. 然后就是端口问题,上面也说

golang实现redis的延时消息队列功能示例

前言 在学习过程中发现redis的zset还可以用来实现轻量级的延时消息队列功能,虽然可靠性还有待提高,但是对于一些对数据可靠性要求不那么高的功能要求完全可以实现.本次主要采用了redis中zset中的zadd, zrangebyscore 和 zdel来实现一个小demo. 提前准备 安装redis, redis-go 因为用的是macOS, 直接 $ brew install redis $ go get github.com/garyburd/redigo/redis 又因为比较懒,生成任

C语言用栈和队列实现的回文检测功能示例

本文实例讲述了C语言用栈和队列实现的回文功能.分享给大家供大家参考,具体如下: #include<stdio.h> #include<malloc.h>//内存分配头文件 #include<math.h>//在math.h中已定义OVERFLOW的值为3 #define SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typede

一篇文章让你明白Redis主从同步

今天想和大家分享有关 Redis 主从同步(也称「复制」)的内容. 我们知道,当有多台 Redis 服务器时,肯定就有一台主服务器和多台从服务器.一般来说,主服务器进行写操作,从服务器进行读操作. 那么这里有存在一个问题:从服务器如何和主服务器进行数据同步的呢? 这个问题,就是通过今天的内容:主从同步来解决的. 文章内容依旧比较干,建议大家静下心来专心看,文末会给大家做个简单总结归纳. 1. 如何进行主从同步 假如,现在有 2 台 Redis 服务器,地址分别是 127.0.0.1:6379 和

mysql主从数据库不同步的2种解决方法

今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常. show master status; 也正常. mysql> show master status; +-------------------+----------+--------------+-------------------------------+ | File | Position | Binlog_Do_DB | Binlo