springboot整合redis快取一些知識點

2021-09-29 11:29:53 字數 4212 閱讀 4049

二、config配置類

三、快取註解使用

最近在做智慧型家居平台,考慮到家居的控制需要快速的響應於是打算使用redis快取。一方面減少資料庫壓力另一方面又能提高響應速度。專案中使用的技術棧基本上都是大家熟悉的springboot全家桶,在springboot2.x以後操作redis的客戶端推薦使用lettuce(生菜)取代jedis。

jedis的劣勢主要在於直連redis,又無法做到彈性收縮。

spring::

name

: ******-lettuce

cache

:type

: redis

redis

:# 快取超時時間ms

time-to-live

:60000

# 是否快取空值

cache-null-values

:true

redis

:host

: 127.0.0.1

port

:6379

password

:123456

# 連線超時時間(毫秒)

timeout

:60000

# redis預設情況下有16個分片,這裡配置具體使用的分片,預設是0

database:1

# spring2.x redis client 採用了lettuce(生菜),放棄使用jedis

lettuce

:# 關閉超時時間

shutdown-timeout

:30000

pool

:# 連線池最大連線數(使用負值表示沒有限制) 預設 8

max-active:30

# 連線池最大阻塞等待時間(使用負值表示沒有限制) 預設 -1

max-wait:-1

# 連線池中的最大空閒連線 預設 8

max-idle:8

# 連線池中的最小空閒連線 預設 0

min-idle

:0

已經表明使用專案採用redis做為快取方式。

表示是否快取空值,一般情況下是允許的。因為這涉及到快取的三大問題:快取穿透、快取雪崩、快取擊穿。

如果設定false即不允許快取空值,這樣會導致很多請求資料庫沒有的資料時,不會快取到redis導致每次都會請求到資料庫。這種情況即:快取穿透。

具體想初步了解這些概念可以參考文章:快取三大問題及解決方案!

@configuration

@enablecaching

public

class

redistemplateconfig

extends

cachingconfigurersupport

@bean

(name =

"redistemplate"

)@conditionalo****singbean

(name =

"redistemplate"

)public redistemplate

redistemplate

(lettuceconnectionfactory lettuceconnectionfactory)

/** * 新增自定義快取異常處理

* 當快取讀寫異常時,忽略異常

* 參考:

*/@override

public cacheerrorhandler errorhandler()

@suppresswarnings

("duplicates"

)@bean

@primary

//當有多個管理器的時候,必須使用該註解在乙個管理器上注釋:表示該管理器為預設的管理器

public rediscachemanager cachemanager

(redisconnectionfactory connectionfactory)

/** 遍歷mycaches新增快取配置*/

rediscachemanager cachemanager = rediscachemanager.

builder

( rediscachewriter.

nonlockingrediscachewriter

(connectionfactory)).

cachedefaults

(defaultcacheconfig)

.withinitialcacheconfigurations

(cachemap)

.transactionaware()

.build()

; parserconfig.

getglobalinstance()

.addaccept

("mypackage.db.entity.");

return cachemanager;

}/**

* key序列化方式

* @return

*/private redisserializationcontext.serializationpair

keypair()

private redisserializer

keyserializer()

/** * value序列化方式

* @return

*/private redisserializationcontext.serializationpair

valuepair()

/** * 使用fastjson序列化

* @return

*/private redisserializer

valueserializer()

@getter

private

enum mycaches

/** 失效時間 */

private duration ttl = duration.

ofhours(1

);}}

表明開啟快取功能。

這個類就很豐富了,其實如果沒有什麼特別操作也可以不用繼承這個類。

這個類可以支援動態選擇快取方式,比如專案中不止一種快取方案,有可能有ehcache那麼可以自定義在什麼情況下使用redis使用情況下使用ehcache。還有一些有關異常的處理。我也不是很懂具體可以參考:

springboot(25)自定義快取讀寫機制cachingconfigurersupport

(1)兩者的主要差別是:如果你只想快取簡單的字串選擇stringredistemplate是乙個明智的舉措。如果想使用redis快取一些物件資料肯定是要選擇redistemplate。

(2)redistemplate需要注意一點就是要怎麼選擇序列化工具。預設使用jdk的序列化快取資料後即value值是無法直接閱讀的而存的二進位制資料。

通常我們會選擇jackson或者fastjson來序列化物件,把物件轉換成json格式。兩者序列化物件後都會在頭部加上乙個物件類路徑如:@type com.mypackage.entity.user。這個也算是一種安全策略。

比如使用fastjosn就會在cachemanager中指定序列化物件的包所在位置白名單:parserconfig.getglobalinstance().addaccept("mypackage.db.entity.");

fastjson官方說明

(3)還有需要注意如果value是string型別。redistemplate會在字串外圍再加一對雙引號,如"「abc」"。如果使用stringredistemplate讀取則能得到abc,但是我在專案使用jedis讀取就成了"abc"這就導致這些字串無法被反序列化。

(4)stringredistemplate和redistemplate兩者資料是相互隔離的,如果使用stringredistemplate存入的資料使用redistemplate是無法讀取、刪除的。

@cacheable 使用在查詢方法上

@cacheput 使用在更新、儲存方法上

@cacheevict 使用在刪除方法上

需要注意的是@cacheable、@cacheput方法一定要有返回被快取物件。因為註解使用的aop切面如果沒有返回值表示快取物件為空值。

@cacheconfig註解在類上,可以選擇使用哪個快取、快取管理器、key生成器

好了以上就是最近在專案中的一些知識點總結,如果以後使用快取有新的體會我會同步更新的。

Redis安裝 spring註解整合Redis

一 windows 下安裝 開啟乙個cmd視窗,使用cd命令切換到檔案目錄e redis,執行redis server.exe redis.windows.conf。後面那個redis.windows.conf可以省略,如果省略,會啟用預設的。輸入之後,會顯示如下介面 這時候另起乙個cmd視窗,原來...

springBoot整合dubbo整合專案

傳統spring 整合dubbo,需要繁瑣的編寫一堆堆的 xml 配置檔案 而springboot整合dubbo後,不在需要寫 xml,通過jar包引用,完 成整合,通過註解的形式完成配置。提高我們的開發效率 目錄結構 1 服務層生產者開發 hs ldm server service 1.1新增du...

SpringBoot整合系列 整合Swagger2

io.springfox springfox swagger2 2.7.0 io.springfox springfox swagger ui 2.7.0 一般無配置項,必要時可以新增自定義配置項,在配置類中讀取 swagger2的配置內容僅僅就是需要建立乙個docket例項 configurati...