[toc]
## :-: **隊列 的 概念**
1、是隊列結構的中間件
2、消息放入后<span style="color:red;">不需要立即處理</span>
3、由訂閱者/消費者按順序處理
## :-: **隊列 原理**

- 也是解耦的原理:業務系統和隊列處理系統沒有關系
- 一個寫(業務系統),一個讀(隊列管理系統)。
- <span style="color:red;">寫的只管</span>往隊列里<span style="color:blue;">寫</span>,別的不用操心,讀的能不能讀完和寫的也沒有關系
- 同樣,<span style="color:red;">讀的只管</span>從隊列里往外<span style="color:blue;">讀</span>,來活兒就干,沒活兒歇著
## :-: **應用場景**
- 冗余:<span style="color:red;">持久化的存儲在隊列中</span>,后續由訂單處理程序獲取,處理完成之后,在把這條記錄進行刪除
- 解耦:是解這2套系統(業務和隊列處理),我們平常做的都是一套系統的。入隊和出隊的系統沒有直接的關系,<span style="color:red;">其中一套蹦了,另一套系統不會受影響</span>,因為中間隔了個隊列
- 流量削鋒:秒殺和搶購。流量劇增,<span style="color:red;">配合緩存使用消息隊列</span>(就是限制下,如 只允許10個,隊列里存10個之后就不存了,在來就提示秒殺結束)
- 異步通信:<span style="color:red;">因為消息本身就可使入隊的系統</span>直接返回,所以說實現了程序的異步操作
- 場景擴展性:如 現在只有訂單系統和財務系統,后續我想加個配貨系統,<span style="color:red;">直接讓配貨系統訂閱這個隊列就可以
</span>
- 排序保證:有些場景下,如 銀行數據的<span style="color:red;">處理順序是很重要</span>的,因為隊列本身就可以做成單線程,單進單出的這種系統
## :-: **實現介質**
1、使用mysql:可靠性高,易實現,速度慢
2、使用redis:速度快,單條大消息包時效率低
3、使用更專業的第三方類庫:專業性強,可靠,學習成本高。
請參考我這篇博客http://blog.csdn.net/qq\_33862644/article/details/79386484
## :-: **消息觸發機制**
1、死循環方式讀取:易實現,故障時無法及時回復(<span style="color:red;">適用于秒殺這種短時間的</span>)
2、定時任務:壓力均分,有處理上限(無論你隊列前的系統,峰值多么不穩定,<span style="color:red;">隊列后的系統依然會定時執行</span>)
>[warning]定時時間是個關鍵:不要上一個還定時任務沒執行完,下一個定時任務就啟動了
示例:訂單系統,下單后將訂單信息寫入隊列后,立刻返回下單成功。配貨系統每隔幾分鐘<span style="color:red;">定時讀取隊列</span>,對訂單進行匯總處理
3、守護進程:類似于php-fpm和cgi,需要shell基礎(用這個進程來檢測,隊列中是否有內容,有內容的話,啟動出隊系統進行處理)
## :-: **使用mysql實現解耦的示例**
- 為什么要解耦:如果架構在一起。訂單系統壓力大,而物流信息是不需要立刻返回的。訂單崩了,物流也就蹦了,所以要解耦


- 表的設計

- 訂單系統寫入隊列的代碼

- 配貨系統讀取隊列的代碼

執行定時任務crontab -e

>[warning] 這日志要自己新建

1、通過瀏覽器訪問order.php添加訂單
2、去數據庫看結果,在shell中的日志中看結果(沒有執行成功,可能是這sh文件需要放在某個特點目錄吧,等復習完 在跑)
## :-: **使用redis進行流量削鋒的示例**

- 思路:
1、秒殺程序請求寫入redis????
2、檢查redis已存放數據的長度,超出上限直接丟棄(返回秒殺結束)
3、死循環處理存入redis的數據并入庫
- 表的設計:

- 秒殺代碼

- 入庫代碼

瀏覽器直接訪問user.php
在shell中使用php -f savetodb.php
去數據庫查看
- 雜談
- 開發 & 維護的工作流程
- 新手如何看php手冊 和 框架手冊
- 開發 & 維護的不同點
- 從0到1,搭建新項目的工作流程
- 從1到N,維護的工作流程
- 優化流程
- 生成錯誤日志和慢日志的方法
- 查錯思路
- 怎么快速接手一個項目
- 前端常用知識點
- javascript
- 自己封裝的函數
- 處理數字
- 功能代碼
- 動態添加圖片
- 判斷是手機端還是pc端
- javascript:;是什么意思?怎么用呢
- html & h5
- a標簽中target設置為blank和_blank有什么區別?
- 亂碼
- 提交方式:button標簽 和 input
- 塊元素
- 內聯元素
- h5特有屬性
- h5的localStorage【增、刪、改、查】
- jquery
- 常用方法
- 功能代碼
- 動態刪除圖片
- 一個按鈕,切換2種狀態
- 換膚
- 深入理解(function(){... })();
- json & xml
- json
- 語法速記
- json對象取值
- 字符串、對象、數組的區別
- xml
- [CDATA[%s]]的作用是什么
- 轉義字符
- CDATA 想被xml解析的文本數據
- CDATA 不想被xml解析的文本數據
- 微信小程序
- 其他
- websocket
- 跨域
- css
- 行內 & 內連 & 外連 寫法
- 優先級
- 更加精準的匹配
- 使用百分比如何生效
- php在html、js、jq中的的原生寫法
- *php在html中的語法
- php在js中的語法
- php在jq中的語法
- 正則表達式
- php常用基礎知識(思想為主)
- php為什么是“邊編譯邊運行”
- 冒號、endif、endwhile、endfor使用
- 遞歸思想(速記法)
- cookie和session的理解
- php常用內置(系統)函數
- 常量
- 字符串
- 數組
- 日期時間
- 文件 & 目錄
- 數學
- 程序執行
- 判斷
- 選項和信息(修改配置文件的)
- 錯誤處理 & 日志記錄
- 編碼格式
- session
- IP相關
- 類 & 對象
- 性能
- 其他函數
- 魔術方法
- $_SERVER
- 變量處理
- php自己封裝的一些函數
- 導入、導出、生成文件
- 數組
- 數字
- 字符串
- 其他
- 獲取linux硬件信息
- 常見插件/類庫使用
- 前端-框架/插件
- bootstrap 學習筆記
- layer 學習筆記
- layDate 學習筆記
- 百度ueditor1.4.4.3富文本編輯器
- quill富文本編輯器
- 百度ECharts圖形報表
- webuploader上傳圖片
- 后端類庫
- workerman 聊天室
- QRCODE 二維碼
- redis
- seaslog 日志
- phpspider 爬蟲
- Mailer 發送郵件
- simple_html_dom
- phpstorm使用
- 快捷鍵
- 連接mysql數據庫
- 斷點 + debug調試
- 運行內存不夠
- wamp環境
- yii、laravel、tp、開發自己的php框架
- 看框架源碼的思路
- tp5框架的使用
- 1、助手函數原理解析
- 開發自己的php框架
- 常用的開發思路 和 小功能實現代碼
- 爬蟲思路
- 功能點思路
- tp5判斷是不是異地登錄(簡單版)
- 微信開發,反向代理
- 微信開發,關閉當前頁面
- 消息隊列的實現
- 頁面靜態化
- session串號
- 站內信設計思路
- web在線管理器
- 語言相關(開發有關)
- 接收json(text/xml)格式數據
- 原生文件上傳(狀態碼)
- openssl擴展
- 打印對象 和 遍歷對象
- 使用OB緩存的幾個原則
- CLI模式執行php文件
- foreach時,添加元素 或 修改元素的值
- 功能點 代碼實現
- 生成url目錄樹(沒有pid)
- 多圖上傳(vue傳base64)
- 下載文件,耗時算法
- 生成商品二維碼
- 導出excel
- 搜索
- 阿里大魚發短信
- 使用阿里云oss
- location.href跳轉后,丟失用戶的session
- “\r ” “\r\n” “\t”的區別
- php的配置文件詳解
- 開啟錯誤日志
- 開啟慢日志
- 開啟短標簽
- 分析php-fpm.conf中的request_terminate_timeout參數