基本制度

作為第一步,我們將構建一個基本的 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 上找到完整的專案程式碼