1.在springboot2.0中,通过pom.xml引入spring-boot-starter-cache,spring-boot-starter-data-redis,spring-session-data-redis;可以自动将cache和session数据存入redis数据库.
2.在application.properties中配置如下内容:
#session使用redis进行储存 spring.session.store-type=redis spring.session.redis.namespace=authSession spring.session.redis.flush-mode=immediate #cache使用redis储存 spring.cache.type=redis spring.security.user.password=123 spring.security.user.name=user
#redis内存数据库地址配置 spring.redis.database=1 spring.redis.host=localhost spring.redis.port=6379 spring.redis.jedis.pool.max-active=8 spring.redis.jedis.pool.max-idle=8 spring.redis.jedis.pool.max-wait=-1 spring.redis.timeout=5000
3.通过以后配置后,springboot的cache和session就自动存至redis中;经过以上3步的配置后,springboot非常简单和方便的就存至redis了, 但现在有一个问题,由于cache和session的内容均存入了数据库1中,如果想让cache和session分别存至不同的数据库?该如何处理呢?
4.我是通过扩展session的自动配置来完成这个功能需求的,首先在application.properties中增加一个参数:
spring.session.redis.database=5
5.创建一个扩展类MyRedisHttpSessionConfiguration继承RedisHttpSessionConfiguration
package com.lxht.emos.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.session.data.redis.RedisFlushMode;
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
import org.springframework.session.data.redis.config.ConfigureNotifyKeyspaceEventsAction;
import org.springframework.session.data.redis.config.ConfigureRedisAction;
import org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration;
import org.springframework.util.StringUtils;
/**
* Created by fanyuli on 2018/5/28.
*/
@Configuration
public class MyRedisHttpSessionConfiguration extends RedisHttpSessionConfiguration{
private RedisSerializer<Object> defaultRedisSerializer;
private String redisNamespace = "spring:session";
private ApplicationEventPublisher applicationEventPublisher;
private Integer maxInactiveIntervalInSeconds = Integer.valueOf(1800);
private RedisFlushMode redisFlushMode;
private String cleanupCron;
private ConfigureRedisAction configureRedisAction;
private ClassLoader classLoader;
@Autowired
RedisProperties redisProperties;
@Value("${spring.session.redis.database}")
private int sessionRedisDatabase;
public MyRedisHttpSessionConfiguration() {
this.redisFlushMode = RedisFlushMode.ON_SAVE;
this.cleanupCron = "0 * * * * *";
this.configureRedisAction = new ConfigureNotifyKeyspaceEventsAction();
}
@Bean
public RedisOperationsSessionRepository sessionRepository() {
RedisTemplate<Object, Object> redisTemplate = this.createRedisTemplate();
RedisOperationsSessionRepository sessionRepository = new RedisOperationsSessionRepository(redisTemplate);
sessionRepository.setApplicationEventPublisher(this.applicationEventPublisher);
if(this.defaultRedisSerializer != null) {
sessionRepository.setDefaultSerializer(this.defaultRedisSerializer);
}
sessionRepository.setDefaultMaxInactiveInterval(this.maxInactiveIntervalInSeconds.intValue());
if(StringUtils.hasText(this.redisNamespace)) {
sessionRepository.setRedisKeyNamespace(this.redisNamespace);
}
sessionRepository.setRedisFlushMode(this.redisFlushMode);
return sessionRepository;
}
public RedisTemplate<Object, Object> createRedisTemplate() {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
if(this.defaultRedisSerializer != null) {
redisTemplate.setDefaultSerializer(this.defaultRedisSerializer);
}
RedisConnectionFactory lettuceConnectionFactory = redisConnectionFactory();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
redisTemplate.setBeanClassLoader(this.classLoader);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
public RedisConnectionFactory redisConnectionFactory() {
String host = redisProperties.getHost();
int port = redisProperties.getPort();
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(host,port);
lettuceConnectionFactory.setDatabase(sessionRedisDatabase);
lettuceConnectionFactory.afterPropertiesSet();
return lettuceConnectionFactory;
}
@Autowired
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
}
6.通过对RedisHttpSessionConfiguration进行扩展后,对应的session数据就存至database=5数据库了;
本文介绍了如何在SpringBoot2.0中通过pom.xml引入相关依赖并配置application.properties文件,实现自动将cache和session数据存入Redis数据库。通过扩展session的自动配置,实现了cache和session分别存至不同的数据库的功能。
2916

被折叠的 条评论
为什么被折叠?



