单点登录。
分布式最流行的是JWT。
单点登陆。
无状态就是服务器不存登陆信息。服务器存的话只能存session里面。
前端是存到cookie里面。
登陆信息取出来放在消息头里面发给服务端。
-----------------------------------------------------------------------------------01-----------------------------------------------------------------------------------
比较重要的。
mongoDB是非关系型数据库。
关系型数据库就是表和表之间是有关系的。
一对一一对多靠主键外键,多对多是关系表。
-----------------------------------------02----------------------------------------03---------------------------------------------------------------------------------
mongodb数据库的基本类型:
支持的数据类型:
------------------------------------------------------------------------------------------04----------------------------------------------------------------------------
:正则表达式必须放在两个斜杠之间。
主键必须是_id。
----------------------------------------------------------------------------------05------------------------------------------------------------------------------
安装与启动。
win的安装与启动,本地只用客户端。
本地的客户端启动之后,我们不要关闭这个启动的窗口,再打开一个窗口。
----------------------------------------------------------------------06------------------------------------------------------------------------------------------
Centos启动mongodb。
docker run -di --name=tensquare_mongo -p 27017:27017 mongo
连接远程的:
------------------------------------------------------------------------------------07-------------------------------------------------------------------------
创建数据库:
搞吐槽的微服务。
必须是_id。
树的表结构:
----------------------------------------08--------------------------------------------------------------------------------------------------------------------------
操作mongdb:
----------------------------------------09-------------------------------------------------------------------------------------------------------------------------
注意插入的格式:
注意查询的格式:插入的时候要是不指定id的话给你生成一个_id。
查询:
----------------------------------------------------------------------------10-------------------------------------------------------------------------------------
mongdb教程网:https://www.php.cn/redis/421928.html 很好的视频教程视频。
update:
修改某个字段其他的原封不动。
删除:
------------------------------------------------------------------------------------11------------------------------------------------------------------------------
查询总数:
模糊查询:
只是数据是json格式的。
------------------------------------------------------------------------------12---------------------------------------------------------------------------------------
复杂的查询:
大于:
包含不包含:
------------------------------------------
范围查询:
列值增长:
有概念就可以了。
------------------------------------------------------------------------13--------------------------------------------------------------------------------------
java操作mongdb。
第一步:新建工程
第二步:导包
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb‐driver</artifactId>
<version>3.6.3</version>
</dependency>
</dependencies>
第三步:操作
public static void main(String[] args) {
//连接mongo服务器
MongoClient client = new MongoClient("192.168.244.136");
//得到要操作的数据库
MongoDatabase spitdb = client.getDatabase("spitdb");
//得到要操作的集合
MongoCollection<Document> spit = spitdb.getCollection("spit");
//得到表
FindIterable<Document> documents = spit.find();
//遍历数据
for(Document document:documents){
System.out.println("内容:"+document.getString("content"));
}
client.close();
}
-------------------------------------------------------------------------------14--------------------------------------------------------------------------------------
复杂的查询:
public static void main(String[] args) {
//连接mongo服务器
MongoClient client = new MongoClient("192.168.244.136");
//得到要操作的数据库
MongoDatabase spitdb = client.getDatabase("spitdb");
//得到要操作的集合
MongoCollection<Document> spit = spitdb.getCollection("spit");
//封装查询条件
BasicDBObject bean = new BasicDBObject("content","你输谁你在哪里123");
//得到文档
FindIterable<Document> documents = spit.find(bean);
//遍历数据
for(Document document:documents){
System.out.println("内容:"+document.getString("content"));
}
client.close();
}
public static void main(String[] args) {
//连接mongo服务器
MongoClient client = new MongoClient("192.168.244.136");
//得到要操作的数据库
MongoDatabase spitdb = client.getDatabase("spitdb");
//得到要操作的集合
MongoCollection<Document> spit = spitdb.getCollection("spit");
//封装查询条件
//BasicDBObject bean = new BasicDBObject("content","你输谁你在哪里123");
//查询访问量大于100的
BasicDBObject bean = new BasicDBObject("visits",new BasicDBObject("$gt",100));
//得到表
FindIterable<Document> documents = spit.find(bean);
//遍历数据
for(Document document:documents){
System.out.println("内容:"+document.getString("content"));
System.out.println("访问量:"+document.getInteger("visits"));
}
client.close();
}
------------------------------------------------------------------------15--------------------------------------------------------------------------------------
添加数据:
public static void main(String[] args) {
//连接mongo服务器
MongoClient client = new MongoClient("192.168.244.136");
//得到要操作的数据库
MongoDatabase spitdb = client.getDatabase("spitdb");
//得到要操作的集合
MongoCollection<Document> spit = spitdb.getCollection("spit");
//添加数据
Map<String,Object> map = new HashMap<String,Object>();
map.put("content","java添加的数据");
map.put("visits",100);
Document documentnew = new Document(map);
spit.insertOne(documentnew);
FindIterable<Document> documents = spit.find();
for(Document document:documents){
System.out.println("内容:"+document.getString("content"));
System.out.println("访问量:"+document.getInteger("visits"));
}
client.close();
}
------------------------------------------------------------------------------16----------------------------------------------------------------------------------------
开始最重要的了:springdataMongodb这个框架是很好的。
第一步:新建项目。
<dependencies>
<dependency>
<groupId>com.tensquare</groupId>
<artifactId>tensquare_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
</dependencies>
第二步:写yml文件。
server:
port: 9006
spring:
application:
name: tensquare-spit
data:
mongodb:
host: 192.168.244.136
database: spitdb
第三步:启动类
@SpringBootApplication
public class SpitApplication {
public static void main(String[] args) {
SpringApplication.run(SpitApplication.class);
}
@Bean
public IdWorker idWorker(){
return new IdWorker();
}
}
------------------------------------------------------------------------17--------------------------------------------------------------------------------------
整合mongodb的curd。
第一步:实体类
第二步:写dao
第三步:写一套:
------------------------------------------------------------------------18--------------------------------------------------------------------------------------
根据父节点查询吐槽:
第一步:
注意分页的写法
@GetMapping("/comment/{parentId}/{page}/{size}")
public Result findByParentId(@PathVariable("parentId") String parentId, @PathVariable("page")Integer page, @PathVariable("size")Integer size){
Page<Spit> pageSpit = spitService.findByParentid(parentId, page, size);
return new Result(true, StatusCode.OK, "查询成功",new PageResult<Spit>(pageSpit.getTotalElements(),pageSpit.getContent()));
}
public Page<Spit> findByParentid(String parentId, Integer page, Integer size){
Pageable pageable= PageRequest.of(page-1,size);
return spitDao.findByParentid(parentId,pageable);
}
第二步:写Dao。
注意或者和操作数据库的写法是一样的。
public interface SpitDao extends MongoRepository<Spit,String> {
/**
* 根据父级id查询吐槽数据
* @param parentId
* @param pageable
* @return
*/
Page<Spit> findByParentid(String parentId, Pageable pageable);
}
第三步:写controller
@GetMapping("/comment/{parentId}/{page}/{size}")
public Result findByParentId(@PathVariable("parentId") String parentId, @PathVariable("page")Integer page, @PathVariable("size")Integer size){
Page<Spit> pageSpit = spitService.findByParentid(parentId, page, size);
return new Result(true, StatusCode.OK, "查询成功",new PageResult<Spit>(pageSpit.getTotalElements(),pageSpit.getContent()));
}
第四步:查询
看下查询和插入的对照。
http://localhost:9006/spit
http://localhost:9006/spit/comment/1/1/2
------------------------------------------------------------------------19--------------------------------------------------------------------------------------
吐槽的点赞效率问题:
//方式一:效率有问题
/*Spit spit = spitDao.findById(spitId).get();
spit.setThumbup((spit.getThumbup()==null?0:spit.getThumbup())+1);
spitDao.save(spit);*/
效率问题:
@Autowired
private MongoTemplate mongoTemplate;
//方式一:使用原生mongo命令来实现自增 db.spitdb.update({"_id":"1"}:{$inc:{thumbup:NumberInt(1)}})
Query query=new Query();
query.addCriteria(Criteria.where("_id").is(spitId));
Update update=new Update();
update.inc("thumbup",1);
mongoTemplate.updateFirst(query,update,"spitdb");
//方式二:使用原生mongo命令来实现自增 db.spitdb.update({"_id":"1"}:{$inc:{thumbup:NumberInt(1)}})
测试:
http://localhost:9006/spit/thumbup/1/
------------------------------------------------------------------------20----------21----------------------------------------------------------------------------
不能重复点赞:通过redis。
@PostMapping("/thumbup/{spitId}")
public Result thumbup(@PathVariable String spitId){
//判断当前用户是否已经点赞,但未做认证,暂时先把userid写死 实际上是带token去验证的
String userid ="1113";
if(redisTemplate.opsForValue().get("thumbup_"+spitId+"_"+userid)!=null){
return new Result(false, StatusCode.REPERROR, "不能重复点赞");
}
spitService.thumbup(spitId);
redisTemplate.opsForValue().set("thumbup_"+spitId+"_"+userid,1);
return new Result(true, StatusCode.OK, "点赞成功");
}
------------------------------------------------------------------------22----------------------------------------------------------------------------
完善添加吐槽:
@PostMapping("/thumbup/{spitId}")
public Result thumbup(@PathVariable String spitId){
//判断当前用户是否已经点赞,但未做认证,暂时先把userid写死 实际上是带token去验证的
String userid ="1113";
if(redisTemplate.opsForValue().get("thumbup_"+userid+spitId)!=null){
return new Result(false, StatusCode.REPERROR, "不能重复点赞");
}
spitService.thumbup(spitId);
redisTemplate.opsForValue().set("thumbup_"+userid+spitId,1);
return new Result(true, StatusCode.OK, "点赞成功");
}
------------------------------------------------------------------------23----------------------------------------------------------------------------
完善添加吐槽:
public void save(Spit spit){
spit.set_id(idWorker.nextId()+"");
spit.setPublishtime(new Date());//发布日期
spit.setVisits(0);//浏览量
spit.setShare(0);//分享数
spit.setThumbup(0);//点赞数
spit.setComment(0);//回复数
spit.setState("1");//状态
//如果当前添加的吐槽,有父节点,name父节点的吐槽回复数要加1 实际上这个层数是不对的
if(spit.getParentid()!=null && !"".equals(spit.getParentid())){
//为在别人的下面回复
Query query=new Query();
query.addCriteria(Criteria.where("_id").is(spit.getParentid()));//id等于当前spit的父节点
Update update=new Update() ;
update.inc("comment",1);//父节点的吐槽的回复数加1
mongoTemplate.updateFirst(query,update,"spitdb");
}
spitDao.save(spit);
}
------------------------------------------------------------------------24----------------------------------------------------------------------------