php实现redis核心代码(PHP结合Redis+MySQL实现冷热数据交换应用案例详解)
php实现redis核心代码
PHP结合Redis+MySQL实现冷热数据交换应用案例详解本文实例讲述了php结合redis+mysql实现冷热数据交换应用案例。分享给大家供大家参考,具体如下:
场景:某网站需要对其项目做一个投票系统,投票项目上线后一小时之内预计有100万用户进行投票,希望用户投票完就能看到实时的投票情况
这个场景可以使用redis+mysql冷热数据交换来解决。
何为冷热数据交换?
冷数据:之前使用的数据,热数据:当前使用的数据。
交换:将redis中的数据周期的存储到mysql中
业务流程
用户进行投票后,首先将投票数据保存到redis中,这些数据就是热数据,然后定期(如5s)将热数据保存到mysql中,这些数据就变为冷数据,然后将冷数据从redis中删除,周而复始,知道一个小时投票结束。
项目结构图
index.html文件
这是投票的首页,有3个投票按钮,模拟给3个用户投票,点击按钮,使用ajax调用vote.php文件
|
<!doctype html public "-//w3c//dtd xhtml 1.0 strict//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-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://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js" ></script> <body> <p><span id= "uid1" >0</span><input type= "button" value= "用户1" onclick= "vote(1);" /></p> <p><span id= "uid2" >0</span><input type= "button" value= "用户2" onclick= "vote(2);" /></p> <p><span id= "uid3" >0</span><input type= "button" value= "用户3" onclick= "vote(3);" /></p> </body> <script> function vote(i){ $.get( 'vote.php?uid=' +i, function (rs){ var span = '#uid' +i; $(span).html(rs); }); } </script> </html> |
vote.php
这个文件主要实现投票的逻辑。首先连接上redis服务器,然后保存投票人id,然后将投票人id为key记录每个用户的票数,然后返回给index.html文件,最后使用global_voteid作为key记录总票数,也可以作为mysql的自增长的键。然后记录uid,ip,time等数据。
注意格式有一定的要求:
假如voteid为3,记录的是ip,那么键为vote:3:ip:127.0.0.1
|
<?php $redis = new redis(); $redis ->connect( 'localhost' ,6379); //计算每个用户的总票数 $uid = intval ( $_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循环,在while循环里获取自增长的投票主键和最近一次插入mysql的投票主键(位置)。判断插入的位置是否存在,如果不存在就从头插入,如果全部插入完毕,就进行等待,如果没有插入完毕,就进行插入操作。
|
<?php //连接数据库 $pdo = new pdo( 'mysql:host=localhost;dbname=test' , 'root' , '1234' ); $pdo ->query( 'set names utf8' ); //连接redis $redis = new redis(); $redis ->connect( 'localhost' ,6379); //永真循环 while (true){ $vid = $redis ->get( 'global_voteid' ); //自增长的主键 $last = $redis ->get( 'last' ); //最近一次插入mysql的投票主键 //如果没有插入数据库,刚开始的肯定为true if (! $last ){ $last = 0; //设置为0 } //如果所有的数据都被插入到mysql中 if ( $vid == $last ){ echo "wait\n" ; //输出等待 } else { //进行插入到数据库操作 $sql = 'insert into vote(vid,uid,ip,time) values' ; 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 ); //设置插入的主键位置 echo 'ok' ; } sleep(5); //每隔5秒执行循环 } |
vote表
运行步骤:
1、使用php命令行工具调用swap.php
2、使用apache的ab工具进行压力测试。
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/baochao95/article/details/60761397
- mac版本php环境搭建(在Mac OS X中配置Apache+PHP+MySQL运行环境的详细步骤)
- php实例说明(PHP中Static静态关键字功能与用法实例分析)
- phpredis消息队列(PHP+redis实现微博的推模型案例分析)
- thinkphp5框架分析(thinkPHP5框架路由常用知识点汇总)
- 本地phpstudy搭建网站教程学习(phpstudy搭建本地网站服务器图文教程)
- thinkphp支付宝支付(thinkPHP和onethink微信支付插件分享)
- thinkphp5 新增模块(Thinkphp5.0框架的Db操作实例分析连接、增删改查、链式操作等)
- 织梦cms中的模块怎么设置(织梦CMS模板在runphp=yes的标签中调用其他field值的方法)
- thinkphp 多维度展示数据(Thinkphp自定义生成缩略图尺寸的方法)
- php八大模式详解(php设计模式之工厂模式用法经典实例分析)
- php的模块加载(PHP中的自动加载操作实现方法详解)
- php处理app上传的图片(php用wangeditor3实现图片上传功能)
- php项目开发实例(php项目中类的自动加载实例讲解)
- php开发中用什么模板(PHP模版引擎原理、定义与用法实例)
- php集成支付(ThinkPHP框架整合微信支付之刷卡模式图文详解)
- php网站经典案例(PHP生成短网址的思路以及实现方法的详解)
- 冰岛旅游攻略(冰岛旅游攻略及花费八日游)
- 寒假旅游攻略(成都寒假旅游攻略)
- 菲律宾旅游攻略(菲律宾旅游攻略地图)
- 清华大学难考吗(清华大学考研录取分数线)
- 观花盆栽佛肚竹盆景制作及养护(观花盆栽佛肚竹盆景制作及养护)
- 春天养佛肚竹,做好这几件事,叶绿根壮寓意好 越养越旺家(春天养佛肚竹做好这几件事)
热门推荐
- python 游戏开发实例(python实现诗歌游戏类继承)
- php执行语句(PHP goto语句用法实例)
- mysql函数编写(MySQL中sum函数使用的实例教程)
- javascript类型转换讲解(JavaScript数据类型转换详解推荐)
- php工作原理及功能(php设计模式之适配器模式原理、用法及注意事项详解)
- html5和css3最新特性(html5中使用hotcss.js实现手机端自适配的方法)
- js使用递归解析(关于JavaScript递归经典案例题详析)
- 数据库安装到docker(基于docker安装mariadb配置过程解析)
- response的contentType的类型值
- docker容器根据进程号查看端口(Docker 通过端口来连接一个容器的实现)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9