学习

Spring 和 Redis:准备就绪

Brian Sam-Bodden
作者
Brian Sam-Bodden Redis 开发者布道师

目标#

创建课程 Spring Boot 应用的骨架,配置所有依赖项并启动为课程配置好的 Redis 实例。

议程#

在本课程中,你将学习

  • 如何创建和配置 Spring Boot 应用以使用 Redis
  • 如何将 docker-compose 文件作为 Git 子模块添加到应用中以配置和运行 Redis
  • 如何添加一个 Git 子模块,其中包含应用的示例原始数据
  • 如何启动适合本课程的 Redis 实例

如果你遇到困难

从零开始创建 Spring Boot 应用骨架!#

如果你想从一个完全配置好的 Spring Boot 应用开始,并希望跳过“从零开始”的部分,请跳到“快速入门”部分。

  1. 1.在浏览器中,启动 Spring Initilizr
  2. 2.使用以下设置填写表格:
  • 项目:Maven Project
  • 语言:Java
  • Spring Boot:2.4.4
  • 项目元数据:
    • 组: com.redislabs.edu
    • Artifact: redi2read
    • 名称: redi2read
    • 描述:由 Redis 支持的书店 Web 服务
    • 包名: com.redislabs.edu.redi2read
    • 打包:JAR
    • Java:11
  • 依赖项:
    • Spring Web
    • Spring Data Redis (Access + Driver)
    • Spring Security
    • Lombok
    • Spring Boot DevTools

另外,你可以使用以下 URL:http://bit.ly/spring-initlz-redi2read 来启动为本项目完全配置好的 Spring Initilizr。点击 GENERATE,Initializr 将为项目生成 zip 文件并提示你将其下载到本地机器。解压缩下载的文件(名为 redi2read.zip)到合适的目录。例如,在 Mac 上:

cd ~/my-directory
unzip ~/Downloads/redi2read.zip

添加 redismod docker compose Git 子模块#

现在你已经下载并解压缩了生成的 Spring Initializr 应用,请切换到应用目录 (./redi2read) 并检查其内容。

你应该会得到一个完整的基于 Maven 的 Spring Boot 应用。由于我们要添加子模块,我们先将应用放入 Git 仓库:

echo "# redi2read" >> README.md
git init
git commit --allow-empty -m "git: initial empty commit"
git add README.md
git commit -m "feat: spring boot + redis initializr app"
git branch -M main

在前面的代码块中,我们在 redi2read 应用目录中初始化了一个 Git 仓库。添加一个空的 Git 提交有助于将来的 Git rebase 操作。

现在我们有了一个基本的 Spring 应用,我们需要为我们的应用配置一个 Redis 实例。我们在一个 Git 仓库中创建了一个 docker-compose 文件,你可以将其作为子模块添加到你的应用中。

Git 子模块,如果你还没有接触过,是一种将 Git 仓库嵌套在另一个 Git 仓库中的方式。阅读 Git 关于子模块的文档以了解更多信息。

你会在 redismod-docker-compose 仓库中找到这个文件,该仓库托管在 Github 的 redis-developer 组织下。该仓库包含一个配置为使用 Redis “redismod” 镜像的 Docker Compose 文件,该镜像是一个包含支持 JSON、搜索、图、时间序列、触发器和函数以及概率数据结构的 Redis 构建的 Docker 镜像。

容器中包含的模块

  • Search:功能齐全的搜索引擎
  • Graph:图数据库
  • Time Series:时间序列数据库
  • JSON:原生 JSON 数据类型
  • Probabilistic:原生 Bloom 和 Cuckoo Filter 数据类型
  • Triggers and Functions:动态执行框架

要添加子模块,我们在项目根目录使用 git submodule 命令:

git submodule add [email protected]:redis-developer/redismod-docker-compose.git docker

该命令将传入仓库的内容添加到名为“docker”的文件夹下,该文件夹将由命令创建。此时,你可以提交对仓库所做的更改。

添加 redi2read-data git 子模块#

应用的示例数据也以单独的 Git 仓库提供,我们将它添加到主仓库:redi2read-data。应用的原始数据包含一系列 JSON 文档,表示书籍和用户。

书籍

书籍数据的 JSON 文档集合来自 https://developers.google.com/books。每个文件都标有用于构建它的关键字/类别和一个递增的整数(某些类别的书籍多于其他类别),生成的 JSON 示例如下:

{
  "pageCount":304,
  "thumbnail":"http:\/\/books.google.com\/books\/content?id=prtSDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api",
  "price":42.99,
  "subtitle":null,
  "description":"Drowning in unnecessary complexity, unmanaged state, and tangles of spaghetti code? In the best tradition of Lisp, Clojure gets out of your way so you can focus on expressing simple solutions to hard problems.",
  "language":"en",
  "currency":"USD",
  "id":"1680505726",
  "title":"Programming Clojure",
  "infoLink":"https:\/\/play.google.com\/store\/books\/details?id=prtSDwAAQBAJ&source=gbs_api",
  "authors":[
    "Alex Miller",
    "Stuart Halloway",
    "Aaron Bedra"
  ]
}

我们有一个 ID(书籍 ISBN)、标题、副标题、描述、页数、价格、货币、语言、缩略图 URL、更多信息的链接(“infoLink”字段)以及作者数组。

用户

用户数据是使用 https://randomuser.me 随机创建的,生成的 JSON 示例如下:

{
  "password": "9yNvIO4GLBdboI",
  "name": "Georgia Spencer",
  "id": -5035019007718357598,
  "email": "[email protected]"
}

要添加子模块,请使用以下命令:

git submodule add [email protected]:redis-developer/redi2read-data.git src/main/resources/data

此子模块将加载到应用文件夹下的 src/main/resource/data 文件夹下,以便于从类路径加载数据。此时,你可以将目前为止的工作提交到 Git 仓库。

快速入门(赶时间者)#

要跳过上述所有步骤(例如,初始化 Spring 应用、添加数据子模块等),只需使用 --recurse-submodules 选项克隆应用,并检出分支 course/milestone-1

git clone --branch course/milestone-1 [email protected]:redis-developer/redi2read.git --recurse-submodule

启动和测试 Redis#

让我们打开一个终端窗口,切换到项目仓库下的 /docker 目录。要启动我们的 Docker Redis 镜像,我们将使用 docker-compose 命令,如下所示:

docker-compose up

你应该看到类似的输出:

Creating network "redi2read_default" with the default driver
Creating redi2read_redis_1 ... done
Attaching to redi2read_redis_1
redis_1  | 1:C 01 Apr 2021 05:19:27.593 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 01 Apr 2021 05:19:27.593 # Redis version=6.0.1, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 01 Apr 2021 05:19:27.593 # Configuration loaded
redis_1  | 1:M 01 Apr 2021 05:19:27.600 * Running mode=standalone, port=6379.
...

使用 Redis CLI#

redis-cli 是 Redis 命令行界面,一个简单的程序,允许你直接从终端向 Redis 发送命令并读取服务器发送的回复。

在容器中启动 Redis CLI

使用 docker container ls 查找容器名称:

$ docker container ls
CONTAINER ID   IMAGE                COMMAND                  CREATED          STATUS         PORTS                    NAMES
0f99ea35b9c1   redislabs/redismod   "redis-server --load…"   57 minutes ago   Up 7 minutes   0.0.0.0:6379->6379/tcp   docker_redis_1

有了名称 docker_redis_1,我们就可以在容器中运行 bash,然后启动 redis-cli:

$ docker exec -it docker_redis_1 bash
root@0f99ea35b9c1:/data# redis-cli
127.0.0.1:6379>

在本地启动 Redis CLI​

如果你已经在本地安装了 Redis CLI,只需输入以下命令即可启动它:

$ redis-cli
127.0.0.1:6379>

测试我们的 Redis 实例#

最基本的命令 PING 用于“ping”服务器。如果我们收到回复,就知道 Redis 服务器正在运行:

127.0.0.1:6379> PING
PONG
127.0.0.1:6379> PING Marco!
"Marco!"
127.0.0.1:6379>

检查已安装的 Redis 模块​

由于我们有一个包含多个 Redis 模块的自定义 Redis 实例,我们可以检查安装了哪些模块:

127.0.0.1:6379> MODULE LIST
1) 1) "name"
   2) "search"
   3) "ver"
   4) (integer) 20006
2) 1) "name"
   2) "graph"
   3) "ver"
   4) (integer) 20215
3) 1) "name"
   2) "ReJSON"
   3) "ver"
   4) (integer) 10007
4) 1) "name"
   2) "bf"
   3) "ver"
   4) (integer) 20205
5) 1) "name"
   2) "timeseries"
   3) "ver"
   4) (integer) 10408
6) 1) "name"
   2) "ai"
   3) "ver"
   4) (integer) 10002
7) 1) "name"
   2) "rg"
   3) "ver"
   4) (integer) 10006

熟悉 Redis 命令#

键是唯一标识符,其值可以是 Redis 支持的任何数据类型。这些数据类型范围从简单的字符串到列表、集合,甚至流。每种数据类型都有其自身的相关行为和命令集。

127.0.0.1:6379> SET myname "Brian"
OK
127.0.0.1:6379> GET myname
"Brian"
127.0.0.1:6379> TYPE myname
string

Redis 数据库中的键分布在一个扁平的键空间中。Redis 不强制执行键的模式或命名策略。这提供了极大的灵活性,键空间的组织由开发者负责。我们将在本课程的稍后部分探讨管理这一点的方法。Redis 以其极快的速度而闻名。这种速度源于它将所有数据存储在 RAM 中而非磁盘上并从中提供服务。Redis 是持久的,因此你的数据将得到持久化,但所有读取都将来自保存在 RAM 中的数据副本。这使得 Redis 成为需要实时数据访问的应用的绝佳选择。

外部资源#

以下是一些在我们看来对你探索 Redis 会有用的资源:

  • redis.io - 开源 Redis 的官方网站。
  • Redis Cloud - Redis 提供的全托管云服务,包含免费计划供您开始使用。
  • 官方 Redis Docker 镜像
  • 要全面了解 Redis,我们建议您参加 Redis 大学提供的 RU101:Redis 数据结构简介 课程。在这个免费的在线课程中,您将学习 Redis 的数据结构,并了解如何在实际中应用它们。