-
1 # 會點程式碼的大叔
-
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強大又快速的讀寫能力,我們既能實現資料庫快取也能實現業務資料快取。
回覆列表
不應該問Redis快取的是業務資料還是資料庫資料,可以問Redis是屬於業務層還是資料層,這樣問比較合理。
我覺得Redis屬於資料層;首先我們先看一個概念。
DAOdata 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的原始碼,後續我整理一下發出來,有需要的朋友可以關注下我。