基本制度

作为第一步,我们将构建一个基本的 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 上找到完整的项目代码