场景:某网站需要对其项目做一个投票系统,投票项目上线后一小时之内预计有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的投票主键//如果没有插入数据库,刚开始的肯定为trueif(!$last){$last = 0;//设置为0}//如果所有的数据都被插入到MySQL中if($vid == $last){echo "waitn";//输出等待}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工具进行压力测试。

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里PHP进阶架构师>>>实战视频、大厂面试文档免费获取

php 获取delete蚕丝_php结合Redis实现100万用户投票项目,并实时查看到投票情况的案例...相关推荐

  1. php中获取memcache所有key,Memcache查看列出所有key方法及memkeys实时查看key使用情况...

    本文我们来分享关于Memcache查看列出所有key方法及利用memkeys实时查看memcached key使用情况,smemkeys是tumblr开源的类似top的工具,可用于实时查看memcac ...

  2. 使用redis实现5万人同服的“相位技术”

    魔兽世界和EVE服务器能够同时支持5万人在线的技术肯定让很多人流口水吧.今天我用redis来模拟实现"相位技术".所谓"相位技术"就是将服务器分为多个并行的空间 ...

  3. 利用redis代替session保存用户 减少tomcat压力

    背景: 通常系统中用户登录之后会保存用户信息到session,查询个人当前登录用户所带信息时,直接在session中获取当前登录用户,然后通过sql  的where条件筛选. 但是如果大量用户的信息存 ...

  4. redis存10万条数据_redis如何存储数据

    飞天技术汇 | 阿里云Redis产品升级大全 阿里云Redis重磅产品升级:全球多活版.混合存储版.多线程性能增强版. 这期飞天技术汇你将看到 ● 企业如何实现业务快速全球化布局 ● 冷热数据如何分离 ...

  5. 搭建Redis服务器: 设置变量school,值为tarena 查看变量school的值

    1.1 问题 具体要求如下: 在主机 192.168.4.51 上安装并启用 redis 服务 设置变量school,值为tarena 查看变量school的值 1.2 步骤 实现此案例需要按照如下步 ...

  6. java签到程序设计_java redis 实现简单的用户签到功能

    业务需求是用户每天只能签到一次,而且签到后用户增加积分,所以把用户每次签到时放到redis 缓存里面,然后每天凌晨时再清除缓存,大概简单思想是这样的 直接看代码吧如下 @Transactional @ ...

  7. 爬虫实战(一)—利用requests、mongo、redis代理池爬取英雄联盟opgg实时英雄数据

    概述 可关注微信订阅号 loak 查看实际效果. 代码已托管github,地址为:https://github.com/luozhengszj/LOLGokSpider 包括了项目的所有代码. 此篇文 ...

  8. ibm db2获取目标时间与当前时间的差值_高帧频视觉实时目标检测系统

    基于机器视觉的智能目标检测系统应用非常广泛,尤其在航天军工等领域中,经常涉及高速目标的实时检测和控制,对目标检测的智能性和实时性提出了更严格的要求.在这种应用中,视觉系统相对雷达.声纳具有信息量大.抗 ...

  9. 获取保存在沙盒中plist文件的用户的字典信息

    获取保存在沙盒中plist文件的用户的字典信息

最新文章

  1. 清华唐杰:GPT-3表示能力已经接近人类了
  2. Castle IOC容器内幕故事(上)
  3. iis7安装mysql_windows server 2008/2012安装php+iis7+mysql环境搭建
  4. 人民日报钟声:以和平合作守护世界安全
  5. Javascript交互式金融股票基金图表JavaScript Stock Chart
  6. httpclient3与httpclient4不同版本使用方法
  7. ADS1112|MS1112|16位AD转换芯片|国产兼容PIN-TO-PIN。兼容替代无需修改软硬件
  8. Sonar代码规则之TOP30详解
  9. php 401认证,给phpMyAdmin增加401加密认证
  10. PSI_压力阻塞信息
  11. 产品上线前,友谊的小船说翻就翻!
  12. uniapp H5微信支付
  13. 歪门邪道?新技术让智能手机可窃取附近键盘输入信息
  14. 运维学python用不上_数读 | 为什么运维朋友们都需要学Python?
  15. ES6中Set方法实现数组去重
  16. 常用的外贸英语口语汇总
  17. java 获取指定日期下月的第一天
  18. 《HeadFirst设计模式》读书笔记-第2章-观察者模式
  19. 键盘uio变成456怎么解决
  20. drupal mysql配置_安装配置Apache+php+mysql+drupal

热门文章

  1. 使用Cygwin实现vlc 1.0.5的wince移植
  2. docker启动,重启,关闭命令
  3. vue Bus 总线 组件间通信
  4. Linux expr命令、Linux wc命令、Linux let 命令
  5. get和post 两种基本请求方式的区别
  6. 如何高效的编写与同步博客 (.NET Core 小工具实现)
  7. 关于虚拟机第二块网卡eth1(仅主机模式)的配置问题
  8. css3 loading 效果1
  9. 如何防止表单的重复提交
  10. iOS CAGradientLayer颜色渐变