springboot-整合redis:做快取,做分散式共享session
阿新 • • 發佈:2018-11-19
springboot-整合redis:做快取,做分散式共享session
文章目錄
完整程式碼下載連結:
https://github.com/2010yhh/springBoot-demos.git
環境
idea2018,jdk1.8,
springboot版本:springboot1.5.9.RELEASE,
1.redis應用場景
參見這篇
2配置
pom需要:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>
redis配置類:RedisConfig
@Configuration @EnableCaching//開啟快取註解 //maxInactiveIntervalInSeconds:session的統一過期時間,預設是1800秒過期,這裡測試修改為60秒 @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60)//註解,開啟redis集中session管理 public class RedisConfig { // 以下redisTemplate自由根據場景選擇 //預設的String-String // @Bean public RedisTemplate RedisTemplate(RedisConnectionFactory factory) { StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(); stringRedisTemplate.setConnectionFactory(factory); return stringRedisTemplate; } @Bean public RedisTemplate<String, Object> RedisTemplate2(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); //GenericJackson2JsonRedisSerializer方便反序列化,redis中也方便檢視json template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.afterPropertiesSet(); return template; } @Bean public RedisTemplate<Object, Object> RedisTemplate3(RedisConnectionFactory factory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); //使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(預設使用JDK的序列化方式) Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(mapper); //使用StringRedisSerializer來序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); //使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(預設使用JDK的序列化方式) template.setValueSerializer(serializer); // 設定hash key 和value序列化模式 template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(serializer); template.afterPropertiesSet(); return template; } /** * redis作為快取 * @param redisTemplate * @return */ @Bean public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) { RedisCacheManager rcm = new RedisCacheManager(redisTemplate); // 多個快取的名稱,目前只定義了一個 rcm.setCacheNames(Arrays.asList("user")); //設定快取過期時間(秒) rcm.setDefaultExpiration(60); return rcm; } /** * 在springboot中使用spring-session的時候, * 在不同的域名下面需要配置cookie主域否則session共享不生效 * @return */ @Bean public CookieSerializer cookieSerializer() { DefaultCookieSerializer defaultCookieSerializer = new DefaultCookieSerializer(); //cookie名字 defaultCookieSerializer.setCookieName("sessionId"); //不同子域時設定 //defaultCookieSerializer.setDomainName("xxx.com"); //設定各web應用返回的cookiePath一致 defaultCookieSerializer.setCookiePath("/"); return defaultCookieSerializer; } }
3.測試
3.1redis基本儲存
新增後:
3.2redis結合db做快取
1)多次查詢結果(設定redis快取過期時間1分鐘:)
2)插入後(設定redis快取過期時間30s:)多次查詢結果
3)更新後(設定redis快取過期時間1分鐘:)多次查詢結果
3.3redis做分散式session共享
1)沒有設定spring-session共享時: 無法共享session
2)設定了spring-session共享時: 共享了session
http://localhost:8090/testredis/ 設定session
http://localhost:8090/testredis/ get session
http://localhost:8091/testredis1/ get session