在使用spring boot2.x運行redis時,發現百度不到順手的文檔,搞通后發現其實這個過程非常簡單和簡潔,覺得有必要拿出來分享一下。
spring boot2.x 不再使用jedis,換成了lettuce。lettuce是基于 netty 實現的,所以性能更好。但是我看到很多文章居然在spring boot 2.x還在寫jedis的配置。
依賴
依賴比較簡單,spring-boot-starter-data-redis、commons-pool2 即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!-- redis --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-redis</artifactid> </dependency> <!--spring2. 0 集成redis所需common-pool2--> <dependency> <groupid>org.apache.commons</groupid> <artifactid>commons-pool2</artifactid> <version> 2.4 . 2 </version> </dependency> |
屬性配置
在屬性中配置redis server的訪問地址、密碼、數據庫,并配置連接池的屬性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
redis: # reids的連接ip host: 127.0 . 0.1 port: 6379 password: helloworld # redis默認情況下有 16 個分片,這里配置具體使用的分片,默認是 0 database: 0 # 連接超時時間(毫秒) timeout: 10000ms # redis client配置,使用lettuce lettuce: pool: # 連接池中的最小空閑連接 默認 0 min-idle: 0 # 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 - 1 max-wait: 1000ms # 連接池最大連接數(使用負值表示沒有限制) 默認 8 max-active: 8 # 連接池中的最大空閑連接 默認 8 max-idle: 8 |
注解配置
全局使能緩存
1
2
3
4
5
6
7
8
9
|
@enableswagger2 // 使用swagger api 功能 @enablecaching // 使用緩存 @springbootapplication public class starter { public static void main(string[] args) { springapplication.run(starter. class , args); } } |
通過注解使用緩存,@cacheable 將獲取值存入緩存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/** * 基于id 獲取用戶信息 */ @cacheable (value= "user" , key= "#id" , unless= "#result == null" ) public userdto getuserbyid( int id) { user userentity = usermapper.getuserbyid(id); if (userentity == null ){ return null ; } /* entity 轉 dto */ userdto userdto = new userdto(); userdto.setage(userentity.getage()); userdto.setid(id); userdto.setname(userentity.getname()); userdto.setcreatetime(unixtime2string(userentity.getcreatetime())); userdto.setphone(userentity.getphone()); userdto.setemail(userentity.getemail()); return userdto; } |
@cacheput 更新緩存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@cacheput (value = "user" , key= "#p0.id" ) public userdto updateuser(inputuserinfodto inputuserinfodto){ usermapper.updateuser(inputuserinfodto.getid(), inputuserinfodto.getname(), inputuserinfodto.getage()); user userentity = usermapper.getuserbyid(inputuserinfodto.getid()); /* entity 轉 dto */ if ( null == userentity){ return null ; } userdto userdto = new userdto(); userdto.setage(userentity.getage()); userdto.setid(userentity.getid()); userdto.setname(userentity.getname()); userdto.setcreatetime(unixtime2string(userentity.getcreatetime())); userdto.setphone(userentity.getphone()); userdto.setemail(userentity.getemail()); return userdto; } |
@cacheevict 刪除緩存
1
2
3
4
|
@cacheevict (value = "user" , key= "#id" ) public void deleteuser( int id){ usermapper.deleteuser(id); } |
當然為了支持序列化,我的userdto得implements serializable
1
2
3
4
5
6
7
8
9
10
|
@data public class userdto implements serializable { //public class userdto implements serializable { private int id; private string name; private int age; private string createtime; private string phone; private string email; } |
至此緩存已經可以用起來了,不需要編寫redisconfig代碼,有點小遺憾,直接去redis查看數據,發現是亂碼。這是因為我使用的是java自帶的序列化,如果要更換redis序列化方法,就要重寫redisconfig了。
redisconfig
這個配置也不復雜,使用jackson2jsonredisserializer將對象轉換為json串,注意這里一定要使用objectmapper,否則再將json串反序列化為對象時會報。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
@configuration @conditionalonclass (redisoperations. class ) @enableconfigurationproperties (redisproperties. class ) public class redisconfig extends cachingconfigurersupport{ @bean public cachemanager cachemanager(redisconnectionfactory factory) { redisserializer<string> redisserializer = new stringredisserializer(); jackson2jsonredisserializer jackson2jsonredisserializer = new jackson2jsonredisserializer(object. class ); //解決查詢緩存轉換異常的問題 objectmapper om = new objectmapper(); om.setvisibility(propertyaccessor.all, jsonautodetect.visibility.any); om.enabledefaulttyping(objectmapper.defaulttyping.non_final); jackson2jsonredisserializer.setobjectmapper(om); // 配置序列化(解決亂碼的問題) rediscacheconfiguration config = rediscacheconfiguration.defaultcacheconfig() .entryttl(duration.zero) .serializekeyswith(redisserializationcontext.serializationpair.fromserializer(redisserializer)) .serializevalueswith(redisserializationcontext.serializationpair.fromserializer(jackson2jsonredisserializer)) .disablecachingnullvalues(); rediscachemanager cachemanager = rediscachemanager.builder(factory).cachedefaults(config).build(); return cachemanager; } } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://segmentfault.com/a/1190000017953598