php 獲取delete蠶絲_php結合Redis實現100萬用戶投票項目,并實時查看到投票情況的案例...

5bf8da80dd7c6f00df9e058f25b6bee2.png

場景:某網站需要對其項目做一個投票系統,投票項目上線后一小時之內預計有100萬用戶進行投票,希望用戶投票完就能看到實時的投票情況

這個場景可以使用redis+mysql冷熱數據交換來解決。

何為冷熱數據交換?

冷數據:之前使用的數據,熱數據:當前使用的數據。
交換:將Redis中的數據周期的存儲到MySQL中

業務流程

用戶進行投票后,首先將投票數據保存到Redis中,這些數據就是熱數據,然后定期(如5s)將熱數據保存到MySQL中,這些數據就變為冷數據,然后將冷數據從Redis中刪除,周而復始,知道一個小時投票結束。

項目結構圖

0f2d7cee2c767fde4bfdee535bb8b4bf.png

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表

05b698b3db20b33e89eac152a3a2de55.png

運行步驟:

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

9623f0e5e0cac6c9992a932618256d30.png

2、使用Apache的ab工具進行壓力測試。

a9992347ce88ec551ef68aae55307d39.png

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要戳這里PHP進階架構師>>>實戰視頻、大廠面試文檔免費獲取

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457379.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

硬件內存模型 Hardware Memory Models

硬件內存模型 Hardware Memory Models (Memory Models, Part 1) Posted on Tuesday, June 29, 2021. 簡介&#xff1a;童話的終結 很久以前&#xff0c;當人們還在寫單線程程序的時候&#xff0c;讓程序跑的更快的一個最有效的辦法就是什么也不做&#xff0c;因為下一代硬件…

碰到日期題就怕的我來寫一道水題吧

HDOJ-2005&#xff0c; http://acm.hdu.edu.cn/showproblem.php?pid2005 20XX系列的水題哈哈&#xff0c;寫了二十分鐘&#xff0c;就為找到一種比較正常不傻逼的寫法。。。 嗯&#xff0c;學習了一下&#xff0c;閏年的判斷可以寫成一個接受參數的宏。 #define lev(n) (n%40&…

判斷是否為gif/png圖片的正確姿勢

判斷是否為gif/png圖片的正確姿勢 1.在能取到圖片后綴的前提下 123456789//假設這是一個網絡獲取的URLNSString *path "http://pic3.nipic.com/20090709/2893198_075124038_2.gif";// 判斷是否為gifNSString *extensionName path.pathExtension;if ([extensionName…

【Go】Map 的空間利用率統計

Go 中 map 利用率 今天刷 B 站看見有 Up 主在講布隆過濾器&#xff0c;提到了利用率的問題&#xff0c;假設有一組數據&#xff0c;范圍分布非常廣&#xff0c;使用布隆過濾器時如何盡量少的減少內存使用&#xff0c;感覺除了針對特定數據的定向優化外沒什么特別好的辦法&…

ap模式和sta模式共存_AP+AC組網下的本地轉發及集中轉發

現在越來越多的企業都有自己的無線網絡&#xff0c;而無線網絡的組網方式一般都是使用ACAP模式進行組網&#xff0c;使用無線網絡能夠提供經濟、高效的網絡接入方式。相比有線網絡&#xff0c;無線網絡下只要能接入無線網的地方都可以使用網絡&#xff0c;用戶可以自由移動。而…

《JS權威指南學習總結--6.7屬性的特性》

內容要點&#xff1a; 一.ES5中查詢和設置屬性的API 1.可以通過這些API給原型對象添加方法&#xff0c;并將它們設置成不可枚舉的&#xff0c;這讓它們看起來更像內置方法。 2.可以通過這些API給對象定義不能修改或刪除的屬性&#xff0c;借此 "鎖定" 這個對象。 3.數…

【干貨分享】流程DEMO-事務呈批表

流程名&#xff1a; 事務呈批表 業務描述&#xff1a; 辦公采購、會議費用等事務的申請。流程發起時&#xff0c;會檢查預算&#xff0c;如果預算不夠&#xff0c;將不允許發起費用申請&#xff0c;如果預算夠用&#xff0c;將發起流程&#xff0c;同時占用相應金額的預算&…

【譯】TcMalloc: Thread-Caching Malloc

TcMalloc 的核心是分層緩存&#xff0c;前端沒有鎖競爭&#xff0c;可以快速分配和釋放較小的內存對象&#xff08;一般是 256 KB&#xff09;前端有兩種實現&#xff0c;分別是 pre-CPU 和 pre-Thread 模式&#xff0c;前者申請一塊大的連續內存&#xff0c;每一個邏輯 CPU 將…

kotlin編譯失敗_Kotlin使用GraalVM開發原生命令行應用

背景之前用kotlin開發過一款根據建表DDL語句生成plantuml ER圖的應用。被問如何使用&#xff0c;答曰"給你一個jar包&#xff0c;然后執行java -jar ddl2plantuml.jar ./ddl.sql ./er.puml 就可以了。是不是so easy?"結果被吐槽了一番&#xff0c;為什么不能像命令行…

Swift - 添加純凈的Alamofire

Swift - 添加純凈的Alamofire 如果你有代碼潔癖,不能容忍任何多余的東西,請繼續往下看. 1. 下載Alamofire (https://github.com/Alamofire/Alamofire) 2. 解壓縮并打開 Alamofire.xcworkspace 3. 刪除不必要的內容 (根據你的需求自己定) 4. 順便把文件夾里面的無關內容也刪除掉…

jquery 獲取系統默認年份_你沒有看錯,爬網頁數據,C# 也可以像 Jquery 那樣

一&#xff1a;背景1. 講故事前段時間搞了一個地方性民生資訊號&#xff0c;資訊嘛&#xff0c;都是我抄你的&#xff0c;你抄官媒的&#xff0c;小市民都喜歡奇聞異事&#xff0c;所以就存在一個需求&#xff0c;如何去定向抓取奇聞異事的地方號上的新聞&#xff0c;其實做起來…

linux下怎么編譯運行C語言程序?

linux下的C語言編譯器是gcc&#xff0c;C的編譯器是g。 linux下編程可以使用編輯器vi或vim&#xff0c;建議使用vim&#xff0c;因為它有語法高亮顯示。程序編寫好后&#xff0c;假設你的程序名為test.c&#xff0c;可以使用gcc -o test test.c。test就是編譯好的可執行程序./t…

undertow 怎么創建線程_為什么很多SpringBoot開發者放棄了Tomcat,選擇了Undertow

點擊上方“后端技術精選”&#xff0c;選擇“置頂公眾號”技術文章第一時間送達&#xff01;作者&#xff1a;阿邁達toutiao.com/a6775476659416990212/前言在SpringBoot框架中&#xff0c;我們使用最多的是Tomcat&#xff0c;這是SpringBoot默認的容器技術&#xff0c;而且是內…

一起玩轉CoordinatorLayout

作為Material Design風格的重要組件,CoordinatorLayout協調多種組件的聯動&#xff0c;實現各種復雜的效果&#xff0c;在實際項目中扮演著越來越重要的角色。本篇博客將由淺到深&#xff0c;帶你一起玩轉CoordinatorLayout。 官方文檔對CoordinatorLayout是這樣描述的&#xf…

離散數學圖論旅行規劃問題_2020年MathorCup高校數學建模挑戰賽——C 題 倉內揀貨優化問題...

下面的鏈接是精華版思路&#xff0c;亮點是對第六問的探討。高度概括一下&#xff1a;第一問曼哈頓&#xff0c;第二問用免疫&#xff0c;三問增加任務單&#xff0c;四問增加揀貨員&#xff0c;五問改變復核臺&#xff0c;六問亮點來探討~ 有點皮MathorCup C題 倉內揀貨優化問…

Asp.NetWebForm的控件屬性

一&#xff1a;GridView&#xff1a; 1.綁定ID 的值&#xff1a;DataKeyNames"Id", 2.自動產生列的意思:AutoGenerateColumns 3.如何注冊腳本&#xff1a;ClientScript.RegisterStartupScript(this.GetType(),"text","alert(刪除成功)"&#xf…

【VBA編程】10.自定義集合

自定義集合類型&#xff0c;類似于變量聲明&#xff0c;只是要將Dim關鍵字和New collection關鍵字搭配起來使用&#xff0c;其語法描述如下&#xff1a;其中集合名的命名方式同于標準變量的命名 Dim 集合名 As New collection 對于已經定義的集合對象&#xff0c;可以使用集合的…

git fork clone 區別_Working with Git | Git 與 GitHub

關于各位好&#xff0c;這里是 Chinas Prices Project 項目的知乎專欄。關于 CPP 項目&#xff0c;您可以在這篇文章里了解到更多的信息。若您對這個項目感興趣&#xff0c;我們非常歡迎您與我們交流您的想法與見解。在一個團隊的成員同時為一個項目進行開發工作時&#xff0c;…

舒適的路線(codevs 1001)

題目描述 DescriptionZ小鎮是一個景色宜人的地方&#xff0c;吸引來自各地的觀光客來此旅游觀光。Z小鎮附近共有N(1<N≤500)個景點&#xff08;編號為1,2,3,…,N&#xff09;&#xff0c;這些景點被M&#xff08;0<M≤5000&#xff09;條道路連接著&#xff0c;所有道路都…

PHP_Smarty

模板 數據與表現層的標簽分離 smarty是PHP 與 HTML代碼的分離 小型模板類 $smarty 的工作流程&#xff1a; 把需要顯示的全局變量&#xff0c;賦值塞到對象內部的屬性上&#xff0c;一個數組中.編譯模板&#xff0c;把{$標簽},解析成相應的<?php echo 代碼引入編譯后的PHP文…