例子簡介
將spring-cache,spring-session存儲配置為redis,並提供三個例子分別對應cache,session以及redisTemplate的讀寫操作,僅保留了核心代碼,其它配置請參考官方文檔.
配置
- pom
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
- application.properties
# 使用redis存儲session spring.session.store-type=redis # 單位時間秒 server.servlet.session.timeout= 1800 # session存儲名稱 spring.session.redis.namespace=spring:session # redis地址配置, spring.redis.host=localhost
- java配置
@Configuration @EnableCaching public class RedisConfig { /** * 固定方法名稱,否則session序列化不會使用json格式 * org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration#setDefaultRedisSerializer(org.springframework.data.redis.serializer.RedisSerializer) * @return */ @Bean public RedisSerializer<Object> springSessionDefaultRedisSerializer() { //使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(默認使用JDK的序列化方式) Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); //序列化配置 ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); serializer.setObjectMapper(mapper); return serializer; } @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // 配置序列化 RedisCacheConfiguration config = RedisCacheConfiguration .defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer)) // 值序列化方式 簡單json序列化 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(springSessionDefaultRedisSerializer())) //過期時間 .entryTtl(Duration.ofMinutes(5)); return RedisCacheManager .builder(factory) .cacheDefaults(config) // .withCacheConfiguration("cacheName",customConfig) .build(); } @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); template.setValueSerializer(springSessionDefaultRedisSerializer()); //使用StringRedisSerializer來序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); template.afterPropertiesSet(); return template; } }
session配置說明: 默認session存儲redis使用的是JdkSerializationRedisSerializer,要替換則需要手動注入springSessionDefaultRedisSerializer
cache配置說明: 使用withCacheConfiguration可針對緩存名稱定製配置
其它: 官方提供的json格式序列化有Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer,GenericJackson2JsonRedisSerializer會將類名存儲在json字符串中所以可讀性更高,但如果序列化bean不規範則會報錯,例如沒有空構造函數,get,set不全等.
相關代碼
https://gitee.com/MeiJM/spring-cram/tree/master/redis
參考資料
https://docs.spring.io/spring-session/docs/current/reference/html5/#custom-sessionrepository