日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP高并發高負載下的3種實戰場景解決方法示例

瀏覽:37日期:2022-06-14 10:23:51
目錄前言:場景一,緩存失效回調。1. 設置Redis回調事件方法。2. 訂閱redis某個庫的鍵失效的頻道名。3. 設置有限期4. 查看鍵失效回調訂閱的命令窗口是否出現失效的鍵名。5. 代碼實現鍵名的失效事件訂閱。6. 通過PHP-cli運行該腳本7. 緩存失效應用展開。場景二,接口冪等性。場景三,庫存超賣。前言:

在實際開發項目中,產品一旦推廣開來,總能遇到一些小問題。比如某個接口突然就請求崩掉了,某個提交接口明明做了限制為什么就多出了好多重復的記錄。還有是某個記錄超過限制進行修改了,以下就以這幾個小問題總結一下平時采取的解決方法。

1.緩存失效場景,就比如某個接口做了數據緩存,緩存過期導致突然某個時刻大量請求直接讀數據庫。解決方法設置redis緩存回調事件,訂閱失效頻道。所以這個也可以用來處理某些業務場景到期處理方式。

2.接口冪等性場景,就比如注冊接口,通過手機號查詢是否存在記錄。但有時出現網絡延遲用戶連點等情況,會出現數據庫出現幾條一樣的用戶數據記錄。

3.商品庫存超賣場景,比如某個活動商品下單,多個用戶同時下一個商品的訂單,從而導致庫存超賣的現象。解決方法可以使用樂觀鎖或者悲觀鎖解決此問題。

場景一,緩存失效回調。1. 設置Redis回調事件方法。

(1). 打開Redis客戶終端,輸入命令非持久性的回調事件設置

config set notify-keyspace-events Ex

(2). windows平臺打開Redis安裝目錄中找到"redis.windows-service.conf",然后打開編輯找到notify-keyspace-events那一行,去掉"#",改為notify-keyspace-events “Ex"。

(3). 其中Redis還可以設置訂閱鍵名的回調,比如訂閱某個鍵名的del操作等,可以在conf中設置不同的,方法網上也有的。

2. 訂閱redis某個庫的鍵失效的頻道名。

可以在命令測試,也可以通過PHP代碼訂閱然后cli環境下運行腳本。

命令:subscribe __keyevent@0__:expired3. 設置有限期

重新打開一個新的redis客戶終端輸入一個帶有效期的鍵值對,如下(鍵名test_key_name, 時間30s, 值ceshi)

命令:setex test_key_name 30 ceshi4. 查看鍵失效回調訂閱的命令窗口是否出現失效的鍵名。

5. 代碼實現鍵名的失效事件訂閱。<?php//設置php腳本執行時間set_time_limit(0);//設置socket連接超時時間ini_set('default_socket_timeout', -1);class redisSubscribe { protected $config = ['host' => '127.0.0.1','password' => '6379' ]; protected $redis; public function __construct() {try { $this->redis = new \Redis(); $this->redis->pconnect($this->config['host'],$this->config['password']);} catch(\Exception $e) { echo 'redis錯誤:'.$e->getMessage().PHP_EOL;} } // 普通消息訂閱 public function normal() {//聲明頻道名稱$channelName = 'test';try { $this->redis->subscribe([$channelName], function ($redis, $channel, $msg) {echo 'channel:' . $channel . ',message:' . $msg . PHP_EOL;file_put_contents('subscribe.log','\n-'.$msg.'-\n',FILE_APPEND); });} catch (\Exception $e) { echo $e->getMessage();} } // 訂閱Key失效事件的頻道 public function keyNotify() {echo 'wathc keyNotify start~~'.PHP_EOL;// Key事件回調//$channel = '__keyevent@0__:expired';// 0號庫的Key過期事件頻道名$channel = '__keyevent@*__:expired';// 所有庫的Key過期事件頻道名try { $this->redis->subscribe([$channel], function ($redis, $channel, $msg) {echo 'channel:' . $channel . '===========' . ',message:' . $msg . PHP_EOL;file_put_contents('subscribe.log','\n-'.$msg.'-\n',FILE_APPEND); });} catch (\Exception $e) { echo $e->getMessage();} }}(new redisSubscribe())->keyNotify();?>6. 通過PHP-cli運行該腳本

然后也可以setex一個短時間的鍵,然后查看命令是否輸出該失效的鍵名。

7. 緩存失效應用展開。

(1). 代碼中設置的所有鍵名都配置到項目的全局配置文件中。

(2). 服務器中開一個守護進程(持續運行訂閱某個庫或者所有庫的鍵失效回調事件腳本)。

(3). 當該腳本有回調時,取出鍵名去全局緩存鍵名數組中匹配。

(4). 規則業務可以自行設計。

(5). 比如取出一個"cate5"的鍵名,則可以取資訊表中查詢分類ID為5的所有數據然后再進行緩存。

(6). 緩存失效事件還一個高端玩法,就是取代某些定時任務。比如可以將某個訂單作為鍵名緩存,當該鍵名失效就可以取出鍵名拿到ID去數據庫中將訂單狀態修改為失效。

場景二,接口冪等性。

接口重復數據也就是在高并發下的數據添加場景。最典型的是注冊接口,用戶在網絡延遲大或者信號不穩定的情況下。并且同時大量用戶在進行注冊操作,用戶點擊了一次沒反應然后再次點擊多個。

在沒有做冪等性處理只是拿到手機號查詢數據庫是否存在,用戶表又沒分庫分表,查詢緩慢,查詢出來后,多條并發的請求都繞過了手機號已經存在的條件判斷,所以就出現了ID不同,但是其他字段一樣的記錄。

對于高并發數據添加,可以使用Redis的setnx。setnx是設置鍵并且在有效期內有值時,再次對該鍵名進行重復賦值無法進行,會返回0。

可以代碼在對某些條件查詢是否存在時,可以將條件組成鍵名賦值。添加記錄時再次對鍵名重新賦值,返回null則表示已經存在。以下代碼是項目中的一個測試方法,使用的redis是封裝的,借鑒需要修改。/** * @Notes: 高并發防止重復提交(插入數據) 【保證接口的冪等性】 * @Interface preventRepeatSubmit * @return mixed * @author: bqs * @Time: 2020/6/19 14:56 */ public function preventRepeatSubmit() {/* 比如查詢某條(什么條件)記錄是否存在,分布式鎖機制[redis的原子性setnx] * 1. 通過條件拼接為唯一的鍵名,將鍵名setnx設置一個30s有效期的值 * 2. setnx設置鍵名不成功(返回0)表示已經存在,接口則直接返回記錄已經存在 * 3. 根據該條件查詢數據庫記錄,如果存在,接口再返回記錄已經存在 * 【只要添加記錄前需要查詢什么是否存在則都需要考慮高并發情況,則通過此方案】*/$redis = Redis::db(0);$no = date('YmdHis',time()).mt_rand(1000,9999);//$no = 202006191537447811;// 是否添加鎖表$addLock = false;if ($redis->setnx($no,1)) { $redis->expire($no,30); //設置30s過期時間} else { $addLock = true;// 訂單已經存在則鎖住}// 數據庫查詢是否存在$isExist = Db::name('ztest')->where(['no'=>$no])->find();if ($isExist) { $addLock = true;}if (!$addLock) { $data = ['no' => $no,'tab_num' => 2,'stock' => 20,'create_time' => time() ]; $res = Db::name('ztest')->insertGetId($data);}return '添加數據成功'; }場景三,庫存超賣。

庫存超賣是一個很常見的秒殺或者其他高并發場景下的數據更新問題。網絡上的解決方法也是多種多樣,對該問題延伸的數據庫樂觀鎖,悲觀鎖的知識點也是數不勝數。

所以,這里我也不再介紹數據庫的存儲引擎機制,事務,表鎖等概念。直接以代碼展現,以下是以樂觀鎖實現的數據庫更新問題。

高并發下,對單條記錄的修改。一般修改前會對某字段進行判斷,但是并發情況下,拿查詢的結果進行攔截是極其的不靠譜。不過也可以對查詢進行加鎖,但是需要在同一事務中。庫存字段添加無符號的字段約束,所以再大的并發在修改為0之后也不會出現負數了,在修改的操作時捕捉修改為負數時的數據庫異常。

表中添加version字段,這個也是網上盛傳的樂觀鎖經典實例了,后面的原理和流程我就不介紹了,代碼也是這樣寫的,所以直接貼代碼了。/** * @Notes: 高并發樂觀鎖 - (更新數據) * @Interface testConcurrence * @return mixed * @author: bqs * @Time: 2020/6/19 14:25 */ public function testConcurrence() {// 開啟事務Db::startTrans();// 查詢ID25當前的庫存和版本號$curr = Db::name('ztest')->field('stock,version')->where(['id'=>25])->find();// 判斷庫存是否小于0if ($curr && $curr['stock'] <= 0) { throw new \Exception('物品已售罄',302);}try { // 修改庫存 - 獲取ID25的行瑣 $updateRes = Db::name('ztest')->where(['id'=>25,'version'=>$curr['version']])->update(['stock'=>$curr['stock']-1,'version'=>$curr['version']+1]); // 標識并發過來修改的,拿到的version太舊,事務回滾重新回到查詢再走一遍 if (!$updateRes) {Db::rollback(); }} catch(\Exception $e) { Db::rollback(); // 記錄日志,或者返回}// 事務提交Db::commit();return '購買成功了'; }

以上就是PHP高并發高負載下的3種實戰場景解決方法示例的詳細內容,更多關于PHP高并發高負載場景的資料請關注好吧啦網其它相關文章!

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美一区二区三区高清视频| 蜜臀国产一区二区三区在线播放| 国产精品国产一区| 亚洲自拍另类| 中文在线一区| 成人免费网站www网站高清| 国产成人精品一区二区免费看京| 中文字幕日韩亚洲| 免费人成在线不卡| 日韩中文字幕91| 亚洲网址在线观看| 国内精品福利| 91成人精品| 爽好久久久欧美精品| 爽爽淫人综合网网站| 蜜桃av一区二区| 日本aⅴ精品一区二区三区| 91成人小视频| 国产一区二区三区天码| 亚洲成人不卡| 99久精品视频在线观看视频| 免费观看久久久4p| 午夜精品网站| 在线国产日韩| 国产精品亚洲综合在线观看| 精品国产一级| 国产欧美日韩在线一区二区| 国产精品国产一区| 日韩一级精品| 国产精品成人自拍| 久久久久久久久丰满| 日韩欧美中文字幕在线视频| 久久精品不卡| 国产精品一区二区精品| 日韩欧美美女在线观看| 69堂免费精品视频在线播放| 午夜av成人| 老牛影视精品| 视频一区中文字幕国产| 精品视频在线你懂得| 玖玖玖国产精品| 欧美一级二区| 亚洲欧美日韩国产一区二区| 精品国产三区在线| 亚洲丝袜美腿一区| 亚洲五月婷婷| 欧美国产偷国产精品三区| 日韩成人午夜精品| 欧美综合国产| 91精品一区二区三区综合| 国产精品xxx| 天堂精品久久久久| 亚洲影视一区二区三区| 日韩av午夜在线观看| 日韩午夜高潮| 久久国产尿小便嘘嘘| 欧美久久精品一级c片| 国产成人黄色| 日韩成人精品一区二区| 美女性感视频久久| 欧美激情综合| 国产精品欧美三级在线观看| 国产在线|日韩| 麻豆精品蜜桃| 欧美手机在线| 亚洲黄色网址| 人人草在线视频| 桃色一区二区| 99久久婷婷| 宅男噜噜噜66国产日韩在线观看| 四虎4545www国产精品| 国产精品视频一区二区三区综合 | 国产精品久久久久77777丨| 好看不卡的中文字幕| 亚洲爱爱视频| 欧美天堂视频| 日韩一区电影| 久久九九电影| 亚洲乱码一区| 麻豆一区二区在线| 色婷婷久久久| 视频一区国产视频| 青草综合视频| 高清一区二区三区av| 欧美欧美黄在线二区| 久久精品国产99国产| 伊人久久高清| 日韩在线麻豆| 97精品一区| 一区二区精彩视频| 日韩成人精品一区| 久久亚洲二区| 麻豆久久久久久| 欧美亚洲在线日韩| 国产精品115| av不卡在线看| 国产精品99精品一区二区三区∴| 日本视频在线一区| 欧美成a人免费观看久久| 亚洲人成在线网站| 久久午夜精品| 在线中文字幕播放| 日韩欧美字幕| 国产亚洲精品美女久久| 国产精品免费精品自在线观看| 狠狠操综合网| 国产h片在线观看| 日韩欧美中文字幕电影| 亚洲电影在线一区二区三区| 欧美日韩1区| 国产美女精品| 桃色一区二区| 欧美激情精品| 日本精品国产| 九色porny丨国产首页在线| 91精品国产自产观看在线 | 91九色综合| 人人爽香蕉精品| 在线国产一区| 国产综合色区在线观看| 精品欧美日韩精品| 综合亚洲自拍| 精品久久美女| 麻豆传媒一区二区三区| 99日韩精品| 激情91久久| 欧美专区18| 国产成人免费视频网站视频社区| 日本天堂一区| 欧美日本三区| 国产精品视频3p| 国产精品99精品一区二区三区∴| 国产免费久久| 久久麻豆视频| 天堂日韩电影| 国产午夜久久av| 久久国产精品免费精品3p| 久久先锋影音| 国产欧美综合一区二区三区| 中文不卡在线| 欧美在线精品一区| 欧美韩一区二区| 国产麻豆一区二区三区| 日韩视频一二区| 欧美aⅴ一区二区三区视频| 久久精品人人| 国产suv精品一区二区四区视频| 国产精品毛片久久久| 久久av偷拍| 精品国产精品久久一区免费式| 国产a亚洲精品| 日韩成人高清| 亚洲自啪免费| 欧美黑人巨大videos精品| 国产 日韩 欧美 综合 一区| 日韩中文影院| 色综合视频一区二区三区日韩 | 国产超碰精品| 国产一级久久| 亚洲免费观看高清完整版在线观| 国产精品亚洲欧美日韩一区在线| japanese国产精品| 国产丝袜一区| 999视频精品| 欧美亚洲综合视频| 亚洲高清毛片| 精品视频国内| 日韩精品一级| 国产精品久久久久久久免费观看| 乱人伦精品视频在线观看| 日本亚洲欧洲无免费码在线| 日韩欧美中文字幕电影| 一区二区三区国产盗摄| 91久久久精品国产| 久久91视频| 亚洲精品日本| 亚洲激情中文在线| 国产成人免费精品| 亚洲一区观看| 国产成人精品三级高清久久91| 狠狠久久婷婷| 激情久久中文字幕| 午夜精品亚洲| 97精品国产| 日韩福利视频导航| **爰片久久毛片| 国产精品7m凸凹视频分类| 久久精品中文| 午夜久久美女| 另类中文字幕国产精品| 免费日韩一区二区三区| 国产精品亚洲片在线播放| 少妇高潮一区二区三区99| 午夜天堂精品久久久久| 久久夜色精品| 免费日韩av片| 亚洲综合小说| 日韩一区二区三区高清在线观看| 国内精品亚洲| 国产亚洲欧美日韩精品一区二区三区 |