Spring Session MongoDB学习笔记(CentOS7)
MongoDB下载安装
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
1、先注册或登录MongoDB官网
2、选择自己要下载的版本.点击tgz
3、或者直接终端使用wget下载
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz
4、安装步骤:
解压
tar -zxf mongodb-linux-x86_64-4.0.9.tgz
移动
cp mongodb-linux-x86_64-4.0.9 /usr/local/mongodb -rf
切换目录
cd /usr/local/mongodb/
创建数据库目录
mkdir -p data/db
创建日志文件
mkdir log cd log/ touch mongodb.log
创建配置文件
cd /usr/local/mongodb/ mkdir etc/ cd etc/ vi mongodb.conf
- 配置内容
dbpath=/usr/local/mongodb/data/db logpath=/usr/local/mongodb/log/mongodb.log port=27017 fork=true bind_ip=0.0.0.0
fork:后端启动
bind_ip:允许哪些主机连接,这里允许所有
启动 MongoDB
cd /usr/local/mongodb/bin/
./mongod --config /usr/local/mongodb/etc/mongodb.conf
创建soldierdb数据库
./mongo
use soldierdb
关闭mongodb
cd /usr/local/mongodb/bin/
./mongod --shutdown --config /usr/local/mongodb/etc/mongodb.conf
Spring Session MongoDB 的使用
1、创建项目
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.soldier</groupId> <artifactId>spring-session</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-session</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <modules> <module>session_mongo1</module> <module>session_mongo2</module> </modules> <!--是springboot项目--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version> </parent> <!--spring session坐标:与spring-session一样,spring-session-mongodb都需要这个坐标 只是它们操作的数据库不一样而已,一个是redis一个是mongodb--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-bom</artifactId> <version>Bean-SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!--web starter--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--data mongodb starter(这是springboot整合的mongodb)--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <!--spring session data mongodb(这是spring-session基于mongodb的坐标)--> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-mongodb</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2、添加配置文件
1)session_monog1
server: #服务端口
port: 8001
#mongodb配置
spring:
data:
mongodb:
host: 116.62.48.112
port: 27017
database: soldierdb
#配置存储session数据的数据库为mongodb
session:
store-type: mongodb
2)session_monog2
server: #服务端口
port: 8002
#mongodb配置
spring:
data:
mongodb:
host: 116.62.48.112
port: 27017
database: soldierdb
#配置存储session数据的数据库为mongodb
session:
store-type: mongodb
3、修改两个启动类
// 使用MongoDB来缓存我们session中的数据 @EnableMongoHttpSession @SpringBootApplication
4、编写测试代码测试效果
1)session_monog1创建 Controller
@RestController @RequestMapping("service1") public class WebController { @RequestMapping("/setMsg") public String setMsg(HttpSession session,String msg){ session.setAttribute("msg",msg); return "ok"; } }
2)session_monog2创建 Controller
@RestController @RequestMapping("/service2") public class WebController { @RequestMapping("/getMsg") public String getMsg(HttpSession session){ String msg = (String) session.getAttribute("msg"); return msg; } }
3)测试
5、共享自定义对象
1)创建 Users 实体类
public class Users implements Serializable { private String userName; private String passWord; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } }
2)修改 session_mongo1 的 controller
@RestController @RequestMapping("/service1") public class WebController { /** * 往HttpSession插入数据 * http://localhost:8001/service1/setMsg?msg=hello * @param session * @param msg */ @RequestMapping("/setMsg") public String setMsg(HttpSession session, String msg) { session.setAttribute("msg", msg); return "ok"; } /** * 获取用户信息,保存到HttpSession中 * SpringSession再讲信息保存到mongodb中 * http://localhost:8001/service1/addUser?userName=admin&passWord=admin * @param session * @param users */ @RequestMapping("/addUser") public String addUser(HttpSession session, Users users) { session.setAttribute("users", users); return "ok"; } }
3)修改 session_mongo2 的 controller
@RestController @RequestMapping("/service2") public class WebController { /** * 从HttpSession读取数据 * 正常情况下,service2是拿不到service中session的msg的,但是我们这里使用spring-session开启了session共享,所以是拿得到的 * 并且我们的redis中会存在SpringSession的缓存数据 * http://localhost:8002/service2/getMsg * @param session */ @RequestMapping("/getMsg") public String getMsg(HttpSession session) { String msg = (String)session.getAttribute("msg"); return msg; } /** * 从HttpSession中获取用户实体信息 * 实际上是SpringSession读取mongodb中的数据保存到赋值到HttpSession * http://localhost:8002/service2/getUser * @param session */ @RequestMapping("/getUser") public Users getUser(HttpSession session) { Users users = (Users)session.getAttribute("users"); return users; } }
4)测试
Spring Session MongoDB 的存储结构
{ "_id" : "90beecbf-1bb0-4af8-a8d9-697dc8ba4d32", "created" : ISODate("2020-05-01T01:40:54.126Z"), "accessed" : ISODate("2020-05-01T01:45:57.794Z"), "interval" : "PT30M", "principal" : null, "expireAt" : ISODate("2020-05-01T02:15:57.794Z"), "attr" : BinData(0,"rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAACdAADbXNndAAFaGVsbG90AAV1c2Vyc3NyABhjb20uc29sZGllci5kb21haW4uVXNlcnO50yDDQM+y2wIAAkwACHBhc3NXb3JkdAASTGphdmEvbGFuZy9TdHJpbmc7TAAIdXNlck5hbWVxAH4ABnhwdAAFYWRtaW50AAVhZG1pbng=") }
* 设置 Session 的失效时间
// 使用MongoDB来缓存我们session中的数据 @EnableMongoHttpSession(maxInactiveIntervalInSeconds=10) @SpringBootApplication public class SessionMongo1Application { public static void main(String[] args) { SpringApplication.run(SessionMongo1Application.class, args); } }
@EnableRedisHttpSession 注解
maxInactiveIntervalInSeconds:设置 Session 失效时间
collectionName:设置 MongoDB 的 Collections 的名称
更换 Spring Session 的序列化器
Spring Session MongoDB 中默认的序列化器为 jdk 序列化器,该序列化器效率低下,内存占用大。
1、在配置类中创建自定义序列化器
@Configuration public class SessionMongoConfig { /** * 更换默认的序列化器,原来的是jdk的 * 第二步还要在实体中添加@JsonAutoDetect注解,否则会报错 */ @Bean JacksonMongoSessionConverter mongoSessionConverter() { return new JacksonMongoSessionConverter(); } }
2、修改实体类,添加@JsonAutoDetect 注解
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY) public class Users implements Serializable { private String userName; private String passWord; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } }
测试
{ "_id" : "15a0af5c-a4bf-4f40-ab12-c5a3818d0366", "@class" : "org.springframework.session.data.mongo.MongoSession", "createdMillis" : NumberLong("1588301451572"), "accessedMillis" : NumberLong("1588301455600"), "intervalSeconds" : 1800, "expireAt" : [ "java.util.Date", NumberLong("1588303255600") ], "attrs" : { "@class" : "java.util.HashMap", "users" : { "@class" : "com.soldier.domain.Users", "userName" : "admin", "passWord" : "admin" } }, "principal" : null }
注意事项:
在分布式session中,如果一个服务的@EnableMongoHttpSession注解参数或者序列化器发生改变时,其它服务也必须使用一样的配置,否则会出现数据找不到、失效时间变长、启动报错的现象!!!