springboot集成redis实现session共享的过程、问题和心得

Redis的安装:https://blog.csdn.net/weixin_45412021/article/details/97134995

Springboot集成redis session

1、pom中引入redis相关依赖
<!-- 配置使用redis启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
<!-- spring session -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
2、application.properties文件中添加redis初始化配置
spring.redis.host=xxx
spring.redis.password=xxx
spring.redis.port=6379
spring.redis.timeout=0  //超时时间,0表示无限时等待。若当前连接空闲时间超过timeout则会被redis服务端回收掉
spring.redis.pool.max-idle=150  //最大空闲数
spring.redis.pool.max-active=300  //线程池内的最大连接数
3、创建Redis配置类
  • maxInactiveIntervalInSeconds表示redis session的过期时间,这个时间后会自动销毁(单位是秒)
  • 如果仅仅是将redis用作缓存session那么到这一步就可以结束了,这个Config的类只需添加@Configuration和@EnableRedisHttpSession注解就可以了,我们的项目有使用redis存数据的需求所以我有创建Jedis连接池
  • 注意:配置名称一定要用redis默认的,否则设置的连接数在redisSession上不会生效
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600 * 24)
public class RedisSessionConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Value("${spring.redis.timeout}")
    private int timeout;

    @Value("${spring.redis.pool.max-idle}")
    private int maxIdle;

    @Value("${spring.redis.pool.max-active}")
    private int maxTotal;

    @Value("${spring.redis.password}")
    private String pwd;

    @Bean
    public JedisPool redisPoolFactory() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(maxIdle);
        jedisPoolConfig.setMaxTotal(maxTotal);
        //取Jedis连接时进行校验,判断当前连接是否可用
        jedisPoolConfig.setTestOnBorrow(true);
        //返回Jedis连接时进行是否可用的校验
        jedisPoolConfig.setTestOnReturn(true);
        return new JedisPool(jedisPoolConfig, host, port, timeout, pwd);
    }

}
4、创建RedisService类包装
@Component
public class RedisService {

    private static final Logger logger = LoggerFactory.getLogger(RedisService.class);

    @Autowired
    private JedisPool jedisPool;
	
	//取值
    public String get(String key){
        if(StringUtils.isBlank(key)){
            logger.info("redis get, key can't be empty");
            return null;
        }
        Jedis jedis = jedisPool.getResource();
        try {
            return jedis.get(key);
        } catch (Exception e) {
            logger.error("redis get error, ", e);
            return null;
        }finally {
            close(jedis);
        }
    }

	//存值
    public Boolean set(String key, String value){
        if(StringUtils.isBlank(key) || StringUtils.isBlank(value)){
            logger.info("redis set, key and value can't be empty");
            return false;
        }
        Jedis jedis = jedisPool.getResource();
        try {
            String set = jedis.set(key, value);
            return "OK".equals(set);
        } catch (Exception e) {
            logger.error("redis set error, ", e);
            return false;
        }finally {
            close(jedis);
        }
    }
	
	//根据key删除
    public Boolean del(String key){
        if(StringUtils.isBlank(key)){
            logger.info("redis del, key can't be empty");
            return false;
        }
        Jedis jedis = jedisPool.getResource();
        try {
            Long del = jedis.del(key);
            return 0 < del;
        } catch (Exception e) {
            logger.error("redis get error, ", e);
            return false;
        }finally {
            close(jedis);
        }
    }
	
	//回收连接
    public void close(Jedis jedis){
        jedis.close();
    }

}
6、需要用到的地方就可以注入RedisService使用了,方法可以根据需求进行调整

Redis Session开发过程中遇到的问题记录下

1、之前以为使用了redis的连接池就不需要管回收机制了,结果就报错了,因为在timeout设置的时间内连接都被占用导致,所以RedisService内的Jedis连接使用后都要使用close方法将其回收
2、客户端有调用后端服务的接口,且需要账户认证,一直不能通过认证。因为redis session每次请求来时是根据cookie的值来取sessionId,由于客户端返回的cookie是自己设定的key值,redis要取的cookie key值必须为SESSION。客户端修改cookie后成功

感触

遇到很多问题都是因为不够细心,上边cookie的key值问题服务端之间访问是OK的但是并没有注意到服务端的cookie key值是SESSION,浪费了很多时间在这个问题上边。遇到问题还是要多思考,解决之后多积累
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值