談一下我的理解,如果有不對的地方,請留言指正。
MySQL+RedisRedis自身是可以做數據持久化的,很多同學都會想Redis應該可以替代MySQL,但是我們使用一項技術、一個框架的時候,不是看它能不能,而是要看它適合不適合。
所以大多數公司的存儲都是MySQL+Redis,MySQL(或者其他關系型數據庫)作為主存儲,Redis作為輔助存儲,被用作緩存,這樣可以加快訪問讀取的速度,提高性能。
Redis被用作緩存,以減少數據庫IO的讀操作,減輕數據庫的壓力,例如:
存儲熱點數據:經常會被查詢,但是不經常被修改或者刪除的數據;
計數器:諸如很多論壇用于統計點擊數;
分布式鎖及單線程機制;
最新列表、排行榜:請不要使用select top 10 from xxxx。
劃重點,下面介紹一下緩存穿透很多時候,程序員習慣先查詢Redis,查詢不到的話再去查詢數據庫,能查到的話再寫入Redis中,認為這樣不僅緩解了數據庫的壓力,同時也能保證數據的準確性。
但是由于緩存不命中就會查詢數據庫,如果一直查詢不到的話,就導致每次請求都會查詢數據庫,如果短時間內有大量這樣的請求,那么數據庫可能會扛不住。
這就是緩存穿透。
其實應對的方法也很簡單,查詢不到的數據,也緩存到Redis中,并設置數據的過期時間。
舉個不一定恰當的例子,例如Redis中緩存員工信息,提供接口根據工號查詢員工信息:
接口入參工號A001。
系統先在Redis中查詢,查詢不到。
系統去數據庫中查詢,也查詢不到。
系統插入Redis,key=A001,value=null,設置過期時間五分鐘。
這樣,五分鐘之內再根據A001查詢,不會穿透到數據庫。
四分鐘后,數據庫中插入了A001的數據。
五分鐘后,Redis中數據過期,下一次請求過來,會查詢數據庫,并把信息加載到Redis中。
希望我的回答,能夠幫助到你!
我會持續分享Java程序開發、架構設計、職業發展等方面的知識和見解,希望能得到你的關注今日頭條【會點代碼的大叔】,轉載請注明出處。