高並發常見場景
商品搶購秒殺等活動
解決方式
使用Redis 列表結構實現隊列數據結構,搶成功的使用 rpush 入隊,再使用 lpop 出隊。
Redis高並發可能產生的問題
redis宕機了,或者鏈接不上
解決方法:
配置主從復制,配置哨兵模式,一旦發現主機宕機,讓下一個從機當做主機。
最壞的情況,只能關閉Redis連接,去往數據庫連接。但由於數據量大,這樣SQL數據庫也會宕掉的。
如果redis緩存在高峰期到期失效,在這個時刻請求會向雪崩一樣,直接訪問數據庫如何處理?
設置條件查詢判斷,判斷redis緩存里是否有數據,如果沒有,則去往數據庫連接。當然要加分布式鎖,利用redis的單線程+多路IO復用技術,原子性原理,讓其它的線程請求等待,假若第一個線程進去獲取到分布式鎖在查詢數據的途中宕掉了,不能讓其它線程一直等待,設置等待一定時間判斷是否取回數據,如果沒有,遞歸調用自己的方法讓第二個線程繼續拿分布式鎖查詢數據庫。當第二個鎖從數據庫拿到數據時,把數據值設置到redis數據庫緩存中,設置失效時間,避免占內存,方便使用提高效率。
如果用戶不停地查詢一條不存在的數據,緩存沒有,數據庫也沒有,那么會出現什么
如果數據不存在,緩存中沒有,數據庫也沒有,當然如果不設置判斷,會一直調用數據庫,使數據庫效率降低,訪問量大時甚至會宕機。
解決方案:從數據庫查詢,如果數據庫沒有,則返回值為Null,判斷數據庫返回的值,如果為Null,則自定義把標識的字段存到Redis中,用key,value的方法,setex key empty,設置失效時間跟具體情況而定,然后調用get key ,判斷是否獲取的值"empty" ,如果相等,則拋出自定義異常,給用戶提示,或者直接return null。這樣用戶再次查詢的時候由於先從reids緩存中查詢,redis會有對應的Key獲取之前設置的value值,這樣就不會再次調用數據庫,影響效率等問題。
參考資料
網站大規模並發處理方案:電商秒殺與搶購 這篇寫的很好