学习

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 项目
  • 语言:Java
  • Spring Boot:2.4.4
  • 项目元数据:
    • 组:com.redislabs.edu
    • 工件:redi2read
    • 名称:redi2read
    • 描述:由 Redis 支持的书店 Web 服务
    • 包名称:com.redislabs.edu.redi2read
    • 打包:JAR
    • Java:11
  • 依赖项:
    • Spring Web
    • String Data Redis(访问 + 驱动程序)
    • Spring Security
    • Lombok
    • Spring Boot DevTools

或者,您可以使用以下 URL:https://bit.ly/spring-initlz-redi2read 启动完全为项目配置的 Spring Initilizr。单击生成,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 变基操作。

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

如果您还没有遇到 Git 子模块,它们是将 git 存储库嵌套在另一个 git 存储库中的方法。阅读 Git 子模块的 Git 文档 以了解更多信息。

您将在 redismod-docker-compose 存储库中找到此文件,该文件托管在 redis-developer 组织的 Github 中。该存储库包含一个 Docker Compose 文件,该文件配置为使用 Redis “redismod” 映像,该映像是包含 Redis 的 Docker 映像,该映像内置了对 JSON、Search、Graph、Time Series、Triggers 和 Functions 以及概率数据结构的支持。

容器中包含的模块

  • 搜索:一个功能齐全的搜索引擎
  • :一个图数据库
  • 时间序列:一个时间序列数据库
  • JSON:一个本机 JSON 数据类型
  • 概率:本机 Bloom 和 Cuckoo Filter 数据类型
  • 触发器和函数:一个动态执行框架

要添加子模块,请在项目根目录中使用 git submodule 命令

git submodule add git@github.com:redis-developer/redismod-docker-compose.git docker

该命令将在名为“docker”的文件夹下添加传递的存储库的内容,该命令将创建该文件夹。此时,您可以提交对存储库所做的更改。

添加 redi2read-data git 子模块#

应用程序的示例数据也作为单独的 Git 存储库提供,我们将将其添加到我们的主存储库中:redi2read-data。应用程序的原始数据包含一系列 JSON 文档,代表书籍和用户。

书籍

书籍数据的 JSON 文档集合来自 https://books.googleapis.com. 每个文件都用用于构建它的关键字/类别和递增整数(某些类别比其他类别拥有更多书籍)进行标记,从而生成类似 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": "georgia.spencer@example.com"
}

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

git submodule add git@github.com: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 git@github.com: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 命令行界面 redis-cli 是一个简单的程序,它允许您直接从终端向 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 云 - 来自 Redis 的完全托管的云服务,提供免费计划供您入门。
  • Redis 的官方 Redis Docker 镜像.
  • 对于 Redis 的全面介绍,我们建议您查看 Redis 大学的 RU101:Redis 数据结构简介 课程。在本免费在线课程中,您将了解 Redis 中的数据结构,并将看到如何在现实世界中实际应用它们。