服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - MongoDB - SpringBoot整合redis及mongodb的详细过程

SpringBoot整合redis及mongodb的详细过程

2022-11-28 15:4114号程序员 MongoDB

这篇文章主要介绍了SpringBoot整合redis及mongodb,本节我们来把关注点转向NoSQL,文章结合示例代码给大家讲解的非常详细,需要的朋友可以参考下

NoSQL数据库之中最具代表性的,当属键值对数据库类别下的Redis,以及文档型数据库的Mongodb,本节我们重点关注这两个产品在SpringBoot下的整合及使用

最近很忙,好不容易才抽出了时间,咱们接上回

上次我们主要讲了如何通过SpringBoot快速集成mybatis/mybatis-plus,以实现业务交互中的数据持久化,而这一切都是基于关系型数据库(SQL)实现的

本节我们来把关注点转向NoSQL

NoSQL的概念:

NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。(——来自百度百科)

得益于其直接基于内存的存储方式,NoSQL的访问速度可以用“飞快”两个字来形容

在生产环境中,NoSQL常常配合传统关系型数据库来使用,比如构建一层数据缓存来极大的提升数据的读取速度

NoSQL在日常业务的驱动之下,逐渐发展出几个主要的类别:键值对数据库、文档型数据库、列存储数据库以及图形化数据库

这4类NoSQL数据库之中最具代表性的,当属键值对数据库类别下的Redis,以及文档型数据库的Mongodb,本节我们重点关注这两个产品在SpringBoot下的整合及使用

照惯例先上项目结构:

SpringBoot整合redis及mongodb的详细过程

一、先看Redis的使用:

1. 在pom.xml中添加Redis相关依赖项

?
1
2
3
4
5
6
7
8
9
<!-- 引入redis依赖(基于lettuce) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

2. 在application.properties中添加Redis的相关配置

?
1
2
3
4
5
6
7
8
9
10
# redis相关设置
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
# redis默认基于lettuce内核
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.min-idle=0

这里关于lettuce内核有必要给大家解释一下:

在SpringBoot2.x版本之前,其集成的默认Redis库是Jedis,而在2.x版本之后才改为默认基于Lettuce

Jedis默认和Redis直连,为非线程安全模型,并发环境下需要池化使用

而Lettuce则是线程安全的,并发环境下可以通过一个实例搞定

当然,你也可以在SpringBoot2.x环境下依然使用Jedis,只需要把spring.redis.lettuce 相关配置替换为spring.redis.jedis 即可

更多内容大家感兴趣可以从网上查阅相关资料,这里推荐一篇:https://blog.csdn.net/kenkao/article/details/127085687

3. 新建 service/RedisService 接口及其实现类 service/impl/RedisServiceImpl

?
1
2
3
4
5
6
package com.example.hellospringboot.service;
 
public interface RedisService {
    void set(String key, String val);
    String get(String key);
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.example.hellospringboot.service.impl;
 
import com.example.hellospringboot.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
 
@Service
public class RedisServiceImpl implements RedisService {
 
    @Autowired
    StringRedisTemplate redis;
 
    public void set(String key, String val){
        ValueOperations<String,String> ops = redis.opsForValue();
        ops.set(key, val);
    }
 
    public String get(String key){
        ValueOperations<String,String> ops = redis.opsForValue();
        return ops.get(key);
    }
}

我们在Service中自动装载一个StringRedisTemplate实例,而后通过其创建Operation对象,进行可以进行各种Redis读写操作

4. 新建 controller/RedisController

?
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
package com.example.hellospringboot.controller;
 
import com.example.hellospringboot.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import javax.servlet.http.HttpSession;
 
@RestController
@RequestMapping("/redis")
public class RedisController {
 
    @Autowired
    RedisService service;
 
    @PostMapping("/set")
    public void set(String key, String val){
        service.set(key, val);
    }
 
    @GetMapping("/get")
    public String get(String key){
        return service.get(key);
    }
 
}

5. 通过Postman进行结果验证

SpringBoot整合redis及mongodb的详细过程

通过RDM查看写入redis的数据:

SpringBoot整合redis及mongodb的详细过程

之后是读操作:

SpringBoot整合redis及mongodb的详细过程

至此我们便完成了SpringBoot中集成Redis的操作

二、MongoDB的使用

1. 首先还是先添加MongoDB相关依赖项

?
1
2
3
4
5
<!-- 引入mongodb依赖 -->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-data-mongodb</artifactId>
       </dependency>

2. 然后是添加MongoDB相关配置

?
1
2
3
4
5
6
7
# mongodb相关设置
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.database=local
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
#spring.data.mongodb.username=admin
#spring.data.mongodb.password=admin

各注释项内容依次是:身份验证库、目标数据库、主机地址、端口以及用户名和口令

由于我没有设置用户名和口令,所以直接注释掉这两项

3. 新建 repository/PersonRepository

?
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.example.hellospringboot.repository;
 
import com.example.hellospringboot.model.Person;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
 
@Repository
public interface PersonRepository extends MongoRepository<Person, Integer> {
    Person findByNameIs(String name);
    Person findByIdIs(int id);
    Person findByIdAndName(int id, String name);
    Person findByIdOrName(int id, String name);
}

这里出现了非常神奇的一幕:

我们仅需要提供一个接口,而不用提供具体实现!

仅凭方法的命名规范,spring.data.mongodb就能自行分析开发者的意图,进行补全内部的业务逻辑!

而同样具备这种智能化能力的还有spring.jpa,后者也是一种非常便捷高效数据库驱动,与mybatis属于同类产品

顺便也给大家提供一份方法命名规范清单,请各位在方法命名时务必遵循以下规则:

关键字 方法命名 sql where字句
And findByNameAndPwd where name= ? and pwd =?
Or findByNameOrSex where name= ? or sex=?
Is,Equals findById,findByIdEquals where id= ?
Between findByIdBetween where id between ? and ?
LessThan findByIdLessThan where id < ?
LessThanEqual findByIdLessThanEqual where id <= ?
GreaterThan findByIdGreaterThan where id > ?
GreaterThanEqual findByIdGreaterThanEqual where id > = ?
After findByIdAfter where id > ?
Before findByIdBefore where id < ?
IsNull findByNameIsNull where name is null
isNotNull,NotNull findByNameNotNull where name is not null
Like findByNameLike where name like ?
NotLike findByNameNotLike where name not like ?

StartingWith

findByNameStartingWith where name like '?%'
EndingWith findByNameEndingWith where name like '%?'
Containing findByNameContaining where name like '%?%'
OrderBy findByIdOrderByXDesc where id=? order by x desc
Not findByNameNot where name <> ?
In findByIdIn(Collection<?> c) where id in (?)
NotIn findByIdNotIn(Collection<?> c) where id not in (?)
True

findByAaaTue

where aaa = true
False findByAaaFalse where aaa = false
IgnoreCase findByNameIgnoreCase where UPPER(name)=UPPER(?)

4. Service接口定义及实现

?
1
2
3
4
5
6
7
8
9
10
11
package com.example.hellospringboot.service;
 
import com.example.hellospringboot.model.Person;
 
public interface MongoService {
    public void insert(Person person);
    public Person findByName(String name);
    public Person findById(int id);
    public Person findByIdAndName(int id, String name);
    public Person findByIdOrName(int id, String name);
}
?
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
34
package com.example.hellospringboot.service.impl;
 
import com.example.hellospringboot.model.Person;
import com.example.hellospringboot.repository.PersonRepository;
import com.example.hellospringboot.service.MongoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
@Service
public class MongoServiceImpl implements MongoService {
 
    @Autowired
    PersonRepository repository;
 
    public void insert(Person person){
        repository.insert(person);
    }
 
    public Person findByName(String name){
        return repository.findByNameIs(name);
    }
 
    public Person findById(int id){
        return repository.findByIdIs(id);
    }
 
    public Person findByIdAndName(int id, String name){
        return repository.findByIdAndName(id, name);
    }
 
    public Person findByIdOrName(int id, String name){
        return repository.findByIdOrName(id, name);
    }
}

5. Controller实现

?
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
34
35
36
37
38
39
40
41
42
package com.example.hellospringboot.controller;
 
import com.example.hellospringboot.model.Person;
import com.example.hellospringboot.service.MongoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
@RequestMapping("/mongo")
public class MongoController {
 
    @Autowired
    MongoService service;
 
    @PostMapping("/insert")
    public void insert(Person person){
        service.insert(person);
    }
 
    @GetMapping("/findByName")
    public Person findByName(String name){
        return service.findByName(name);
    }
 
    @GetMapping("/findById")
    public Person findById(int id){
        return service.findById(id);
    }
 
    @GetMapping("/findByIdAndName")
    public Person findByIdAndName(int id, String name){
        return service.findByIdAndName(id, name);
    }
 
    @GetMapping("/findByIdOrName")
    public Person findByIdOrName(int id, String name) {
        return service.findByIdOrName(id, name);
    }
}

Service及Controller的实现不再做过多赘述,还是老一套

6. Postman验证结果

向mongodb中写入一条数据

SpringBoot整合redis及mongodb的详细过程

SpringBoot整合redis及mongodb的详细过程

之后是几种读取操作:

SpringBoot整合redis及mongodb的详细过程

SpringBoot整合redis及mongodb的详细过程

SpringBoot整合redis及mongodb的详细过程

 

不论是与或操作,我们都可以得到正确的结果

到这里,mongodb的集成就完成了

三、基于Redis实现Session配置共享

这部分纯属附送内容 ^ ^

前边我们已经完成了对Redis的集成操作,而基于Redis我们可以非常便捷的实现服务端Session配置的跨节点共享

服务端Session默认存储在本地,而当我们需要多台服务器共享一套Session配置时,本地化Session便不再满足我们的要求

而基于SpringSession,我们可以完全透明化的替换掉默认的Session容器,直接改为基于Redis存储

1. 添加相关依赖

?
1
2
3
4
5
<!-- 引入spring session无缝替换原有的session系统 -->
       <dependency>
           <groupId>org.springframework.session</groupId>
           <artifactId>spring-session-data-redis</artifactId>
       </dependency>

2. 新增两个RedisController方法

?
1
2
3
4
5
6
7
8
9
@PostMapping("/setSession")
    public void setSession(String key, String val, HttpSession session){
        session.setAttribute(key, val);
    }
 
    @GetMapping("/getSession")
    public Object getSession(String key, HttpSession session){
        return session.getAttribute(key);
    }

就完事儿了?对!就完事儿了 ^ ^,超级简单是吧?

到此,我们就完成了SpringBoot对于Redis以及MongoDB的集成和使用

非常感慨于SpringBoot框架设计的智能化及人性化,就像身边有一哥们说的:这年头,框架都能直接听懂人话了!哈哈

到此这篇关于SpringBoot整合redis及mongodb的文章就介绍到这了,更多相关SpringBoot整合redis内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/itfantasy/p/16817371.html

延伸 · 阅读

精彩推荐
  • MongoDBMongoDB Windows安装服务方法与注意事项

    MongoDB Windows安装服务方法与注意事项

    这篇文章主要介绍了MongoDB Windows安装服务方法与注意事项的相关资料,MongoDB作为一个基于分布式文件存储的数据库,近两年大受追捧。数据灵活的存取方式...

    JackCousins5372020-05-09
  • MongoDBMongoDB的创建、更新和删除

    MongoDB的创建、更新和删除

    下面开始学习MongoDB最重要也是最基础的部分:C(创建)R(查询)U(更新)D(删除);由于R(查询)操作相对来说内容比较多,也比较繁琐,同时使用频...

    MongoDB教程网4932020-05-12
  • MongoDBMongoDB索引类型汇总分享

    MongoDB索引类型汇总分享

    这篇文章主要介绍了MongoDB索引类型汇总,单字段索引、复合索引、多键索引、文本索引、2dsphere索引等多种索引类型,需要的朋友可以参考一下...

    那海蓝蓝4672022-10-08
  • MongoDBSpark整合Mongodb的方法

    Spark整合Mongodb的方法

    Spark 是一个通用,快速,适用于大规模数据的处理引擎。接下来通过本文给大家分享Spark整合Mongodb的方法,感兴趣的朋友一起看看吧 ...

    mrr5572020-05-16
  • MongoDBMongoDB数据库简介与安装方法

    MongoDB数据库简介与安装方法

    这篇文章介绍了MongoDB数据库简介与安装方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    .NET开发菜鸟5592022-03-05
  • MongoDB关于mongoose连接mongodb重复访问报错的解决办法

    关于mongoose连接mongodb重复访问报错的解决办法

    这篇文章主要介绍了关于mongoose连接mongodb重复访问报错的解决办法的相关资料,需要的朋友可以参考下 ...

    MongoDB教程网3392020-06-04
  • MongoDBMongoDB Remove函数的3个常见用法

    MongoDB Remove函数的3个常见用法

    这篇文章主要介绍了MongoDB Remove函数的3个常见用法,需要的朋友可以参考下 ...

    MongoDB教程网6352020-04-24
  • MongoDB分享MongoDB修改oplog大小的4种方法

    分享MongoDB修改oplog大小的4种方法

    这篇文章主要介绍了分享MongoDB修改oplog大小的4种方法,文章基于MongoDB修改oplog大小展开其方法的介绍,需要的小伙伴可以参考一下...

    那海蓝蓝7672022-04-11