MongoDB实战:应用场景以及Spring和mongodb的整合

news2024/11/25 2:04:11

前言

mongodb是非关系型数据库,他的存储数据可以超过上亿条(老版本的mongodb有丢数据的情况,新版本不会有,网上说的),mongodb适合存储 一些量大表关系较简单的数据,例如用户信息,用户注册信息,公司注册信息,留言,评论,操作日志,mongodb还能用分布式文件存储信息,我们主要用mongodb来存储我们项目里面的操作日志(银行的付款转账记录,角色权限的变动日志),我们主要是结合aop来使用的,首先我们来配置一个aop的切面类,再给aop的使用规则,哪个类里面的哪个方法使用当前切面类,利用后置通知类获取当前方法的操作日志,将操作日志存储到mongodb,然后进行分类管理查看。利用后置通知传到数据库。一键获取Spring和mongodb西相关资料和面试题。

从目前阿里云 MongoDB 云数据库上的用户看,MongoDB的应用已经涉及到各个领域,比如游戏、物流、电商、内容管理、社交、物联网、视频直播等,之所以采用mongodb是因为:

MongoDB是NoSQL的非关系型数据库,他的存储数据可以超过上亿条(老版本的mongodb有丢数据的情况,新版本不会有,网上说的),mongodb适合存储 一些量大表关系较简单的数据,易于扩展,可以进行分布式文件存储,适用于大数据量、高并发、弱事务的互联网应用,以下是几个实际的应用案例:

  • 游戏场景,使用MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新
  • 物流场景,使用MongoDB存储订单信息,订单状态在运送过程中会不断更新,以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
  • 社交场景,使用MongoDB存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
  • 物联网场景,使用MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
  • 视频直播,使MongoDB存储用户信息、礼物信息等

在我们实际项目中:

  1. 我们主要用mongodb来存储我们项目里面的操作日志(银行的付款转账记录,角色权限的变动日志),我们主要是结合aop来使用的,首先我们来配置一个aop的切面类,再给aop的使用规则,哪个类里面的哪个方法使用当前切面类,利用后置通知类获取当前方法的操作日志,将操作日志存储到mongodb,然后进行分类管理查看。利用后置通知传到数据库。
  2. 我们在项目中使用它来存储电商产品详情页的评论信息(评论id,商品id,标题,评分,内容,评论人信息,评论的发布时间,评论标签组)并且为了提高可用性和高并发用了3台服务器做了mongodb的副本集,其中一台作为主节点,另外两台作为副本节点,这样在任何一台mongodb服务器宕机时就会自动进行故障转移,不会影响应用程序对mongodb的操作,为了减轻主节点的读写压力过大的问题,我还对mongodb副本集做了读写分离,使写操作在主节点进行,读取操作在副本节点进行。为了控制
    留言,我们留言的界面设置在了订单状态,只有状态为5,也就是交易成功收货后才能评论,并在评论成功后将订单状态改为6

【补充:如果问到副本集是怎么搭建的,就说我们有专门的运维人员来负责搭建,我只负责用Java程序去进行操作】

MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。

在副本集的环境中,要是所有的Secondary都宕机了,只剩下Primary。最后Primary会变成Secondary,不能提供服务。

副本集的同步和主从同步一样,都是异步同步的过程,不同的是副本集有个自动故障转移的功能。其原理是:slave端从primary端获取日志,然后在自己身上完全顺序的执行日志所记录的各种操作(该日志是不记录查询操作的)

Spring和mongodb整合步骤:

1.添加依赖的jar包

要想整合Spring和Mongodb必须下载相应的jar,这里主要是用到两种jar一种是spring-data-document和spring-data-commons两种类型的jar

2.定义实体类

3.Spring配置

新建application.xml配置文件

这个必须要的引入mongodb标签xmlns:mongo=“ http://www.springframework.org/schema/data/mongo”

在配置文件中加入链接mongodb客服端

<mongo:mongo host="localhost" port="27017">  

</mongo:mongo> 

注入mogondb的bean对象

<bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemp">  

   <constructor-arg ref="mongo"/>  

   <constructor-arg name="databaseName" value="db"/>  

   <constructor-arg name="defaultCollectionName" value="person" />  

  </bean>  

  <bean id="personRepository" class="com.mongo.repository.PersonRepository"><property name="mongoTemplate" ref="mongoTemplate"></property>  

 </bean>  

4.然后编写操作mongodb增删查改的接口

 public interface AbstractRepository {  

   public void insert(Person person);  

   public Person findOne(String id);  

   public List<Person> findAll();  

   public List<Person> findByRegex(String regex);  

   public void removeOne(String id);  

   public void removeAll();  

   public void findAndModify(String id);  

 }  

再写对应接口的实现类:

 import java.util.List;  

 import java.util.regex.Pattern;    

 import org.springframework.data.document.mongodb.MongoTemplate;  

 import org.springframework.data.document.mongodb.query.Criteria;  

 import org.springframework.data.document.mongodb.query.Query;  

 import org.springframework.data.document.mongodb.query.Update;  

  

 import com.mongo.entity.Person;  

 import com.mongo.intf.AbstractRepository;  

  

 public class PersonRepository implements AbstractRepository{  

   private MongoTemplate mongoTemplate;  

   @Override  

   public List<Person> findAll() {return getMongoTemplate().find(new Query(), Person.class);  

   }  

  

   @Override  

   public void findAndModify(String id) {getMongoTemplate().updateFirst(new Query(Criteria.where("id").is(id)), new Update().inc("age", 3)); 

   }@Override  

   public List<Person> findByRegex(String regex) {Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);Criteria criteria = new Criteria("name").regex(pattern.toString());       return getMongoTemplate().find(new Query(criteria), Person.class);     }@Override  

   public Person findOne(String id) {return getMongoTemplate().findOne(new Query(Criteria.where("id").is(id)), Person.class);  

   }@Override  

   public void insert(Person person) {getMongoTemplate().insert(person);  

   }@Override  

   public void removeAll() {List<Person> list = this.findAll();if(list != null){for(Person person : list){getMongoTemplate().remove(person);}}  

   }  

  

   @Override  

   public void removeOne(String id){Criteria criteria = Criteria.where("id").in(id);if(criteria == null){Query query = new Query(criteria);if(query != null && getMongoTemplate().findOne(query, Person.class) != null)getMongoTemplate().remove(getMongoTemplate().findOne(query, Person.class));       }

   }  

  

   public MongoTemplate getMongoTemplate() {return mongoTemplate;  

   }public void setMongoTemplate(MongoTemplate mongoTemplate) {this.mongoTemplate = mongoTemplate;  

   }

}

5.实现类注入到service层调用

最后

在这里插入图片描述

👇🏻 添加 博主 获取图中PDF文档 👇🏻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/47181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 多台机器修改时间同步

修改东八区 首先第一步&#xff0c;通过命令 &#xff1a;date -R 查看当前系统所在时区。如是0800&#xff0c;则是东八区&#xff0c;也就是我们当下的北京时间&#xff0c;如不是&#xff08;如下图&#xff09;&#xff0c;做如下调整。 命令行键入命令&#xff1a;tzsele…

认识与了解前端Dom

Dom 文档对象模型 Dom是关于创建&#xff0c;修改&#xff0c;插入&#xff0c;删除页面元素的标准 Dom赋予我们操作操作页面的能力 页面的内容都是字符串&#xff0c;js会把这些字符串转换成DOM树&#xff0c;DOM树会把字符串转换成节点&#xff0c;其实我们操作DOM的根本就…

CSS布局的三种方式

绝对定位 绝对定位&#xff1a; ​ 属性&#xff1a;position 值&#xff1a;absolute <style> p.abs{position: absolute;left: 150px;top: 50px; }</style><p >正常文字1</p> <p >正常文字2</p> <p class"abs" >绝对定…

Postman常用断言功能解析

一、Postman断言模块 二、七种常规业务断言 前4种最常用&#xff1a; 1&#xff09;Status code:Code is 200 检查返回的状态码是否为200 2&#xff09;Response body:Contains string 检查响应中包括指定字符串 3&#xff09;Response body:Json value check 检查响应中其中js…

C++ Reference: Standard C++ Library reference: Containers: list: list: cbegin

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/cbegin/ 公有成员函数 <list> std::list::cbegin const_iterator cbegin() const noexcept; 返回开始的常量迭代器 返回指向容器第一个元素的const_iterator对象。 const_iterator是指向const内容…

不用ps也能在线设计电商详情页的方法

食品类的商品要如何设计排版详情页呢&#xff1f;怎么样排版食品类商品的详情页才好看&#xff1f;想设计一张好看食品的详情页其实是有方法的&#xff0c;下面跟着小编学习如何使用在线工具乔拓云&#xff0c;在线设计一个食品商品的详情页&#xff0c;还有海量的商品详情页模…

mysql索引类别和失效场景

首先&#xff0c;我们为什么要使用索引&#xff0c;索引有什么作用呢&#xff1f; 索引可以用来快速查询数据表中有某一特定值的记录&#xff0c;大大加快数据的查询速度&#xff1b;在列上创建了索引之后&#xff0c;查找数据时可以直接根据该列上的索引找到对应记录行的位置…

经典文献阅读之--PL-SLAM(点线SLAM)

0. 简介 之前作者基本都在围绕着特征点提取的路径在学习&#xff0c;最近看到了最近点云PCL推送的《Structure PLP-SLAM: Efficient Sparse Mapping and Localization using Point, Line and Plane for Monocular, RGB-D and Stereo Cameras》。这个工作是基于OpenVSLAM架构的…

测评 | 基于AM5708开发板——AM5708 SOC使用uboot更新uboot

本次测评板卡是创龙科技旗下的TL570x-EVM,它是一款基于TI Sitara系列AM5708ARM Cortex-A15+浮点DSPC66x处理器设计的异构多核SOC评估板,由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。 评估板接口资源丰富,引出…

学苑教育杂志学苑教育杂志社学苑教育编辑部2022年第32期目录

前沿 学苑简讯《学苑教育》投稿&#xff1a;cn7kantougao163.com 4-6 专题研究 把握有效生成 焕发课堂魅力——小学语文课堂有效动态生成策略探析 任云青; 7-811 教育管理 新课程理念下高中契约式班级管理研究 孙磊; 9-11 小学班级管理中文明礼仪教育实施策略的…

Ubuntu 20.04 上学习Open vSwitch :VxLAN

参考 OpenvSwitch完全使用手册 云计算底层技术-使用openvswitch Open vSwitch 概述&#xff1b;OVS支持的功能&#xff1b;ovs的模块介绍&#xff08;ovs-vswitchd、ovsdb-server等等 学习环境 学习 OpenStack 2 个 Hyper-V 虚拟机 Ubuntu 20.04 203.0.113.101 /24 ( 网关&a…

Git——入门介绍

目录1.Git概述1.1.版本控制1.2.版本控制工具1.2.1集中式版本控制工具1.2.2分布式版本控制工具1.3.Git 工作机制1.4.Git 和代码托管中心2.Git下载安装2.1.Git下载2.2.Git安装3.Git常用命令3.1.设置用户签名3.2.初始化本地库3.3.查看本地库状态3.4.添加暂存区3.5.提交本地库3.6.修…

6、python的高级特性(生成式、生成器、闭包、装饰器)

文章目录生成式列表生成式字典生成式集合生成式生成器生成器的实现方式将生成式改写成生成器。将[ ] 改成 ( )使用yield关键字闭包装饰器生成式 列表生成式 在“先有一个空列表&#xff0c;然后通过循环依次将元素添加到列表中”的场景&#xff0c;可以使用列表生成式。 列表…

核心解读 - 2022版智慧城市数字孪生标准化白皮书

核心解读 - 2022版智慧城市数字孪生标准化白皮书前言&#xff1a;城市数字孪生基本概念一、城市数字孪生概述1、城市数字孪生内涵及概念模型2、城市数字孪生典型特征3、城市数字孪生相关方4、城市数字孪生技术参考架构5、城市数字孪生关键技术二、智慧城市数字孪生发展现状1、政…

JMeter下载及安装配置教程

参考&#xff1a;入门部署教程 – Jmeter中文网 本文是在win10环境下安装使用jmeter&#xff0c;jmeter可以运行在多平台上Windows和Linux。 环境准备&#xff1a; java 8 jmeter 5.1.1 jmeter环境 jmeter环境依赖JAVA环境&#xff0c;需安装JDK1.8环境&#xff0c;JDK下载地…

基于若依springboot二次开发WMS带移动端管理系统vue源码

系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。搭建部署的方式也是挺简单的&#xff0c;还带有uniapp开发的多端移动端扫码入库功能 技术架构 技术框架&#xff1a;SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 …

轻薄笔记本能不能带起来高刷的显示器??

先说结论&#xff0c;新款集显也可以&#xff0c;用TYPC或者DP线连&#xff0c;使用时关闭主屏&#xff0c;只显示外屏。 这个问题&#xff0c;已经困扰了很久~~~ 软件上&#xff0c;windows以主屏作为主刷新率&#xff0c;除非笔记本自身是高刷屏&#xff0c;否则请只使用外…

单应性矩阵在标定中的应用

1.单应性矩阵是什么&#xff1f; 言简意赅定义&#xff1a;定义在两个不同视角中对同一平面范围内的特征点的射影变换&#xff08;projective transformation&#xff09;即&#xff1a; x1 H*x2 //x1、x2为匹配点 上图中x&#xff0c;x‘为一对匹配点&#xff0c;通过单应矩…

Pytest自动化框架运行全局配置文件pytest.ini

前言 还记得在之前的篇章中有讲到Pytest是目前主要流行的自动化框架之一&#xff0c;他有基础的脚本编码规则以及两种运行方式。 pytest的基础编码规则是可以进行修改&#xff0c;这就是今日文章重点。 看到这大家心中是否提出了两个问题&#xff1a;pytest的基础编码规则在…

Array_JavaScript

Array 学习路线&#xff1a;JavaScript基础语法&#xff08;输出语句&#xff09;->JavaScript基础语法&#xff08;变量&#xff09;->JavaScript基础语法&#xff08;数据类型&#xff09;->JavaScript基础语法&#xff08;运算符&#xff09;->JavaScript基础语…