MongoDB
通过MongoTemplate完成CRUD操作
所对应的实体类
@Document(value="person")
public class Person {
private ObjectId id;
private String name;
private int age;
private String address;
}
@Autowired
private MongoTemplate mongoTemplate;
//保存
@Test
public void testSave() {
Person person = new Person();
person.setName("张三");
person.setAge(18);
person.setAddress("北京金燕龙");
mongoTemplate.save(person);
}
//保存
@Test
public void testSave2() {
for (int i = 0; i < 10; i++) {
Person person = new Person();
person.setId(ObjectId.get()); //ObjectId.get():获取一个唯一主键字符串
person.setName("张三"+i);
person.setAddress("金燕龙"+i);
person.setAge(18+i);
mongoTemplate.save(person);
}
}
/**
* 查询所有
*/
@Test
public void testFindAll() {
List<Person> list = mongoTemplate.findAll(Person.class);
for (Person person : list) {
System.out.println(person);
}
}
/**
* 条件查询
*/
@Test
public void testFind() {
//1、创建Criteria对象,并设置查询条件
Criteria criteria = Criteria.where("myname").is("张三")
.and("age").is(18)
;//is 相当于sql语句中的=
//2、根据Criteria创建Query
Query query = new Query(criteria);
//3、查询
List<Person> list = mongoTemplate.find(query, Person.class);//Query对象,实体类对象字节码
for (Person person : list) {
System.out.println(person);
}
}
/**
* 分页查询
*/
@Test
public void testPage() {
int page = 1;
int size = 2;
//1、创建Criteria对象,并设置查询条件
Criteria criteria = Criteria.where("age").lt(50); //is 相当于sql语句中的=
//2、根据Criteria创建Query
Query queryLimit = new Query(criteria)
.skip((page -1) * size) //从第几条开始查询
.limit(size) //每页查询条数
.with(Sort.by(Sort.Order.desc("age")));
//3、查询
List<Person> list = mongoTemplate.find(queryLimit, Person.class);
for (Person person : list) {
System.out.println(person);
}
}
/**
* 更新
*/
@Test
public void testUpdate() {
//1、构建Query对象
Query query = Query.query(Criteria.where("id").is("61275c3980f68e67ab4fdf25"));
//2、设置需要更新的数据内容
Update update = new Update();
update.set("age", 10);
update.set("myname", "lisi");
//3、调用方法
mongoTemplate.updateFirst(query, update, Person.class);
}
update.inc(key,1)给某个字段加一
mongoTemplate.exists(query,Comment.class)
//删除
@Test
public void testDelete() {
//1、构建Query对象
Query query = Query.query(Criteria.where("id").is("5fe404c26a787e3b50d8d5ad"));
mongoTemplate.remove(query, Person.class);
}
副本集群
对于中小型项目,使用副本集群就够了。
一个主,两个从库组成,主库宕机时,这两个从库都可以被选为主库。
当主库宕机后,两个从库都会进行竞选,其中一个变为主库,当原主库恢复后,作为从库加入当前的复制集群即可。
Master:代表主节点,主节点提供所有数据的CRUD服务
Backup:代表从节点,从节点不提供任何服务
Arbitration:代表仲裁节点,仲裁节点不存储任何数据,其主要作用就是当主节点挂掉以后,把那个备份节点提升为一个主节点。
secondary: 从节点, 提供只读服务
分片集群
高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。
为了解决这些问题,有两个基本的方法: 垂直扩展和水平扩展。
垂直扩展:增加更多的CPU和存储资源来扩展容量。
水平扩展:将数据集分布在多个服务器上。水平扩展即分片。
例如,如果数据库1tb的数据集,并有4个分片,然后每个分片可能仅持有256 GB的数据。如果有40个分片,那么每个切分可能只有25GB的数据。
分片策略
范围指定:将指定字段数据按照范围进行划分,根据范围获取分片服务器
数据hash:将指定字段的数据进行hash计算,获取存储的分片服务器