巧用Spring Boot中的Redis
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、引入依賴包
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 為我們隔離了其中的差異性。
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
以上都是手動使用的方式,如何在查找數(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、引入依賴
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)容。