手机版

PHP结合Redis MySQL实现冷热数据交换应用案例详解

时间:2021-08-21 来源:互联网 编辑:宝哥软件园 浏览:

本文描述了一个用PHP和Redis MySQL结合实现冷热数据交换的应用案例。分享给大家参考,如下:

场景:网站需要为其项目制作投票系统。预计投票项目上线后一小时内将有100万用户参与投票。希望用户投票后能看到实时投票情况。

这个场景可以通过使用redis mysql冷热数据交换来解决。

什么是冷热数据交换?

冷数据:以前使用的数据,热数据:当前使用的数据。交换:定期将Redis中的数据存储到MySQL中

业务流程

投票结束后,用户先将投票数据保存在Redis中,这是热数据,然后定期将热数据保存在MySQL中(比如5s),这些数据就会变成冷数据,然后从Redis中删除冷数据,一直持续到投票结束的一个小时。

项目图

这里写图片描述

Index.html文件

这是投票的主页。有三个投票按钮,模拟三个用户投票。点击按钮,使用ajax调用vote.php文件

!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN ' ' http://www . w3 . org/TR/XHTML L1/DTD/XHTML L1-Strict . DTD ' html xmlns=' http://www . w3 . org/1999/XHTML ' XML : lang=' EN ' head meta http-equiv=' Content-Type ' Content=' text/html;charset=utf-8 ' title document/title/head script src=' http :http://lib . sinapp.com/js/jquery/1 . 9 . 1/jquery-1 . 9 . 1 . min . js '/脚本正文pspan id=' uid 1' 0/span输入类型//p pspan id=' uid 2' 0/span输入类型=' button '值=' user 2 ' onclick=' vote(2);'//p pspan id=' uid 3' 0/span输入类型=' button '值=' user 3 ' onclick=' vote(3);'//p/bodyscript函数投票(i){ $。get('vote.php?uid=' i,function(RS){ var span=' # uid ' I;$(跨度)。html(RS);});}/script/htmlvote.php

这份文件主要实现了投票的逻辑。首先连接Redis服务器,然后保存投票人id,然后以投票人id为密钥记录每个用户的投票,然后返回到index.html文件。最后用global_voteid作为密钥记录总票数,也可以作为MySQL的自增长密钥。然后记录uid、ip、时间等数据。

注意格式有一定要求:

如果voteid为3并且记录了ip,则密钥为vote: IP :127.0.0.1

?PHP $ Redis=new Redis();$redis-connect('localhost ',6379);//计算每个用户的总票数$ uid=int val($ _ GET[' uid ']);//$uid=mt_rand(1,3);//随机指定投票人,方便压力测试echo $ redis-incr($ uid);$ voteid=$ redis-incr(' global _ voteid ');$redis-set('vote: '。$voteid。uid ',$ uid);$ IP=$ _ SERVER[' REMOTE _ ADDR '];$redis-set('vote: '。$voteid。ip ',$ IP);$redis-set('vote: '。$voteid。time ',time());关键内容

该文件主要实现冷热数据的交换。首先连接mysql数据库和redis服务器,然后每5秒执行一次while循环,在循环中获取增长投票主键和上次插入MySQL的投票主键(位置)。判断插入位置是否存在,不存在就从头插入,完全插入就等待,没有完全插入就插入。

?Php//连接到数据库$ PDO=new PDO(' MySQL : host=localhost;dbname=test ',' root ',' 1234 ');$ PDO-query(' set name utf8 ');//connect Redis $ Redis=new Redis();$redis-connect('localhost ',6379);//永恒循环while(true){ $ vid=$ redis-get(' global _ voteid ');//自增长主键$ last=$ redis-get(' last ');//上次插入了mysql的投票主键。//如果没有插入数据库,那么如果(!$ last){ $ last=0;//设置为0} //如果所有数据都插入到MySQL if($ vid==$ last){ echo ' wait \ n ';//输出wait }else{ //插入数据库操作$ SQL='插入投票(vid,uid,IP,time)值';for($ I=$ vid;$ i $ last$i - ){ $k1='vote: '。$ i. ' :uid$k2='vote: '。$ i. ' :ip$k3='vote: '。$ I . time;$row=$redis-mget([$k1,$k2,$ k3]);$sql。='($i,$row[0],' $row[1]',$row[2]),';$redis-delete($k1,$k2,$ k3);} $sql=substr($sql,0,-1);$ PDO-exec($ SQL);$redis-set('last ',$ vid);//将插入的主键位置设置回显“确定”;}睡眠(5);//每5秒执行一次循环}投票表

这里写图片描述

运行步骤:

1.使用php命令行工具调用swap.php

这里写图片描述

2.使用Apache的ab工具进行压力测试。

这里写图片描述

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

希望本文对PHP编程有所帮助。

版权声明:PHP结合Redis MySQL实现冷热数据交换应用案例详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。