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;
?
總結
以上是生活随笔為你收集整理的Windows下安装Mongodb SpringBoot集成MongoDB和Redis多数据源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线上java JVM问题排查
- 下一篇: Spring Bean四种注入方式(Sp