spring-session用redis实现session共享实践
什么是spring session?
Spring Session provides an API and implementations for managing a user’s session information.
简单一句话,spring session帮你管理用户的session信息。
为什么使用spring session?
通常情况下,Tomcat、Jetty等Servlet容器,会默认将Session保存在内存中。如果是单个服务器实例的应用,将Session保存在服务器内存中是一个非常好的方案。但是这种方案有一个缺点,就是不利于扩展。
目前越来越多的应用采用分布式部署,用于实现高可用性和负载均衡等。那么问题来了,如果将同一个应用部署在多个服务器上通过负载均衡对外提供访问,如何实现Session共享?
实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat、Jetty等服务器提供的Session共享功能,将Session的内容统一存储在一个数据库(如MySQL)或缓存(如Redis)中。
使用spring session有以下好处:
spring session是开源的用户session管理软件,免费,易控且容易扩展;
spring session可以使服务器无状态;
服务器宕机或者重启不会丢失用户session信息,对用户更友好。
不需要负载均衡器保持粘性
满足应用和数据隔离原则
为什么使用spring session data redis呢?
spring session提供了三种主要实现方式REDIS,JDBC,Hazelcast
上一篇文章已经介绍了jdbc的实现 那为什么很多人更喜欢使用Redis实现呢?
1.应用要求请求响应流畅,快捷,redis是内存服务器,响应很快
2. 使用redis做外部存储,降低了对数据库或者服务器本身的依赖,更稳定
3. redis的过期机制更友好
4. redis的分片和集群机制,扩展性更好
5. 简单应用且容易监控
6. 和spring boot集成更紧密。
spring-session-data-redis实战
前段时间,写了篇<spring-session-data-redis解决session共享的问题>文章,介绍了spring-session使用redis存储实现session共享的内部机制,
有读者提问为什么只有理论没有实践?索性就实践一下。
1.使用sts创建spring-boot项目,项目名称session-jdbc,使用redis,web(方便测试)的start,创建完项目如下:
2.增加spring-session-redis依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>
3.配置属性
spring.session.store-type=redis spring.redis.host=localhost spring.redis.password= spring.redis.port=6379 spring.session.redis.namespace=spring:session spring.security.user.name=admin spring.security.user.password=admin spring.session.redis.cleanup-cron=0 * * * * *
4.增加测试类
package com.example.demo; import javax.servlet.http.HttpSession; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/redis") public class TestController { @RequestMapping("/welcome") public String welcome(HttpSession httpSession) { httpSession.setAttribute("hello", "world"); return "hello world !"; } }
5.启动spring boot项目
6.访问http://localhost:8080/redis/welcome
访问前查看redis情况
输入用户名密码 admin/admin
访问后
总结:
spring-session-data-redis 使用redis做用户管理的存储,主要有以下优点:
1.简单易用,用户友好
2.响应快
3.扩展性强
4.稳定性高
5.可监控
参考文献:
【1】https://www.cnblogs.com/jiafuwei/p/6425604.html