從其他程式推送資料到php程式裡, 然後對資料進行判斷是否存在,存在則退出;不存在則插入資料庫, 並返回處理結果到資料來源
當流量大,出現卡庫的情況, 返回不到結果到資料來源。就會重複請求3次。最後的結果就是3次請求的資料都插入了
慢導致判斷不到資料是否存在。大神們,有什麼好的解決辦法嗎?
升級配置是一方面. 在程式上應該怎麼解決這個問題呢
回複內容:
從其他程式推送資料到php程式裡, 然後對資料進行判斷是否存在,存在則退出;不存在則插入資料庫, 並返回處理結果到資料來源
當流量大,出現卡庫的情況, 返回不到結果到資料來源。就會重複請求3次。最後的結果就是3次請求的資料都插入了
慢導致判斷不到資料是否存在。大神們,有什麼好的解決辦法嗎?
升級配置是一方面. 在程式上應該怎麼解決這個問題呢
我覺得你的重複這個和卡庫並沒有太大關係, 流量大的時候對資料庫做高並發的插入處理, 這種方式本身就可能有問題, 在這種情況情況下, 是不是可以通過隊列
(使用redis就可以實現)來防止你的插入重複的問題會比較好一些呢.
至於卡庫, 當然是和流量有關係了, 對此, 你可以把庫進行主從配置
, 主庫用來寫, 從庫用來讀, 這樣讀的壓力就不會落在主庫上面了, 也就不會太卡,同時, 對於讀的操作, 必要添加一些緩衝, memcached, redis都很不錯
首先一個問題,你是如何判斷這條資料是唯一的?如果必須先插入才知道,那我建議使用redis做一個鎖,對你這個使用者的操作加鎖,然後去改資料庫。
mysql沒有upsert比較遺憾
當然自己實現一個upsert也可以 如果資料能hash的話 可以利用類似bloom filter的方法在記憶體裡先過濾一道
不準的再去查資料庫
單從mysql可以使用事務配合唯一索引來做到資料不重複
這個問題是和卡庫沒關係,實際上應該是程式上的寫法出錯了。資料庫是有隊列的,不需要你自己去處理。
查詢-->返回-->插入
你的問題應該出現在資料庫返回給PHP的時候,又被查詢了一樣的不存在資料,因為返回還是不存在,所以PHP還是執行了插入。可以考慮用預存程序直接在資料庫判斷存在性然後寫入。唯一索引、組合唯一也可以考慮用上。
實際上此類的並發出現機率原則上是非常低的,你可以檢查下是不是使用了多線程配置這個網站了。
多謝幾位了.