84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
是這樣的,我要操作一個智慧燈泡,目前是這樣做的,我在網頁上操作,然後把資料透過http提交存到資料庫,有一個客戶端發起一個socket連接,連接到服務端,服務端是死循環地從資料庫裡面取出資料給客戶端,每次操作後休眠一下,如果客戶端很多,例如10萬,我每秒就要查詢資料庫10W次,所以想改進,服務端收到http資料後,就立刻給客戶端,不需要存資料庫了。
认证高级PHP讲师
try yi try “websocket”另外,不建議每次查詢都操作資料庫。你可以唸出來放到cache裡,每次查詢都直接從cache裡讀。 然後另外一個程序監控到該值發生變化以後,修改資料庫的同時,更新一下cache。
可以考慮記憶體資料庫redis,然後定時持久化,也就是記憶體。
客戶端很多,為什麼要讀10w次?客戶端和伺服器長連,服務端記憶體中保存一個映射:
map[client_id] = socket_fd
http提交存到資料庫,服務端死循環讀取資料庫信息,如果是發給某一個客戶端的,訊息中應該包含客戶端的client_id,從map找到socket_fd,訊息發送出去就好了,如果是廣播到所有客戶端,遍歷map發送也就可以了。讀幾次資料庫,只跟訊息數量有關係,跟多少個客戶端沒關係吧。
上面說的資料庫,完全可以採用redis或nsq之類的訊息佇列實現,服務端開多個執行緒或協程並發處理就好了,如果部入庫,直接拿到資料send出去,如果你的服務端crash,數據不就丟了?可靠性沒辦法保證。
try yi try “websocket”
另外,不建議每次查詢都操作資料庫。你可以唸出來放到cache裡,每次查詢都直接從cache裡讀。 然後另外一個程序監控到該值發生變化以後,修改資料庫的同時,更新一下cache。
可以考慮記憶體資料庫redis,然後定時持久化,也就是記憶體。
客戶端很多,為什麼要讀10w次?客戶端和伺服器長連,服務端記憶體中保存一個映射:
http提交存到資料庫,服務端死循環讀取資料庫信息,如果是發給某一個客戶端的,訊息中應該包含客戶端的client_id,從map找到socket_fd,訊息發送出去就好了,如果是廣播到所有客戶端,遍歷map發送也就可以了。讀幾次資料庫,只跟訊息數量有關係,跟多少個客戶端沒關係吧。
上面說的資料庫,完全可以採用redis或nsq之類的訊息佇列實現,服務端開多個執行緒或協程並發處理就好了,如果部入庫,直接拿到資料send出去,如果你的服務端crash,數據不就丟了?可靠性沒辦法保證。