创建课程 Spring Boot 应用的骨架,配置所有依赖项并启动为课程配置好的 Redis 实例。
在本课程中,你将学习
如果你遇到困难
如果你想从一个完全配置好的 Spring Boot 应用开始,并希望跳过“从零开始”的部分,请跳到“快速入门”部分。
com.redislabs.edu
redi2read
redi2read
com.redislabs.edu.redi2read
另外,你可以使用以下 URL:http://bit.ly/spring-initlz-redi2read 来启动为本项目完全配置好的 Spring Initilizr。点击 GENERATE,Initializr 将为项目生成 zip 文件并提示你将其下载到本地机器。解压缩下载的文件(名为 redi2read.zip
)到合适的目录。例如,在 Mac 上:
cd ~/my-directory
unzip ~/Downloads/redi2read.zip
现在你已经下载并解压缩了生成的 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 镜像。
容器中包含的模块
要添加子模块,我们在项目根目录使用 git submodule 命令:
git submodule add [email protected]:redis-developer/redismod-docker-compose.git docker
该命令将传入仓库的内容添加到名为“docker”的文件夹下,该文件夹将由命令创建。此时,你可以提交对仓库所做的更改。
应用的示例数据也以单独的 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
让我们打开一个终端窗口,切换到项目仓库下的 /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 命令行界面,一个简单的程序,允许你直接从终端向 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>
最基本的命令 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 支持的任何数据类型。这些数据类型范围从简单的字符串到列表、集合,甚至流。每种数据类型都有其自身的相关行为和命令集。
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 会有用的资源: