spring-session-data-redis 解决集群环境下session共享

spring-session-data-redis 解决集群环境下session共享

版权声明:本文为CSDN博主「Mr丶Liubing」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34929019/article/details/86368912
spring-session原理:https://www.cnblogs.com/lxyit/p/9672097.html
为什么会产生Session共享问题
  集群情况下,session保存在各自的服务器的tomcat中,当分发地址至不同服务时,导致sesson取不到,就会产生session共享问题。

解决方案

负载均衡中,IP绑定策略。如nginx:ip_hash
tomcat的session共享
优点:不需要额外开发,只需搭建tomcat集群即可
缺点:tomcat 是全局session复制,集群内每个tomcat的session完全同步(也就是任何时候都完全一样的) 在大规模应用的时候,用户过多,集群内tomcat数量过多,session的全局复制会导致集群性能下降, 因此,tomcat的数量不能太多,5个以下为好。
cookie同步session:第一次请求将session存在服务器,并且存入cookie,再次请求,如果在服务器没取到session,则从cookie中取。
优点:减轻服务器端的压力
缺点:受到cookie的大小限制,可能占用一定带宽,因为每次请求会在头部附带一定大小的cookie信息,另外这种方式在用户禁止使用cookie的情况下无效,并且不安全
数据库同步session,访问压力大
redis集中管理session
优点:redis为内存数据库,读写效率高,并可在集群环境下做高可用
spring-session + redis解决session共享问题

maven依赖引入

org.springframework.boot
spring-boot-starter-web

org.springframework.boot spring-boot-starter-data-redis org.springframework.session spring-session-data-redis 1 2 3 4 5 6 7 8 9 10 11 12 13 14 创建SessionConfig类 import org.springframework.context.annotation.Configuration; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
//设置session的默认在redis中的存活时间
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60 * 60 * 8)
public class SessionConfig {
}
1
2
3
4
5
6
7
8
创建SessionInitializer类,初始化session配置
import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;
import com.lb.config.SessionConfig;
//初始化Session配置
public class SessionInitializer extends AbstractHttpSessionApplicationInitializer {
public SessionInitializer() {
super(SessionConfig.class);
}
}
1
2
3
4
5
6
7
8
application.yml
server:
port: 8081
spring:
redis:
database: ‘0’
host: 127.0.0.1
password: 123456
pool:
max-active: 8
max-idle: 5
max-wait: 5000
min-idle: 1
port: 6379
timeout: 0
session:
store-type: redis #设置session保存为默认redis的方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
controller实现
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class SessionController {
@Value("${server.port}")
private String port;

@RequestMapping("/setsession")
public String setSeesion(HttpServletRequest request, String key, String value) {
	HttpSession session = request.getSession();
	session.setAttribute(key, value);
	return "server port :" + port + "---- value :" + value;
}

@RequestMapping("/getsession")
public String getSeesion(HttpServletRequest request, String key) {
	HttpSession session = request.getSession();
	String value = (String) session.getAttribute(key);
	return "server port :" + port + "---- value :" + value;
}

public static void main(String[] args) {
	SpringApplication.run(SessionController.class, args);
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
测试

采用nginx做分发

#负载均衡分发
upstream sessionserver {
	server 127.0.0.1:8080;
	server 127.0.0.1:8081;
}

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass   http://sessionserver;
        index  index.html index.htm;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
浏览器输入:http://127.0.0.1/setsession?key=name&value=zhangsan 分发至8080的tomcat中创建session

浏览器输入:http://127.0.0.1/getsession?key=name 分发至8081的tomcat取到了session

————————————————
版权声明:本文为CSDN博主「Mr丶Liubing」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34929019/article/details/86368912

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值