Windows下安装Mongodb SpringBoot集成MongoDB和Redis多数据源
全文内容:
Mongodb安装
说明:Mongodb和redis是开发中常用的中间件,Redis的安装使用比较简单就不写了,只说本地也就是Windows安装Mongodb。
SpringBoot集成MongoDB和Redis
文中还有一个彩蛋Hutool
1.下载最新稳定版
https://www.mongodb.com/what-is-mongodb
例如我下载的版本是:mongodb-win32-x86_64-enterprise-windows-64-4.2.3-signed.msi
2.安装
选择complete,完整安装(安装全部组件)。complete,完整的、完全的。
默认选项即可:
这里取消勾选:
由于我已经安装好,不能再截图,如果还有不清楚的同学可以看这里:
https://www.cnblogs.com/chy18883701161/p/11100560.html
3.确认Windows服务启动
测试:http://localhost:27017/
4.控制台
安装目录的bin目录,例如C:\Program Files\MongoDB\Server\4.2\bin 。
使用mongo启动客户端
可以查看数据库和添加管理员账户
>show dbs
>use admin
>db.createUser({user:"admin",pwd:"password",roles:["root"]})
>db.auth("admin", "password")
创建一个数据库paopaoedu,
增加一个数据库管理员,用户名密码 paopaoedu//paopaoedu
插入一条数据,查询一条数据
>use paopaoedu
>db.createUser({user: "paopaoedu", pwd: "paopaoedu", roles: [{ role: "dbOwner", db: "paopaoedu" }]})
>db.auth("paopaoedu", "paopaoedu")
>db.paopaoedu.insert({"host":" https://linuxstyle.blog.csdn.net/"})
>db.paopaoedu.find()
https://www.cnblogs.com/mengyu/p/9071371.html
5.使用图形化客户端
实际开发中一般不会用命令行,这个效率太低了,推荐的客户端是robo3t,注意一定要下1.3.1不要用低版本,不然会报错不能打开数据库列表
robo3t-1.3.1-windows-x86_64-7419c406.exe
错误一:Error: Failed to execute "listdatabases" command
这是因为没有创建超级管理员账户或者数据库管理员账户
错误二:Network error while attempting to run command 'saslStart' on host 'xxx:27017'
这是因为robo3t版本低于1.3.1
6.SpringBoot集成MongoDB和Redis
MongoDB安装好以后是要在实际项目中使用的,现在都是SpringBoot。
SpringBoot集成MongoDB真的已经很简单了。考虑到redis的使用也很简单就一并集成了。
maven:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.2.4.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.1.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency></dependencies>
说明:Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率。hutool-all这个Util的jar非常方便,比如一些时间等常见的都被集成了。https://hutool.cn/docs/#/
Hutool包含组件
一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:
模块 | 介绍 |
---|---|
hutool-aop | JDK动态代理封装,提供非IOC下的切面支持 |
hutool-bloomFilter | 布隆过滤,提供一些Hash算法的布隆过滤 |
hutool-cache | 简单缓存实现 |
hutool-core | 核心,包括Bean操作、日期、各种Util等 |
hutool-cron | 定时任务模块,提供类Crontab表达式的定时任务 |
hutool-crypto | 加密解密模块,提供对称、非对称和摘要算法封装 |
hutool-db | JDBC封装后的数据操作,基于ActiveRecord思想 |
hutool-dfa | 基于DFA模型的多关键字查找 |
hutool-extra | 扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等) |
hutool-http | 基于HttpUrlConnection的Http客户端封装 |
hutool-log | 自动识别日志实现的日志门面 |
hutool-script | 脚本执行封装,例如Javascript |
hutool-setting | 功能更强大的Setting配置文件和Properties封装 |
hutool-system | 系统参数调用封装(JVM信息等) |
hutool-json | JSON实现 |
hutool-captcha | 图片验证码实现 |
hutool-poi | 针对POI中Excel的封装 |
hutool-socket | 基于Java的NIO和AIO的Socket封装 |
可以根据需求对每个模块单独引入,也可以通过引入hutool-all
方式引入所有模块。
配置文件:
server.port=8080# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=你的redis主机IP
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
#连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=300## 无密码配置
## 如果存在此库就直接连接,如果不存在此库会自动创建
#spring.data.mongodb.uri=mongodb://localhost:27017/springboot_mongodb## 有密码配置
## name:用户名 / password:密码
spring.data.mongodb.uri=mongodb://paopaoedu:paopaoedu@localhost:27017/paopaoedu
model对象:
public class User implements Serializable {private static final long serialVersionUID = -1L;private String username;private String city;private Integer age;public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}
这里为了简单只是演示就写一起,不分模块了:
@RestController
public class TestController {@Autowiredprivate RedisTemplate<String,String> redisTemplate;@Autowiredprivate MongoTemplate mongoTemplate;@RequestMapping("/")public String sayHello() {String nowtime= DateUtil.now();redisTemplate.opsForValue().set("nowtime",nowtime);String rs=redisTemplate.opsForValue().get("nowtime");User u=new User();u.setUsername("霞落满天");u.setCity("银河系");u.setAge(12);mongoTemplate.insert(u);List<User> ulist=mongoTemplate.findAll(User.class);String json = JSON.toJSONString(ulist);return "HelloWorld SpringBoot "+rs+" "+json;}
}
Redis用这个客户端:redis-desktop-manager-0.8.8.384.exe
多数据源的配置
单数据源自动读配置文件,多数据源自然需要你指定数据源,然后使用注解的方式。其实不管是redis还是mongodb还是MYSQL套路都是一样的,就是定义不同数据源,然后定义多个配置工厂的bean,要用的时候注入即可。
Redis多数据源参考:
https://blog.csdn.net/liubenlong007/article/details/86477692
这个的工程化更好一点,一个数据源一个独立的class比较好
https://blog.csdn.net/huangpeigui/article/details/90518844
mongodb多数据源参考:
https://blog.csdn.net/qq_28851503/article/details/90340642
以redis为例,下面是我修改的代码,如果需要可以按需增加连接池配置。
先定义配置文件,假设我们有2个不同的Redis:
# Redis服务器地址
spring.redis.master.host=xxx.redis.rds.aliyuncs.com
# Redis服务器连接端口
spring.redis.master.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.master.password=xxx# Redis服务器地址
spring.redis.follow.host=xxx.redis.rds.aliyuncs.com
# Redis服务器连接端口
spring.redis.follow.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.follow.password=xxx
maven增加依赖库:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>
定义数据源配置文件:
@Configuration
public class RedisConfig {//master@Value("${spring.redis.master.host}")private String masterHost;@Value("${spring.redis.master.port}")private String masterPort;@Value("${spring.redis.master.password}")private String masterPassword;//salve@Value("${spring.redis.follow.host}")private String salveHost;@Value("${spring.redis.follow.port}")private String salvePort;@Value("${spring.redis.follow.password}")private String salvePassword;/*** 配置lettuce连接池** @return*/@Bean@ConfigurationProperties(prefix = "spring.redis.lettuce.pool")public GenericObjectPoolConfig redisPool() {return new GenericObjectPoolConfig<>();}/*** 配置第一个数据源的** @return*/@Bean//@ConfigurationProperties(prefix = "spring.redis")public RedisStandaloneConfiguration redisConfig1() {RedisStandaloneConfiguration rsc = new RedisStandaloneConfiguration();rsc.setHostName(masterHost);rsc.setPort(Integer.parseInt(masterPort));rsc.setPassword(masterPassword);return rsc;}/*** 配置第二个数据源** @return*/@Bean//@ConfigurationProperties(prefix = "spring.redis.follow")public RedisStandaloneConfiguration redisConfig2() {RedisStandaloneConfiguration rsc = new RedisStandaloneConfiguration();rsc.setHostName(salveHost);rsc.setPort(Integer.parseInt(salvePort));rsc.setPassword(salvePassword);return rsc;}/*** 配置第一个数据源的连接工厂* 这里注意:需要添加@Primary 指定bean的名称,目的是为了创建两个不同名称的LettuceConnectionFactory** @param config* @param redisConfig1* @return*/@Bean("factory1")@Primarypublic LettuceConnectionFactory factory(GenericObjectPoolConfig config, RedisStandaloneConfiguration redisConfig1) {LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(config).build();return new LettuceConnectionFactory(redisConfig1, clientConfiguration);}@Bean("factory2")public LettuceConnectionFactory factory2(GenericObjectPoolConfig config, RedisStandaloneConfiguration redisConfig2) {LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(config).build();return new LettuceConnectionFactory(redisConfig2, clientConfiguration);}/*** 配置第一个数据源的RedisTemplate* 注意:这里指定使用名称=factory 的 RedisConnectionFactory* 并且标识第一个数据源是默认数据源 @Primary** @param factory1* @return*/@Bean("redisTemplate1")@Primarypublic RedisTemplate<String, String> redisTemplate(@Qualifier("factory1") RedisConnectionFactory factory1) {return getStringStringRedisTemplate(factory1);}/*** 配置第一个数据源的RedisTemplate* 注意:这里指定使用名称=factory2 的 RedisConnectionFactory** @param factory2* @return*/@Bean("redisTemplate2")public RedisTemplate<String, String> redisTemplate2(@Qualifier("factory2") RedisConnectionFactory factory2) {return getStringStringRedisTemplate(factory2);}/*** 设置序列化方式 (这一步不是必须的)** @param factory2* @return*/private RedisTemplate<String, String> getStringStringRedisTemplate(RedisConnectionFactory factory2) {StringRedisTemplate template = new StringRedisTemplate(factory2);template.setKeySerializer(RedisSerializer.string());template.setValueSerializer(new FastJsonRedisSerializer<>(Object.class));template.setHashKeySerializer(RedisSerializer.string());template.setHashValueSerializer(new FastJsonRedisSerializer<>(Object.class));return template;}
使用非常简单:
@Autowired@Qualifier("redisTemplate1")private RedisTemplate redisTemplate1;@Autowired@Qualifier("redisTemplate2")private RedisTemplate redisTemplate2;
相关文章:

使用CSDN-markdown编辑器
欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰…

HTTP缓存相关头
本文说的是HTTP中控制客户端缓存的头有哪些。网上这方面的文章很多了,这里就说下个人的理解。 在请求一个静态文件的时候(图片,css,js)等,这些文件的特点是文件不经常变化,将这些不经常变化的文…

Thrift RPC 系列教程(4)——源码目录结构组织
Thrift 代码就是编程代码。是代码,就应该有良好的工程组织,并且,单独git仓库、版本管理,都是必不可少的。 前面我们简单总结了一些 Thrift 的一些基础知识点,但无非是一些细节层面的东西,所谓『细枝末节』也…

Spring Bean四种注入方式(Springboot环境)
阅读此文建议参考本人写的Spring常用注解:https://blog.csdn.net/21aspnet/article/details/104042826 给容器中注册组件的四种方法: 1.ComponentScan包扫描组件标注注解Component(ControllerServiceRepository) 使用场景:自己写的代码&…

chrome dev debug network 的timeline说明
在使用chrome的时候F12的开发者工具中有个network,其中对每个请求有个timeline的说明,当鼠标放上去会有下面的显示: 这里面的几个指标在说明在chrome使用文档有说明: 下面我用人类的语言理解下: Proxy 与代理服务器的连…
【MATLAB】函数句柄
在MATLAB平台中,对函数的调用方法分为直接调用法和间接调用法。 1、直接调用函数,被调用的函数通常称为子函数。一个文件中只能有一个主函数。 2、函数句柄——提供一种间接调用函数的方法。创建函数句柄需要用到操作符。 创建函数句柄的一般句法格式…
为什么企业选择年底裁员?如何选择一个正确的公司!
为什么很多企业选择年底裁员?首先分析一下裁员的原因:1、你能力不行,在公司吃闲饭2、减少公司成本3、公司换血,需要新的人才注入普通情况下,这些因素裁员很正常,只能怪自己不争气,成为末尾被淘汰…

springboot集成logback日志 通用logback.xml模板详解
先看Spring Boot中依赖的logback,log4j,slf4j相关Jar包 1.最简单的默认打印控制台日志 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.Reques…
【MATLAB】单元数组类型
1、概述 单元(Cell)数组是一种无所不包的广义数组。 组成单元数组的每个元素成为一个单元。 每一个单元可以包括任意数组,如数值数组,字符串数组,结构体数组或另外一个单元数组。 单元数组用花括号来创建“{ }”。…

UNITY3D拓展编辑器 - 目录
前文:最近在自学UNITY3D拓展器,对以上功能点做一些认知范围内的总结.目录:1. 属性编辑器http://weizeteng.blog.51cto.com/5604545/17744312. 工具编辑器3. 场景编辑器转载于:https://blog.51cto.com/weizeteng/1774390

程序员的你还沉浸在大公司就是螺丝钉?小公司锻炼人?错了!看完即懂
刚毕业那会经历过很多所谓创业公司,和很多朋友经历过画大饼,洗脑以及公司上市原始股这样的承诺。当你正在趟过这些谎言你就会发现,在这个世界上能信这些鬼话的也只有涉世未深的毕业生了。小公司里真的就是十几二十几个精英带你一路向前&#…

深入Jetty源码之Servlet框架及实现(AsyncContext、RequestDispatcher、HttpSession)
概述 Servlet是Server Applet的缩写,即在服务器端运行的小程序,而Servlet框架则是对HTTP服务器(Servlet Container)和用户小程序中间层的标准化和抽象。这一层抽象隔离了HTTP服务器的实现细节,而Servlet规范定义了各个类的行为,从…

SpringBoot conditional注解和自定义conditional注解使用
conditional注解是Springboot starter的基石,自动装配的时候会根据条件确定是否需要注入这个类。 含义:基于条件的注解。 作用:根据是否满足某个特定条件来决定是否创建某个特定的Bean。 意义:Springboot实现自动配置的关键基础…
TOPSIS算法及代码
TOPSIS的全称是“逼近于理想值的排序方法” 根据多项指标、对多个方案进行比较选择的分析方法,这种方法的中心思想在于首先确定各项指标的正理想值和负理想值,所谓正理想值是一设想的最好值(方案),它的的各个属性值都…

django框架的基础知识点《贰》
状态保持-----session作用:状态保持与cookie区别: cookie保存在浏览器中 session:保存在服务器中,即python代码运行的那台电脑 支持配置,可以指定保存的位置在django中保存方案: 关系型数据库 内存 关系型数…

Springboot源码分析之内嵌tomcat源码分析
Springboot源码是内嵌tomcat的,这个和完整的tomcat还是不同。 内嵌tomcat的源码在tomcat-embed-core等3个jar包里 展开tomcat-embed-core的catalina目录 再对照下载的apache-tomcat-9.0.31源码 打开bin目录,看到很多库文件比如catalina.jar 再展开看看类…

spring amqp rabbitmq fanout配置
基于spring amqp rabbitmq fanout配置如下: 发布端 <rabbit:connection-factory id"rabbitConnectionFactory" username"guest" password"guest" host"localhost" port"5672"/> <rabbit:template id&qu…

【MATLAB】数组运算
(这里这列举笔者不熟悉的,容易忘的数组运算) 1、数组的转置 >> a[1 2 3 4 5 6 7]a 1 2 3 4 5 6 7>> bab 1234567 2、对数组的赋值 >> a([1 4])[0 0]a 0 2 3 0 5 6 73、注…

RLCenter云平台配置中心
榕力RLCenter云平台配置中心以图形界面的方式实现对云桌面系统的统一管理,包括用户管理、服务器管理、虚拟机管理、策略管理。可配置U盘类设备的读写权限,避免企业敏感信息泄密。实行数据集中存储,支持用户数据进行备份和恢复。 (1)云桌面性能…

SSL/TLS原理详解
本文大部分整理自网络,相关文章请见文后参考。 关于证书授权中心CA以及数字证书等概念,请移步 OpenSSL 与 SSL 数字证书概念贴 ,如果你想快速自建CA然后签发数字证书,请移步 基于OpenSSL自建CA和颁发SSL证书 。 SSL/TLS作为一种互…

SpringBoot源码分析之@Scheduled
Springboot写上注解Scheduled就可以实现定时任务, 这里对其源码做一点分析 Service public class MyScheduled {Scheduled(cron"${time.cron}")void paoapaoScheduled() {System.out.println("Execute at " System.currentTimeMillis());} }…
【MATLAB】矩阵分析之向量和矩阵的范数运算
本片借鉴于 https://blog.csdn.net/u013534498/article/details/52674008 https://blog.csdn.net/left_la/article/details/9159949 向量范数当p1时,即为各个向量的元素绝对值之和 >> norm(x,1)ans 21>> xx 1 2 3 4 5 6>> no…

如何打一个FatJar(uber-jar)
如何打一个FatJar(uber-jar) FatJar也就叫做UberJar,是一种可执行的Jar包(Executable Jar)。FatJar和普通的jar不同在于它包含了依赖的jar包。 1. maven-jar-plugin 例子 <build><finalName>demo</finalName><plugins&g…

JDK源码分析 NIO实现
总列表:http://hg.openjdk.java.net/ 小版本:http://hg.openjdk.java.net/jdk8u jdk:http://hg.openjdk.java.net/jdk8u/jdk8u60/file/d8f4022fe0cd hotspot:http://hg.openjdk.java.net/jdk8u/jdk8u60/hotspot/file/37240c1019fd 调用本地native方法…
Linux进程ID号--Linux进程的管理与调度(三)
进程ID概述 进程ID类型 要想了解内核如何来组织和管理进程ID,先要知道进程ID的类型: 内核中进程ID的类型用pid_type来描述,它被定义在include/linux/pid.h中 enum pid_type {PIDTYPE_PID,PIDTYPE_PGID,PIDTYPE_SID,PIDTYPE_MAX };12345671234567PID 内核…

【MATLAB】矩阵运算之矩阵分解
矩阵分解:把一个矩阵分解成为矩阵连乘的形式。矩阵的分解函数cholCholesky分解cholinc稀疏矩阵的不完全Cholesky分解lu矩阵LU分解luinc稀疏矩阵的不完全LU分解qr正交三角分解svd奇异值分解gsvd一般奇异值分解schur舒尔分解 在MATLAB中线性方程组的求解主要基于四种基…

Java入门—输入输出流
File类的使用 文件是:文件可认为是相关记录或放在一起的数据的集合。 Java中,使用java.io.File类对文件进行操作 public class FileDemo {public static void main(String[] args) {String path "E:\\pdd";File f new File(path);//判断是文…

Web框架基准测试
Web Framework Benchmarks 这是许多执行基本任务(例如JSON序列化,数据库访问和服务器端模板组成)的Web应用程序框架的性能比较。每个框架都在实际的生产配置中运行。结果在云实例和物理硬件上捕获。测试实现主要是由社区贡献的,所…

vsftpd用户配置 No.2
在配置ftp虚拟用户的过程中,还有一种配置方式。yum -y install 安装vsftpdcp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak编辑vsftpd.conf开启下列选项:anonymous_enableNOlocal_enableYESwrite_enableYESlocal_umask022anon_mkdir_write_enab…

【MATLAB】稀疏矩阵(含有大量0元素的矩阵)
1、稀疏矩阵的储存方式 对于稀疏矩阵,MATLAB仅储存矩阵所有非零元素的值及其位置(行号和列号)。 2、稀疏矩阵的生成 1)利用sparse函数从满矩阵转换得到稀疏矩阵函数名称表示意义sparse(A)由非零元素和下标建立稀疏矩阵A。如果A已是…