Redis高併發問題

2021-10-07 02:50:50 字數 861 閱讀 9974

商品搶購秒殺等活動

使用redis列表結構實現佇列資料結構,強拆的用rpush入隊,再用lpop出隊.

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值,這樣就不會再次呼叫資料庫,影響效率等問題。

利用Redis鎖解決高併發問題

這裡我們主要利用redis的setnx的命令來處理高併發。setnx 有兩個引數。第乙個引數表示鍵。第二個引數表示值。如果當前鍵不存在,那麼會插入當前鍵,將第二個引數做為值。返回 1。如果當前鍵存在,那麼會返回0。建立庫存表 create tablestorage idint 11 unsigned...

利用Redis鎖解決高併發問題

這裡我們主要利用redis的setnx的命令來處理高併發。setnx有兩個引數。第乙個引數表示鍵。第二個引數表示值。如果當前鍵不存在,那麼會插入當前鍵,將第二個引數做為值。返回1。如果當前鍵存在,那麼會返回0。建立庫存表 create table storage id int 11 unsigned...

redis解決併發問題

用redis處理高併發是個很常見的方式,因為redis的訪問效率很高 直接訪問記憶體 一般我們會用來處理 一瞬間的併發量。那如果要使用redis來進行高併發問題的解決的話,應注意以下幾點 1 首先我們要先知道,我們在儲存時,應使用redis的setnx方法,不應該使用set方法,因為setnx擁有原...