C#session共享+redis_负载均衡关键技术:session共享和会话保持

38ce18fc-5eb2-4d71-a775-867c9c7de2bd

负载均衡的session是什么

session也叫会话,用于提供服务器端和客户端系统间的必要交互。这是因为http协议本身是无状态的,所以经常需要通过session来提供服务端和客户端保持状态的解决方案。session一般是应用服务器维持的一个服务端的存储空间,客户端在连接服务器时,会由服务器生成一个唯一的ID,该ID作为标识符来存取服务器端的session存储空间。

sessionID这数据是用Cookie保存到客户端的,用户提交页面时,会将这ID提交服务器端,服务器也通过URL重写的方式传递sessionID的值,因此他不是完全依赖cookie,如果客户的浏览器禁用cookie,也没什么影响,服务器可以自动通过重写URL方式保存session的值。

session共享

729de73e-c460-4c36-9ac2-d10da0570895


当我们把web程序做成分布式部署到多台服务器上,并且独立为几个二级域名,由于session存在实现原理上的局限性,使得web用户不得不经常在几个频道间来回输入用户名和密码,用户体验很差。原本程序可以直接从用户session变量中读取参数,因为无法跨服务器同步更新session变量,所以必须实时读取数据库,增加数据库负担,于是就有了跨服务器session共享的解决方案。

(1)基于cookie的session共享

原理是将全站用户的session信息加密,序列化后以cookie的方式存在根域名下,当浏览器访问该根域名下所有二级域名站点时,将与域名相对应的所有cookie内容的特性传递给它,从而实现 用户的cookie化session在多服务器间的共享访问。

优点:无需而外的服务器,缺点:受http协议头长度限制,只能存储小部分用户信息。

(2)基于数据库的session共享

一般首选mysql数据库,建议使用内存表Heap,提高session操作的读写效率。目前使用的地方不少,缺点在于session的并发读写能力取决数据库性能,同时需要自己实现session过期策略,可定时从数据库中更新和删除session记录,如果并发很高,容易出现锁。

(3)基于Redis的session共享

redis作为一种缓存数据库,提供了丰富数据类型,可以将大量数据的排序从单机内存放到redis集群中处理,并可以实现轻量级消息中间件,所以足以应付session数据存储。

会话保持

会话保持并不是session共享,在一般稍微复杂点的web应用系统中,一个客户与服务器经常会经过几次交互过程才能完成一次业务访问。由于这几次交互过程是有关系的,服务器需要在进行交互过程中,要完成一次业务操作往往需要了解上一次交互的处理结果,或者前几步的交互结果,这就要求所有相关交互过程由一台服务器完成,而不能负载分散到不同服务器。

会话保持就是指在负载设备有这么一种机制,可以识别客户与服务器之间交互过程的关联性,在做负载均衡的同时,保证一系列相关访问请求被分配到同一个服务器上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用SpringBoot框架结合MyBatis实现Session共享和单点登录可以借助SpringSessionRedis来实现。 首先,需要配置SpringSession使用Redis作为存储方式。可以在SpringBoot的配置文件中添加以下配置: ``` spring.session.store-type=redis spring.session.redis.namespace=spring:session spring.redis.host=127.0.0.1 spring.redis.port=6379 ``` 这样配置后,SpringSession会自动将session信息存储到Redis中。 接着,在登录验证成功后,将用户信息存储到Redis中,并将该用户的唯一标识存储到当前Session的属性中,以便后续验证是否登录。例如: ``` @RequestMapping("/login") public String login(@RequestParam("username") String username, @RequestParam("password") String password, HttpSession session) { // 验证用户名和密码 // ... // 验证通过后,将用户信息存储到Redis中,并设置Session属性 redisTemplate.opsForHash().put("user:" + username, "username", username); session.setAttribute("username", username); return "success"; } ``` 在后续的请求中,可以通过拦截器或过滤器来验证Session是否有效。例如: ``` @Component public class SessionInterceptor implements HandlerInterceptor { @Autowired private RedisTemplate<String, Object> redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); String username = (String) session.getAttribute("username"); if (StringUtils.isEmpty(username)) { response.sendRedirect("/login"); return false; } String storedUsername = (String) redisTemplate.opsForHash().get("user:" + username, "username"); if (!StringUtils.equals(storedUsername, username)) { response.sendRedirect("/login"); return false; } return true; } } ``` 以上代码片段展示了如何通过拦截器验证Session的有效性。首先从当前Session中获取用户名,如果为空则重定向到登录页面。然后从Redis中获取存储的用户名,如果与当前用户名不匹配,则重定向到登录页面。 这样就实现了SpringBoot、MyBatis、SpringSessionRedis共同完成Session共享和单点登录的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值