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>
SpringSessionMongo的pom.xml

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注解参数或者序列化器发生改变时,其它服务也必须使用一样的配置,否则会出现数据找不到、失效时间变长、启动报错的现象!!!

原码地址:

链接

posted @ 2020-05-01 08:03  soldier_cnblogs  阅读(359)  评论(0编辑  收藏  举报