單點登錄。
分佈式最流行的是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----------------------------------------------------------------------------