Redis在專案中的正確使用

2021-10-20 16:32:54 字數 988 閱讀 9173

問題:比如在我們的系統中搜尋乙個不存在id的產品,這個產品對應的id就不會存到redis中,資料庫中也不會有這個id。所有當我們不停的傳送根據這個id查詢的請求時,就會直接命中到我們的資料庫。當請求量非常大時就會把我們的資料庫給幹宕機。

解決方案:當搜尋乙個不存在的產品id時,首先會因為我們的redis中沒有資料進而去查詢我們的db,然後查詢到乙個null,這個時候我們也將這個產品id進行快取起來,對應的value為null即可,然後設定乙個失效時間。為什麼要設定乙個失效時間呢,首先可以節省快取,其次擔心我們的db中某天真的加入了這個id的產品,導致一直查詢redis為null,我們也可以使用布隆過濾器將所有的產品進行儲存,但是布隆過濾器不支援刪除資料,如果要刪除得重新初始化資料。

問題:由於我們批量匯入到redis中的資料都加入了失效時間,並且失效時間都是相同的,所以導致我們的key大面積的同一時刻被刪除。然後所有的請求命中我們的資料庫。然後導致資料庫宕機。

解決方案:批量匯入資料的時候設定快取key的失效時間為隨機數即可。

問題:請求量過大,快取層突然掛掉,所有的請求直接命中資料庫。

解決方案:搭建高可用的快取層,reids哨兵/集群。或者使用介面限流hystrix。

問題:專案中我們不是會將所有的產品id進行快取的,但這時候如果大量的請求去查詢這個產品id時,在高併發的情況下就會出現大量的請求命中到我們的資料庫。導致資料庫宕機。

解決方案:使用分布式鎖,當第乙個請求拿到鎖後去查詢db然後將這個產品id進行快取起來,後面的請求就可以重新重快取中獲取到了。

問題:新資料會被舊資料所覆蓋

解決方案:歸根結底的原因就是因為併發過大量的執行緒並行的導致的,所以我們可以將並行轉為序列。這個時候我們可以使用訊息佇列mq或者是鎖來實現。mq:所有的請求都加入到我們的mq中,讓請求有序的執行。分布式讀寫鎖:可以使用redis的分布式讀寫鎖。redisson.getreadwritelock("key");這種就會稍微比mq好一點,所有的讀請求就跟沒有鎖一樣,遇到寫請求就會對這個key加乙個排它鎖,其他執行緒都得等待。

redis在專案中的使用

1.各種計數,商品維度計數和使用者維度計數 2 6 2.儲存社交關係 譬如將使用者的好友 粉絲 關注,可以存在乙個sorted set中,score可以是timestamp,這樣求兩個人的共同好友的操作,可能就只需要用求交集命令即可。redis zadd user 100000 follow 613...

redis在專案中的使用

快取的使用就是為了提高效率,避免重複的io操作浪費效率。查詢時使用,如selectbyid value 快取區名稱,key 在快取區內對應的鍵,表示查詢快取區 user 中key為引數id的快取,如果沒有則查詢資料庫,並把資料放入快取中 注意這裡快取的資料是指方法執行完成返回的結果 以後直接從緩訪問...

在專案中使用redis

在專案中使用redis,今天我初步學習了redis整合在j a專案中的方法,這些都是比較初級的入門知識。1.先引入相關的jar包,我這裡使用的是jedis 2.1.0.jar,通過這個jar包來連線redis的服務端。2.j a鏈結redis服務端 程式中的setup方法就是連線redis服務端的方...