基本制度
作為第一步,我們將構建一個基本的 Web 伺服器,用於在 MongoDB 中儲存資料。對於此演示,我們將其命名為快速庫。伺服器將有兩個基本操作:
POST /book
:此端點將接收書籍的標題,作者和內容,並在資料庫中建立書籍條目。
GET /book/ {title}
:此端點將獲得標題並返回其內容。我們假設標題唯一地識別書籍(因此,將不會有兩本書具有相同的標題)。當然,更好的選擇是使用 ID。但是,為了簡單起見,我們只需使用標題即可。
這是一個簡單的圖書館系統,但我們稍後會新增更多高階功能。
現在,讓我們使用 Spring Tool Suite(使用 eclipse 構建)和 spring starter Project 建立專案
http://i.stack.imgur.com/WS90q.jpg
我們正在使用 Java 構建我們的專案並構建我們正在使用 maven,選擇值並單擊下一步
http://i.stack.imgur.com/qufTj.jpg
從 Web 模組中選擇 NOSQL 中的 MongoDB,Redis 和 Web,然後單擊完成。我們使用 Lombok 自動生成 Setter 和模型值的 getter,因此我們需要將 Lombok 依賴項新增到 POM
http://i.stack.imgur.com/NQkCE.jpg http://i.stack.imgur.com/Lao11.jpg
MongoDbRedisCacheApplication.java 包含用於執行 Spring Boot Application add 的 main 方法
使用 @Data 建立包含 id,書名,作者,描述和註釋的模型類 Book,以從 jar 專案 lombok 生成自動 setter 和 getter
package com.example;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import lombok.Data;
@Data
public class Book {
@Id
private String id;
@Indexed
private String title;
private String author;
private String description;
}
Spring Data 會自動為我們建立所有基本的 CRUD 操作,所以讓我們建立 BookRepository.Java,它按標題查詢書籍並刪除書籍
package com.example;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface BookRepository extends MongoRepository<Book, String>
{
Book findByTitle(String title);
void delete(String title);
}
讓我們建立 webservicesController,它將資料儲存到 MongoDB 並通過 idTitle(@PathVariable String title)檢索資料。
package com.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WebServicesController {
@Autowired
BookRepository repository;
@Autowired
MongoTemplate mongoTemplate;
@RequestMapping(value = "/book", method = RequestMethod.POST)
public Book saveBook(Book book)
{
return repository.save(book);
}
@RequestMapping(value = "/book/{title}", method = RequestMethod.GET)
public Book findBookByTitle(@PathVariable String title)
{
Book insertedBook = repository.findByTitle(title);
return insertedBook;
}
}
新增快取到目前為止,我們已經建立了一個基本的庫 Web 服務,但它並不是驚人的快速。在本節中,我們將嘗試通過快取結果來優化 findBookByTitle()
方法。
為了更好地瞭解我們將如何實現這一目標,讓我們回到坐在傳統圖書館中的人們的榜樣。讓我們說他們想要找到具有一定頭銜的書。首先,他們會環顧四周,看看他們是否已將它帶到那裡。如果他們有,那太好了! 他們只是在快取中找到一個專案。如果他們沒有找到它,他們有一個快取未命中,這意味著他們沒有在快取中找到該專案。如果缺少專案,他們將不得不在圖書館中查詢該書。當他們找到它時,他們會把它放在桌子上或插入快取中。
在我們的示例中,我們將對 findBookByTitle()
方法遵循完全相同的演算法。當被要求提供具有特定標題的書時,我們將在快取中查詢它。如果沒有找到,我們將在主儲存器中查詢它,即我們的 MongoDB 資料庫。
使用 Redis
將 spring-boot-data-redis 新增到我們的類路徑將允許 spring boot 執行其魔力。它將通過自動配置建立所有必要的操作
現在讓我們用下面的行來註釋方法來快取,讓 spring boot 發揮其魔力
@Cacheable (value = "book", key = "#title")
要在刪除記錄時從快取中刪除,只需在 BookRepository 中用下面的行註釋,讓 Spring Boot 為我們處理快取刪除。
@CacheEvict (value = "book", key = "#title")
要更新資料,我們需要在方法下面新增一行,然後讓 spring boot 處理
@CachePut(value = "book", key = "#title")
你可以在 GitHub 上找到完整的專案程式碼