巧用Spring Boot中的Redis

      網(wǎng)友投稿 889 2025-04-03

      Redis 介紹


      Redis 是目前業(yè)界使用最廣泛的內(nèi)存數(shù)據(jù)存儲。相比 Memcached,Redis 支持更豐富的數(shù)據(jù)結(jié)構(gòu),例如 hashes, lists, sets 等,同時支持數(shù)據(jù)持久化。除此之外,Redis 還提供一些類數(shù)據(jù)庫的特性,比如事務(wù),HA,主從庫。可以說 Redis 兼具了緩存系統(tǒng)和數(shù)據(jù)庫的一些特性,因此有著豐富的應(yīng)用場景。本文介紹 Redis 在 spring boot 中兩個典型的應(yīng)用場景。

      如何使用

      1、引入依賴包

      ????org.springframework.boot ????spring-boot-starter-data-redis ????org.apache.commons ????commons-pool2

      Spring Boot 提供了對 Redis 集成的組件包:spring-boot-starter-data-redis,spring-boot-starter-data-redis依賴于spring-data-redis 和 lettuce 。Spring Boot 1.0 默認使用的是 Jedis 客戶端,2.0 替換成 Lettuce,但如果你從 Spring Boot 1.5.X 切換過來,幾乎感受不大差異,這是因為 spring-boot-starter-data-redis 為我們隔離了其中的差異性。

      巧用Spring Boot中的Redis

      Lettuce 是一個可伸縮線程安全的 Redis 客戶端,多個線程可以共享同一個 RedisConnection,它利用優(yōu)秀 netty NIO 框架來高效地管理多個連接。

      2、添加配置文件

      #?Redis數(shù)據(jù)庫索引(默認為0)spring.redis.database=0?? #?Redis服務(wù)器地址spring.redis.host=localhost#?Redis服務(wù)器連接端口spring.redis.port=6379?? #?Redis服務(wù)器連接密碼(默認為空)spring.redis.password=#?連接池最大連接數(shù)(使用負值表示沒有限制)?默認?8spring.redis.lettuce.pool.max-active=8#?連接池最大阻塞等待時間(使用負值表示沒有限制)?默認?-1spring.redis.lettuce.pool.max-wait=-1#?連接池中的最大空閑連接?默認?8spring.redis.lettuce.pool.max-idle=8#?連接池中的最小空閑連接?默認?0spring.redis.lettuce.pool.min-idle=0

      3、添加 cache 的配置類

      @Configuration@EnableCachingpublic?class?RedisConfig?extends?CachingConfigurerSupport{????@Bean ????public?KeyGenerator?keyGenerator()?{????????return?new?KeyGenerator()?{????????????@Override ????????????public?Object?generate(Object?target,?Method?method,?Object...?params)?{ ????????????????StringBuilder?sb?=?new?StringBuilder(); ????????????????sb.append(target.getClass().getName()); ????????????????sb.append(method.getName());????????????????for?(Object?obj?:?params)?{ ????????????????????sb.append(obj.toString()); ????????????????}????????????????return?sb.toString(); ????????????} ????????}; ????} }

      注意我們使用了注解:@EnableCaching來開啟緩存。

      4、好了,接下來就可以直接使用了

      @RunWith(SpringRunner.class)@SpringBootTestpublic?class?TestRedis?{????@Autowired ????private?StringRedisTemplate?stringRedisTemplate;????@Autowired ????private?RedisTemplate?redisTemplate;????@Test ????public?void?test()?throws?Exception?{ ????????stringRedisTemplate.opsForValue().set("aaa",?"111"); ????????Assert.assertEquals("111",?stringRedisTemplate.opsForValue().get("aaa")); ????}????@Test ????public?void?testObj()?throws?Exception?{ ????????User?user=new?User("aa@126.com",?"aa",?"aa123456",?"aa","123"); ????????ValueOperations?operations=redisTemplate.opsForValue(); ????????operations.set("com.neox",?user); ????????operations.set("com.neo.f",?user,1,?TimeUnit.SECONDS); ????????Thread.sleep(1000);????????//redisTemplate.delete("com.neo.f"); ????????boolean?exists=redisTemplate.hasKey("com.neo.f");????????if(exists){ ????????????System.out.println("exists?is?true"); ????????}else{ ????????????System.out.println("exists?is?false"); ????????}???????//?Assert.assertEquals("aa",?operations.get("com.neo.f").getUserName()); ????} }

      以上都是手動使用的方式,如何在查找數(shù)據(jù)庫的時候自動使用緩存呢,看下面;

      5、自動根據(jù)方法生成緩存

      @RestControllerpublic?class?UserController?{????@RequestMapping("/getUser")????@Cacheable(value="user-key")????public?User?getUser()?{ ????????User?user=new?User("aa@126.com",?"aa",?"aa123456",?"aa","123"); ????????System.out.println("若下面沒出現(xiàn)“無緩存的時候調(diào)用”字樣且能打印出數(shù)據(jù)表示測試成功");????????return?user; ????} }

      其中 value 的值就是緩存到 Redis 中的 key

      共享 Session

      分布式系統(tǒng)中,Session 共享有很多的解決方案,其中托管到緩存中應(yīng)該是最常用的方案之一,

      Spring Session provides an API and implementations for managing a user’s session information.

      Spring Session 提供了一套創(chuàng)建和管理 Servlet HttpSession 的方案。Spring Session 提供了集群 Session(Clustered Sessions)功能,默認采用外置的 Redis 來存儲 Session 數(shù)據(jù),以此來解決 Session 共享的問題。

      1、引入依賴

      ????org.springframework.session ????spring-session-data-redis

      2、Session 配置:

      @Configuration@EnableRedisHttpSession(maxInactiveIntervalInSeconds?=?86400*30)public?class?SessionConfig?{ }

      maxInactiveIntervalInSeconds: 設(shè)置 Session 失效時間,使用 Redis Session 之后,原 Spring Boot 的 server.session.timeout 屬性不再生效。

      好了,這樣就配置好了,我們來測試一下

      3、測試

      添加測試方法獲取 sessionid

      @RequestMapping("/uid")String?uid(HttpSession?session)?{ ????UUID?uid?=?(UUID)?session.getAttribute("uid");????if?(uid?==?null)?{ ????????uid?=?UUID.randomUUID(); ????} ????session.setAttribute("uid",?uid);????return?session.getId(); }

      登錄 Redis 輸入 keys 'sessions'

      t

      其中 1472976480000 為失效時間,意思是這個時間后 Session 失效,db031986-8ecc-48d6-b471-b137a3ed6bc4?為 sessionId,登錄?http://localhost:8080/uid?發(fā)現(xiàn)會一致,就說明 Session 已經(jīng)在 Redis 里面進行有效的管理了。

      如何在兩臺或者多臺中 共享 Session

      其實就是按照上面的步驟在另一個項目中再次配置一次,啟動后自動就進行了 Session 共享。

      --------------------------------

      本文轉(zhuǎn)自java經(jīng)驗博客51CTO博客

      Redis Spring Boot Spring

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:文件顯示字體與實際字體不一樣,怎么回事?(為什么文件字體不一樣)
      下一篇:如何將文中所有錯詞替換(怎么把文中所有錯詞替換)
      相關(guān)文章
      亚洲爱情岛论坛永久| 亚洲综合色成在线播放| 国产成A人亚洲精V品无码| 在线91精品亚洲网站精品成人| 亚洲欧美成人一区二区三区| 亚洲综合一区二区三区四区五区| 国产午夜亚洲精品| 国产精品亚洲一区二区麻豆| 久久久久久亚洲精品影院| 亚洲不卡中文字幕| 亚洲精品国产日韩| 亚洲日韩精品A∨片无码加勒比| 亚洲中文字幕无码mv| 亚洲精品欧美综合四区| 亚洲AV无码一区二区三区性色| 亚洲国产成人久久综合| 色婷婷亚洲一区二区三区| 亚洲成A人片在线观看中文| 国产偷窥女洗浴在线观看亚洲 | 亚洲中文字幕无码一区二区三区| 久久久久国产成人精品亚洲午夜 | 久久夜色精品国产嚕嚕亚洲av| 亚洲老妈激情一区二区三区| 国产l精品国产亚洲区在线观看| 亚洲va久久久噜噜噜久久| 亚洲精品高清国产一久久| 亚洲韩国在线一卡二卡| 亚洲国产精品综合久久久| 亚洲永久网址在线观看| 丰满亚洲大尺度无码无码专线| 亚洲高清国产拍精品青青草原 | 最新亚洲卡一卡二卡三新区| 亚洲精品亚洲人成在线| 亚洲成年看片在线观看| 亚洲深深色噜噜狠狠爱网站| 久久亚洲国产精品| 亚洲免费观看在线视频| 亚洲精品国产第一综合99久久| 在线a亚洲v天堂网2018| 亚洲午夜久久久久妓女影院| 夜夜亚洲天天久久|