首頁>Club>
在實際開發中一般分為業務層和資料訪問層,針對快取應該放在那層比較模糊
20
回覆列表
  • 1 # 會點程式碼的大叔

    不應該問Redis快取的是業務資料還是資料庫資料,可以問Redis是屬於業務層還是資料層,這樣問比較合理。

    我覺得Redis屬於資料層;首先我們先看一個概念。

    DAO

    data access object:資料訪問物件

    主要用來封裝對資料的訪問,注意,是對資料的訪問,不是對資料庫的訪問。

    其實你的資料可以在資料庫,在檔案中,還是在Redis中,都可以透過DAO層訪問。

    所以我把Redis看成和資料庫是同一個級別的。

    Mybatis的二級快取

    我們使用Redis的時候,很多時候都是透過程式碼操作Redis,比如使用用Jedis,其實還有一個簡單的辦法,就是使用Redis做Mybatis的二級快取,只需要做簡單的配置和極少量的程式碼即可。

    引入所需要的jar包:

    增加配置檔案

    實現org.apache.ibatis.cache.Cache介面

    mybatis-config.xml開啟二級快取:

    <setting name="cacheEnabled" value="true" />

    mybatis的Mapper配置檔案中增加配置:

    <cache type="com.xxx.xxx.cache.RedisCache" />

    其中useCache="false"表示,這個查詢SQL不進行快取;useCache="true",這個查詢SQL的結果進行快取。

    其餘的insert、update、delete操作,可以進行如下配置:flushCache="true/false",當設定成true的時候,執行sql會把redis中的快取刪除(呼叫Cache實現類的clear()方法),設定成false,則不做操作。

    所以到這裡也可以清楚的理解何時進行快取、何時進行刪除快取了:程式剛啟動的時候,Redis中是空的。每次執行select的時候,首先會去redis讀取,讀取不到的話,再去db中查詢,查詢結束後,將結果存入redis中(key裡面包含了SQL語句),注意,如果sql查詢無結果,也會放入redis中。執行insert、update、delete語句的時候,清除對應的redis中的值。

    整理的功能實現還是很簡單的,大家有興趣可以嘗試一下。

    如果大家需要demo的原始碼,後續我整理一下發出來,有需要的朋友可以關注下我。

  • 2 # 此生唯一

    這種問題本身就不存在的,好嗎?

    redis功能那麼強,你如果把它限定死某種資料型別或者業務型別上,你就大錯特錯了!

    看下redis特性:

    1,多語言支援:基本上支援所有的程式語言,包括JAVA,C,Ruby,python等等!

    2,多種資料型別:跟memcache等傳統記憶體快取相比,redis支援更多的資料型別!包括list,set,treemap等等這種高階的資料結構!

    3,單執行緒:沒錯,現如今單執行緒大行其道的時代,redis使用了單執行緒模型,雖然效能比多執行緒略有降低,但是Redis結合了tcmalloc和jemalloc兩個記憶體分配器,分配效率極好,再加上單執行緒少了上下文切換,保證資料安全(不存線上程資料共享)的特性,可以說單執行緒也算是優勢了!

    4,持久化:可配置磁碟持久化資料,保證和關係型資料庫一樣,資料不丟失!

    5,主從複製:redis支援搭建大型高可用的叢集,避免單點故障帶來的資料丟失!

    6,效能逆天:秒級的存取速度達到10萬左右,應付大多數的分散式大資料量場景了!相比較關係型資料庫,減少了IO,磁碟指標切換的時間,效能很好!

    既然redis那麼好用,那麼redis一般有哪些使用場景呢?

    1,快取:記憶體型快取速度極快,可用於快取靜態資料(資料庫中的定義表,程式碼中的列舉,大量靜態配置等等),一般透過定時任務將資料快取!

    2,定期時間:redis自帶的set和get方法中可以設定過期時間,在配置諸如頁面登入過期失效,前端操作流程失效等等,十分方便!

    3,資料共享:分散式架構存在比如session,token,某個共享變數等的資料共享的情況,會有資料不安全,可統一配置在redis中進行儲存,利用redis單執行緒的特性,可保證資料的一致性!

    4,分散式鎖:透過使用sernx方法,實現分散式鎖,在訊息消費,資料存取的時候實現加鎖,保證資料安全!

    5,計數器:同樣使用redis單執行緒原理,可以自己實現計數器,也可用自帶的增加方法!

    redis作為一個key-value型別的記憶體資料庫,在保證效能很強的情況下,實現資料的安全存取,同時支援多種類的資料型別,可以說是資料快取的不二之選!

    如果你有redis使用方面的任何問題,可以私聊我,知無不答!

  • 3 # Java架構進階阿南

    請看影片,解決了這個問題。內容剛剛好,解說幽默風趣

    http://www.365yg.com/item/6546137575579451911/

  • 4 # 一個存在感小透明

    我們在BAT裡做平臺開發的工程師,已經越來越離不開Redis了。

    我們用redis主要就是代替memcached,來做快取。

    從功能上,redis既可以做業務資料的快取,也可以做資料庫快取,接下來我來分別介紹。

    資料庫快取

    目前大多數場景都是使用redis做資料庫快取。舉個例子,一個任務的建立首先要寫入資料庫,從而得到一個id,然後這個任務要去執行。執行過程中可能要多次讀取修改這個任務的某些欄位,比如修改狀態欄位,執行者欄位,使用者頻繁輪訓這個任務狀態等等,如果這個過程頻繁去讀寫資料庫無疑容易給MySQL帶來額外的負擔,那這種場景就非常適合引入redis作為快取。在資料寫入MySQL後,把這個資料同樣寫入redis,然後在這個任務徹底完成之前,所以讀過程都在redis中實現,如果使用者輪詢這個任務的狀態,那麼直接從redis中將任務狀態讀取給他就好了,這樣就減少了MySQL的讀壓力。

    但是要注意的是,redis只是作為快取,當任務發生不一致的情況時,一切要以MySQL中的資料為準,舉例期間redis宕機了(雖然很少發生),那麼要有相應的備案,將MySQL中的資料重新load進redis。

    業務資料快取

    由於redis強大的讀寫能力,我們也可以將一些業務資料快取在redis。

    舉例,我們有個場景,一個平臺多個場景需要動態的調整某些引數的閾值。每次都修改程式碼裡的閾值,再重啟伺服器的話這個代價實在是太大了。這種時候不妨將閾值從記憶體中讀取改為去redis中讀取。這樣每次要修改閾值,直接去redis中修改對應的資料就好了,即修即生效,免去了重啟伺服器的代價。

    redis本身作為工具,提供的是能力,而不應該被限制場景。

    綜上,利用redis強大又快速的讀寫能力,我們既能實現資料庫快取也能實現業務資料快取。

  • 中秋節和大豐收的關聯?
  • 如何用“我好愛你”做一首藏頭詩?