第二章-查詢與快取
第二章-查詢與快取
1. 基礎微服務條件查詢
1.1 標籤-條件查詢
POST /label/search 根據條件查詢城市列表
- 修改LabelService ,增加方法
/**
* 根據條件查詢
* @param label
* @return
*/
public List<Label> findSearch(Label label) {
return labelDao.findAll(createSpecification(label));
}
/**
* 動態條件構建
* @param label
* @return
*/
private Specification<Label> createSpecification(Label label) {
return new Specification<Label>() {
@Override
public Predicate toPredicate(Root<Label> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicateList = new ArrayList<Predicate>();
//new一個list集合。來存放所有的條件
List<Predicate> list = new ArrayList<>();
if (label.getLabelname() != null && !"".equals(label.getLabelname())) {
Predicate predicate = cb.like (root.get("labelname").as(String.class), "%" + label.getLabelname() + "%");// labelname like "%小明%"
list.add(predicate);
}
if (label.getState() != null && !"".equals(label.getState())) {
Predicate predicate = cb.equal(root.get("state").as(String.class), label.getState());// state = "1"
list.add(predicate);
}
//new一個數組作為最終返回值的條件
Predicate[] parr = new Predicate[list.size()];
//把list直接轉成陣列
parr = list.toArray(parr);
return cb.and(parr);// where labelname like "%小明%" and state = "1"
}
};
}
- 修改LabelController,增加方法
/**
* 根據條件查詢
* @param label
* @return
*/
@PostMapping("/search")
public Result findSearch(@RequestBody Label label){
List<Label> list = labelService.findSearch(label);
return new Result(true, StatusCode.OK, "查詢成功", list);
}
1.2 帶分頁的條件查詢
- 修改LabelService,增加方法
/**
* 帶分頁的條件查詢
* @param label
* @param page
* @param size
* @return
*/
public Page<Label> pageQuery(Label label, int page, int size) {
//封裝分頁物件
Pageable pageable = PageRequest.of(page-1, size);
return labelDao.findAll(createSpecification(label), pageable);
}
- 修改LabelController,增加方法
/**
* 根據條件查詢帶分頁
* @param label
* @param page
* @param size
* @return
*/
@PostMapping("/search/{page}/{size}")
public Result pageQuery(@RequestBody Label label, @PathVariable int page, @PathVariable int size){
Page<Label> pageData = labelService.pageQuery(label, page, size);
return new Result(true, StatusCode.OK, "查詢成功", new PageResult<Label>(pageData.getTotalElements(), pageData.getContent()));
}
2. 招聘微服務開發
2.1 表結構分析
招聘微服務包括
企業資訊
,招聘資訊
- 企業表 tb_enterprise
欄位名稱 | 欄位含義 | 欄位型別 | 備註 |
---|---|---|---|
id | ID | 文字 | |
name | 企業名稱 | 文字 | |
summary | 企業簡介 | 文字 | |
address | 企業地址 | 文字 | |
labels | 標籤列表 | 文字 | 用逗號分隔 |
coordinate | 企業位置座標 | 文字 | 經度,緯度 |
ishot | 是否熱門 | 文字 | 0:非熱門 1:熱門 |
logo | LOGO | 文字 | |
jobcount | 職位數 | 數字 | |
url | URL | 文字 |
- 招聘資訊表 tb_recruit
欄位名稱 | 欄位含義 | 欄位型別 | 備註 |
---|---|---|---|
id | ID | 文字 | |
jobname | 招聘職位 | 文字 | |
salary | 薪資範圍 | 文字 | |
condition | 經驗要求 | 文字 | |
education | 學歷要求 | 文字 | |
type | 任職方式 | 文字 | |
address | 辦公地址 | 文字 | |
eid | 企業ID | 文字 | |
createtime | 釋出日期 | 日期 | |
state | 狀態 | 文字 | 0:關閉 1:開啟 |
2.2 程式碼生成
- (1) 使用程式碼生成器生成招聘微服務程式碼 tensquare_recruit
- (2)拷貝到當前工程,並在父工程引入。
- (3) 修改Application類名稱為RecruitApplication
- (4)修改application.yml 中的埠為9002 ,url 為
jdbc:mysql://localhost:3306/tensquare_recruit?characterEncoding=UTF8
- (5)進行瀏覽器測試
2.3 程式碼編寫
2.3.1 熱門企業列表
查詢企業表ishot欄位為1的記錄
- (1)EnterpriseDao新增方法定義
/**
* 根據熱門狀態獲取企業列表,這個通過JPA自動實現了
* @param ishot
* @return
*/
public List<Enterprise> findByIshot(String ishot);
- (2)EnterpriseService新增方法
/**
* 熱門企業列表
* @return
*/
public List<Enterprise> hotlist(){
return enterpriseDao.findByIshot("1");
}
- (3)EnterpriseController新增方法
/**
* 查詢熱門企業
* @return
*/
@GetMapping("/search/hotlist")
public Result hotlist(){
return new Result(true, StatusCode.OK,"查詢成功",enterpriseService.hotlist());
}
- (4)測試
http://localhost:9002/enterprise/search/hotlist
2.3.2 推薦職位列表
需求分析: 查詢狀態為2並以建立日期降序排序,查詢前6條記錄
- (1) 在RecruitDao新增方法定義
/**
* 查詢最新職位列表按照 state 來查詢(按照建立日期降序)
* @param state
* @return
*/
List<Recruit> findTop6ByStateOrderByCreatetimeDesc(String state);//where state=? order by createime
- (2) RecruitService新增方法
/**
* 根據狀態查詢
* @param state
* @return
*/
public List<Recruit> findTop6ByStateOrderByCreatetimeDesc(String state){
return recruitDao.findTop6ByStateOrderByCreatetimeDesc(state);
}
- (3) RecruitController新增方法
@GetMapping("/search/recommend")
public Result recommend(){
List<Recruit> list = recruitService.findTop6ByStateOrderByCreatetimeDesc("2");
return new Result(true,StatusCode.OK,"查詢成功",list);
}
- (4) 測試
http://localhost:9002/recruit/search/recommend
2.3.3 最新職位列表
需求分析:查詢狀態不為0並以建立日期降序排序,查詢前6條記錄
- (1) 在RecruitDao新增方法定義
/**
* 查詢最新職位列表不按照 state 來查詢(按照建立日期降序)查詢狀態不為0並以建立日期降序排序,查詢前12條記錄
* @param state
* @return
*/
List<Recruit> findTop6ByStateNotOrderByCreatetimeDesc(String state);//where state!=? order by createime
- (2) RecruitService新增方法
/**
* 最新職位列表
* @return
*/
public List<Recruit> newlist(){
return recruitDao.findTop6ByStateNotOrderByCreatetimeDesc("0");
}
- (3) RecruitController新增方法
/**
* 最新職位列表
* @return
*/
@GetMapping("/search/newlist")
public Result newlist(){
return new Result(true,StatusCode.OK,"查詢成功",recruitService.newlist());
}
- (4)測試
http://localhost:9002/recruit/search/newlist
3. 問答微服務開發
3.1 表結構分析
- 招聘資訊表 tb_recruit
欄位名稱 | 欄位含義 | 欄位型別 | 備註 |
---|---|---|---|
id | ID | 文字 | |
title | 問題標題 | 文字 | |
content | 問題內容 | 文字 | |
createtime | 釋出日期 | 日期 | |
updatetime | 更新日期 | 日期 | |
userid | 釋出人ID | 文字 | |
nickname | 釋出人暱稱 | 文字 | |
visits | 瀏覽量 | 整型 | |
thumbup | 點贊數 | 整型 | |
reply | 回覆數 | 整型 | |
solve | 是否解決 | 文字 | |
replyname | 最新回覆人 | 文字 | |
replytime | 最新回覆時間 | 日期 |
3.2 程式碼生成
- (1)使用程式碼生成器生成招聘微服務程式碼 tensquare_qa
- (2)拷貝到當前工程,並在父工程引入。
- (3)修改Application類名稱為QaApplication
- (4)修改application.yml 中的埠為9003 ,url 為
jdbc:mysql://localhost:3306/tensquare_qa?characterEncoding=UTF8
- (5) 進行瀏覽器測試
3.3 程式碼編寫
3.3.1 最新回答列表
需求分析:最新回覆的問題顯示在上方, 按回復時間降序排序
- (1) ProblemDao新增方法定義
/**
* 根據標籤ID查詢最新問題列表
* @param labelid
* @param pageable
* @return
*/
@Query(value = "SELECT * FROM tb_problem, tb_pl WHERE id = problemid AND labelid=? ORDER BY replytime DESC", nativeQuery = true)
public Page<Problem> newlist(String labelid, Pageable pageable);
- (2) ProblemService新增方法
/**
* 根據標籤ID查詢問題列表
* @param lableId 標籤ID
* @param page 頁碼
* @param size 頁大小
* @return
*/
public Page<Problem> findNewListByLabelId(String lableId,int page,int size) {
PageRequest pageRequest = PageRequest.of(page-1, size);
return problemDao.newlist(lableId,pageRequest);
}
- (3) ProblemController新增方法
/**
* 根據標籤ID查詢最新問題列表
* @param labelid
* @return
*/
@GetMapping("/newlist/{labelid}/{page}/{size}")
public Result findNewListByLabelId(@PathVariable String labelid,@PathVariable int page,@PathVariable int size ){
Page<Problem> pageList = problemService.findNewListByLabelId(labelid, page, size);
PageResult<Problem> pageResult = new PageResult<>(pageList.getTotalElements(), pageList.getContent());
return new Result(true, StatusCode.OK, "查詢成功",pageResult);
}
- (4) 測試
http://localhost:9003//problem/newlist/{labelid}/{page}/{size}
3.3.2 熱門問答列表
- (1) ProblemDao新增方法定義
/**
* 熱門問題列表
* @param labelid
* @param pageable
* @return
*/
@Query(value = "SELECT * FROM tb_problem, tb_pl WHERE id = problemid AND labelid=? ORDER BY reply DESC", nativeQuery = true)
public Page<Problem> hotlist(String labelid, Pageable pageable);
- (2) ProblemService新增方法
/**
* 根據標籤ID查詢熱門問題列表
* @param lableId 標籤ID
* @param page 頁碼
* @param size 頁大小
* @return
*/
public Page<Problem> findHotListByLabelId(String lableId,int page,int size) {
PageRequest pageRequest = PageRequest.of(page-1, size);
return problemDao.hotlist(lableId,pageRequest);
}
- (3) ProblemController新增方法
/**
* 根據標籤ID查詢熱門問題列表
* @param labelid 標籤ID
* @param page 頁碼
* @param size 頁大小
* @return
*/
@GetMapping("/hotlist/{labelid}/{page}/{size}")
public Result findHotListByLabelId(@PathVariable String labelid,@PathVariable int page,@PathVariable int size ){
Page<Problem> pageList = problemService.findHotListByLabelId(labelid, page, size);
PageResult<Problem> pageResult = new PageResult<>(pageList.getTotalElements(), pageList.getContent());
return new Result(true, StatusCode.OK, "查詢成功",pageResult);
}
- (4) 測試 ``
3.3.3 等待問答列表
- (1) ProblemDao新增方法定義
/**
* 等待回答問題列表
* @param labelid
* @param pageable
* @return
*/
@Query(value = "SELECT * FROM tb_problem, tb_pl WHERE id = problemid AND labelid=? AND reply=0 ORDER BY createtime DESC", nativeQuery = true)
Page<Problem> waitlist(String labelid, Pageable pageable);
- (2) ProblemService新增方法
/**
* 根據標籤ID查詢等待問題列表
* @param lableId 標籤ID
* @param page 頁碼
* @param size 頁大小
* @return
*/
public Page<Problem> findWaitListByLabelId(String lableId,int page,int size) {
PageRequest pageRequest = PageRequest.of(page-1, size);
return problemDao.waitlist(lableId,pageRequest);
}
- (3) ProblemController新增方法
/**
* 根據標籤ID查詢等待問題列表
* @param labelid 標籤ID
* @param page 頁碼
* @param size 頁大小
* @return
*/
@GetMapping("/waitlist/{labelid}/{page}/{size}")
public Result findWaitListByLabelId(@PathVariable String labelid,@PathVariable int page,@PathVariable int size ){
Page<Problem> pageList = problemService.findWaitListByLabelId(labelid, page, size);
PageResult<Problem> pageResult = new PageResult<>(pageList.getTotalElements(), pageList.getContent());
return new Result(true, StatusCode.OK, "查詢成功",pageResult);
}
- (4) 測試 ``
4. 文章微服務開發
4.1 表結構分析
- 招聘資訊表 tb_article
欄位名稱 | 欄位含義 | 欄位型別 | 備註 |
---|---|---|---|
id | ID 文字 | ||
columnid | 專欄ID | 文字 | |
userid | 使用者ID | 文字 | |
title | 文章標題 | 文字 | |
content | 文章內容 | 文字 | |
image | 文章封面 | 文字 | |
createtime | 發表日期 | 日期 | |
updatetime | 修改日期 | 日期 | |
ispublic | 是否公開 | 文字 | 0:不公開 1:公開 |
istop | 是否置頂 | 文字 | 0:不置頂 1:置頂 |
visits | 瀏覽量 | 整型 | |
thumbup | 點贊數 | 整型 | |
comment | 評論數 | 整型 | |
state | 稽核狀態 | 文字 | 0:未稽核 1:已稽核 |
channelid | 所屬頻道 | 整型 | 關聯頻道表ID |
url | URL地址 | 文字 | |
type | 文章型別 | 文字 | 0:分享 1:專欄 |
4.2 程式碼生成
- (1) 使用程式碼生成器生成招聘微服務程式碼 tensquare_article
- (2) 拷貝到當前工程,並在父工程引入。
- (3) 修改Application類名稱為ArticleApplication
- (4) 修改application.yml 中的埠為9004 ,url 為
jdbc:mysql://192.168.184.134:3306/tensquare_article?characterEncoding=UTF8
- (5) 瀏覽器測試
4.3 程式碼編寫
4.3.1 文章稽核
- (1) ArticleDao新增方法
/**
* 文章稽核
* @param id 需要稽核的文章ID
*/
@Modifying
@Query(value = "UPDATE tb_article SET state=1 WHERE id = ?", nativeQuery = true)
void examine(String id);
- (2) ArticleService新增方法
/**
* 文章稽核
* @param id 需要稽核的文章ID
*/
public void examine(String id){
articleDao.examine(id);
}
- (3) ArticleController新增方法
/**
* 稽核
* @param id
* @return
*/
@PutMapping("/examine/{id}")
public Result examine(@PathVariable String id){
articleService.examine(id);
return new Result(true, StatusCode.OK, "稽核成功!");
}
4.3.2 文章點贊
- (1) ArticleDao新增方法
/**
* 文章稽核
* @param id 需要稽核的文章ID
*/
@Modifying
@Query(value = "UPDATE tb_article SET state=1 WHERE id = ?", nativeQuery = true)
void examine(String id);
- (2) ArticleService新增方法
/**
* 文章稽核
* @param id 需要稽核的文章ID
*/
public void examine(String id){
articleDao.examine(id);
}
- (3) ArticleController新增方法
/**
* 文章點贊
* <pre>
* thumbup=thumbup+1
* </pre>
* 上面的是為了防止錯誤,這樣寫了之後第一次點贊不會報錯
* @param id 需要點讚的文章id
*/
@Modifying
@Query(value = "UPDATE tb_article SET thumbup=thumbup+1 WHERE id = ?", nativeQuery = true)
void addThumbup(String id);
- (2) ArticleService新增方法
/**
* 點贊
* @param id 文章ID
* @return
*/
public void addThumbup(String id){
articleDao.addThumbup(id);
}
- (3) ArticleController新增方法
/**
* 文章點贊
* @param id 需要點讚的文章ID
* @return
*/
@PutMapping("/thumbup/{id}")
public Result updateThumbup(@PathVariable String id){
articleService.addThumbup(id);
return new Result(true, StatusCode.OK,"點贊成功");
}
5. 快取處理
為了提高查詢效能,我們通常使用redis快取解決
5.1 Redis環境搭建
我們以docker的方式搭建redis服務
docker run -di --name=tensquare_redis -p 6379:6379 redis
5.2 SpringDataRedis
Spring-data-redis是spring大家族的一部分,提供了在srping應用中通過簡單的配置訪問
redis服務,對reids底層開發包(Jedis, JRedis, and RJC)進行了高度封裝,RedisTemplate
提供了redis各種操作。
5.3 實現文章的快取處理
5.3.1 查詢文章操作快取
- (1) : 再tensquare-article的pom檔案中引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- (2) : 修改application.yml ,在spring節點下新增配置
redis:
host: 127.0.0.1
- (3) : 修改ArticleService 引入RedisTemplate,並修改findById方法
/**
* 根據ID查詢實體
* @param id
* @return
*/
public Article findById(String id) {
//查詢快取
Article article= (Article)redisTemplate.opsForValue().get("article_"+id);
if(article == null){
article = articleDao.findById(id).get();
//預設保留一天,這樣在查詢的時候,就會自動將文章放入快取
redisTemplate.opsForValue().set("article_"+id,article,1,TimeUnit.DAYS);
}
return article;
}
5.3.2 修改或刪除後清除快取
相關推薦
第二章-查詢與快取
第二章-查詢與快取
1. 基礎微服務條件查詢
1.1 標籤-條件查詢
POST /label/search 根據條件查詢城市列表
修改LabelService ,增加方法
/**
* 根據條件查詢
* @param
【HTTP權威指南】第二章-URL與資源
理想 還需要 端口號 劃分 說明 字符 span http權威指南 網關 【統一資源定位符URL】通過位置來標示資源,其表達的格式如下:https://item.jd.com/523961.html
第一部分(https)是方案,告知客戶端要【怎樣訪問】,這裏使用的是htt
Python學習系列-----第二章 操作符與表達式
2.4 學習 -- alt ges 操作符 bsp nbsp images 2.1 數學運算和賦值的簡便方法
例如:
2.2 優先級
在python中運算符有優先級之分,高優先級的運算符先執行,低優先級的運算符後執行。下面是運算符優先級:(
網路是怎樣連線的學習筆記-第二章-IP與乙太網的包收發操作(二)
2.5.3 生成包含接收方 IP 地址的 IP 頭部
IP頭部包含的內容
IP 模組接受 TCP 模組的委託負責包的收發工作,它會生成 IP 頭部並附加在 TCP 頭部前面。
IP 頭部包含的內容如表 2.2 所示,其中最重要的內容就是 IP 地址,它表示這個包應該發到哪裡去。
接受方IP地址:應用程
網絡是怎樣連接的學習筆記-第二章-IP與以太網的包收發操作(四)
出現 init 信號 height 這樣的 介質 操作系統 初始化 關於 2.5.9 向集線器發送網絡包
發送信號的半雙工和全雙工模式
加上報頭、起始幀分界符和 FCS 之後,我們就可以將包通過網線發送出去了。
發送信號的操作分為兩種,一種是使用集線器的半雙工模式,另一種是
網路是怎樣連線的學習筆記-第二章-IP與乙太網的包收發操作(四)
2.5.9 向集線器傳送網路包
傳送訊號的半雙工和全雙工模式
加上報頭、起始幀分界符和 FCS 之後,我們就可以將包通過網線傳送出去了。
傳送訊號的操作分為兩種,一種是使用集線器的半雙工模式,另一種是使用交換機的全雙工模式。
傳送和接收同時並行的方式叫作“全雙工”,相對地,某一時刻只能進行傳送或
第二章 表與指標Pro SQL Server Internal (Dmitri Korotkev)
聚合索引
聚集索引就是表中資料的物理順序,它是按照聚集索引分類的。表只能定義一個聚集索引。
如果你要在一個有資料的堆表中建立一個聚集索引,如2-5所示,第一步要做的就是SQL伺服器建立另一個根據聚集索引鍵分類的資料副本。資料頁連線到雙向連結串列,雙向連結串列的每一頁都包含指向下一頁
Spring——第二章 Spring與IoC(二)
2.2.7 Bean的生命週期
Spring 內的Bean物件從建立到銷燬,可控點很多。
2.2.8 <bean>的id與name 屬性
name對格式沒有限制,id有
2.3 基於XML的DI
2.3.1 注入分類
設值注入:
基本
Spring——第二章 Spring與IoC(三)
cirl + shift + F 格式化程式碼
2.3.6 使用內部Bean注入
<bean id="myStudent" class="com.bjpowernode.di10.Student">
<property name="name
第二章 集合與排序 3-1 對錶進行聚合排序
一、聚合函式
用於彙總的函式稱為聚合函式或者聚集函式。所謂聚合,就是將多行彙總為一行。
二、計算表中資料的行數(COUNT()函式)
1、計算全部資料的行數。
SELECT COUNT(*)
FROM Product;
2、計算NULL之外的資料的行數
將包含NULL值的列作為引數時,輸出的結果為非空的行
python 第二章 物件與型別
可變物件和不可變物件
1,可變物件,list(列表),dict(字典),集合(set),位元組陣列。
2,不可變物件,數值型別,字串,位元組串,元組(具體形式 ())。
注意條件:可變和不可變指的是該物件指向的記憶體是否可以改變。當修改不可變物件的時候,它會重新複製一份
2018年12月20日;第二章變數與資料型別及運算子
本次課程所有的編譯程式下載地址:
連結:https://pan.baidu.com/s/1bVTquFh4yaOPZjQGQpn15A 提取碼:482t 複製這段內容後開啟百度網盤手機App,操作更方便哦
一、作業
1、商場為員工提供了基本工資、物價津貼及房租津貼。其中,物價津貼為基本工資的40%,房租
第十三章 查詢與排序
13.1 Java類庫中的查詢與排序
(1) ArrayList或者LinkedList物件,可以呼叫它的indexOf方法來進行查詢. 該方法通過檢查列表中的每一個元素來查詢目標值, 列表如果含有所要查詢的資料, 它將返回第一個符合條件的資料的索引值,否則返回-1.
index
浙江中醫藥大學-《資料結構》(C語言版)-第一章-第二章概念與程式碼
ZCMU-Data Structure(C language)
Part 1 Exordium
1、Data:能夠輸入到計算機中並被計算機程式處理的符號的總稱。
2、Data Element:資料的基本單位,資料元素用以完整的描述一個物件。
3、Data Item:組成資料
Python學習系列-----第二章 操作符與表示式
2.1 數學運算和賦值的簡便方法
例如:
2.2 優先順序
在python中運算子有優先順序之分,高優先順序的運算子先執行,低優先順序的運算子後執行。下面是運算子優先順序:(同一行的運算子具有相同的優先順序)
2.3 改變優先
《Hadoop生態》——第二章 資料庫與資料管理——Accumulo
Accumulo
許可證: Apache License, Version 2.0
活躍度: 高
目的: 帶有單元級安全的Name-value資料庫
官方地址:
Hadoop整合: 完全整合
你有這麼一個應用,它可以很好
《現代作業系統(中文第三版)》課後習題——第二章 程序與執行緒
第二章 程序和執行緒
1、圖2-2中給出了三個程序狀態,在理論上,三個狀態可以有六種轉換,每個狀態兩個。但是,圖中只給出了四種轉換。有沒有可能發生其他兩種轉換中的一個或兩個?
答:從阻塞到執行的轉換是可以想象的。假設某個程序在I/O上阻塞,而且I/O結束,如果此時CPU空
第二章 檢視與檢視控制器
2.1 Window-你的工作平臺
2.1.1 視窗、
2.1.2 視窗與檢視
2.2 檢視簡介
2.2.1 檢視基本概念
2.2.2 檢視與介面控制元件的關係
2.2.3 檢視的frame和bounds
2.2.4 新增與刪除子檢視
2.3 UIKit
自考(2017年版)《作業系統》——第二章思考與練習題參考答案(自做)
1.請簡述處理器的組成和工作原理。你認為哪些部分和作業系統密切相關,為什麼?
答:處理器一般由運算器、控制器、一系列的暫存器以及快取記憶體構成。其中,運算器實現指令中的算術和邏輯運算,是計算機的核心。控制器負責控制長征執行的流程。暫存器是一種暫時儲存器件,用於
HTTP 權威指南 第二章 URL 與資源
機制 應用程序 之間 轉義 mailto amp 路徑 path 內容 前言
這一章節講述了關於 URL 的相關知識,主要包括下面的內容:
URL 語法
URL 快捷方式
URL 編碼與字符規則
常見的 URL 方案
URL 的未來—&mdash