63-分布式解决方案-分布式Session一致性问题

文章目录

        • 1. 分布式session一致性概述
        • 2. session的底层实现原理
        • 3. 分布式session一致性解决方案
        • 4. 方案5和方案6

1. 分布式session一致性概述

  1. 分布式Session一致性(服务器集群session共享问题)
  2. session的作用?(服务端与客户端保存整个通讯的会话信息)
  3. 应用场景 (账号密码登陆成功之后,获取到userId,存放到session,下次获取用户信息之后,直接从session回话中获取)
    session理解为本地jvm缓存,session存放服务器,返回sessionid给客户端

2. session的底层实现原理

63-分布式解决方案-分布式Session一致性问题_第1张图片

3. 分布式session一致性解决方案

方案1 可以直接使用cookie替代session(不靠谱)
方案2 使用nginx(反向代理)ip绑定 同一个ip只能指定同一个机器访问
方案3 使用数据库 效率低
方案4 tomcat内置支持session同步(不推荐) 同步可能产生延迟
方案5 使用缓存框架 缓存session的值 (spring-session-data-redis重写httpsession框架,将对应的值缓存到redis中)
方案6 可以使用token替代session,(token也是存在redis缓存中,redis支持分布式共享)

4. 方案5和方案6

  1. 使用spring-session框架,底层实现原理是重写httpsession
    创建SessionConfig
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

//这个类用配置redis服务器的连接
//maxInactiveIntervalInSeconds为SpringSession的过期时间(单位:秒)
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {

	// 冒号后的值为没有配置文件时,制动装载的默认值
	@Value("${redis.hostname:localhost}")
	String HostName;
	@Value("${redis.port:6379}")
	int Port;

	@Bean
	public JedisConnectionFactory connectionFactory() {
		JedisConnectionFactory connection = new JedisConnectionFactory();
		connection.setPort(Port);
		connection.setHostName(HostName);
		return connection;
	}
}

初始化Session

//初始化Session配置
public class SessionInitializer extends AbstractHttpSessionApplicationInitializer{
    public SessionInitializer() {
        super(SessionConfig.class);
    }
}
  1. 最靠谱的分布式Session解决方案 基于令牌(Token)方式实现Session解决方案,因为Session本身就是分布式共享连接
@Service
public class TokenService {
	@Autowired
	private RedisService redisService;

	// 新增 返回token
	public String put(Object object) {
		String token = getToken();
		redisService.setString(token, object);
		return token;
	}

	// 获取信息
	public String get(String token) {
		String reuslt = redisService.getString(token);
		return reuslt;
	}

	public String getToken() {
		return UUID.randomUUID().toString();
	}

}

你可能感兴趣的:(笔记,分布式解决方案)