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


Posted in PHP onJuly 09, 2019

本文实例讲述了PHP结合Redis+MySQL实现冷热数据交换应用案例。分享给大家供大家参考,具体如下:

场景:某网站需要对其项目做一个投票系统,投票项目上线后一小时之内预计有100万用户进行投票,希望用户投票完就能看到实时的投票情况

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

何为冷热数据交换?

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

业务流程

用户进行投票后,首先将投票数据保存到Redis中,这些数据就是热数据,然后定期(如5s)将热数据保存到MySQL中,这些数据就变为冷数据,然后将冷数据从Redis中删除,周而复始,知道一个小时投票结束。

项目结构图

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

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表

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

运行步骤:

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

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

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

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

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

PHP 相关文章推荐
一个可以找出源代码中所有中文的工具
Oct 25 PHP
php 代码优化的42条建议 推荐
Sep 25 PHP
PHP数组操作汇总 php数组的使用技巧
Jul 17 PHP
discuz加密解密函数使用方法和中文注释
Jan 21 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
Mar 18 PHP
PHP把MSSQL数据导入到MYSQL的方法
Dec 27 PHP
PHP 使用memcached简单示例分享
Mar 05 PHP
php开发工具有哪五款
Nov 09 PHP
PHP实现非阻塞模式的方法分析
Jul 26 PHP
php设计模式之单例模式用法经典示例分析
Sep 20 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
Feb 03 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 PHP
PHP+Redis开发的书签案例实战详解
Jul 09 #PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 09 #PHP
Laravel+Intervention实现上传图片功能示例
Jul 09 #PHP
Laravel框架实现多个视图共享相同数据的方法详解
Jul 09 #PHP
Laravel5.1框架注册中间件的三种场景详解
Jul 09 #PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 #PHP
PHP 7.4中使用预加载的方法详解
Jul 08 #PHP
You might like
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
利用php递归实现无限分类 格式化数组的详解
2013/06/08 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
深入解读JavaScript中的Hoisting机制
2015/08/12 Javascript
Jquery 效果使用详解
2015/11/23 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
BootStrap表单验证实例代码
2017/01/13 Javascript
Vue.js自定义指令的用法与实例解析
2017/01/18 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
微信小程序实现分享商品海报功能
2019/09/30 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
es6数组includes()用法实例分析
2020/04/18 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
python实现的简单文本类游戏实例
2015/04/28 Python
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
python机器学习之决策树分类详解
2017/12/20 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
Python使用指定字符长度切分数据示例
2019/12/05 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
类和结构的区别
2012/08/15 面试题
师范生教师实习自我鉴定
2013/09/27 职场文书
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
公司庆典主持词
2015/07/04 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
MySQL官方导出工具mysqlpump的使用
2021/05/21 MySQL
Apache Pulsar结合Hudi构建Lakehouse方案分析
2022/03/31 Servers