使用Docker运行Redis,并从ioredis进行连接
Redis是什么?
这是一个开源的键值型数据库。它支持多种数据结构。由于其高性能,非常受欢迎。
这次我们尝试使用Docker搭建它,然后从另一个容器中连接并进行操作。
首先,我们试试站起来。
公式提供了一种图像。
尝试使用以下的docker-compose.yml文件来创建容器。
version: '3.7'
services:
redis:
image: redis
ports:
- 6379:6379
用这个创建容器。
docker compose up
让我们尝试通过终端操作数据。
尝试连接创建的终端。
docker exec -it <作成したコンテナid> bash
使用 redis-cli 查看内部。
redis-cli
让我们来试试操作数据。使用 “set key value” 将值存入。
127.0.0.1:6379> set test-key test-value
OK
使用keys *可以获取所有的键,使用set key value可以查看键对应的值。
127.0.0.1:6379> keys *
1) "test-key"
127.0.0.1:6379> get test-key
"test-value"
可以使用 del 键来删除键的值。
127.0.0.1:6379> del test-key
(integer) 1
127.0.0.1:6379> keys *
(empty array)
操作可以像这样执行。命令还有其他许多种类,如下所示↓。
从另一个容器进行操作试试看
使用ioredis从另一个容器连接到Redis并进行操作。
修改docker-compose.yml文件。
version: '3.7'
services:
redis:
image: redis
volumes:
- ./redis/data:/data
ports:
- 6379:6379
app:
image: node
volumes:
- ./app:/app
depends_on:
- redis
ports:
- 3000:3000
tty: true
working_dir: "/app"
command: bash -c "npm run start"
-
- redisとappの二つのコンテナを作成する。
docker-compose.ymlを置いたディレクトリに、appディレクトリとredisディレクトリを作成する。
volumes:でその中身をコピーする。
appへの接続はポート3000で行い、そこからredisへの接続はポート6379で行う。
在应用程序中运行`npm init -y`。在这里创建以下文件`index.ts`。
import express from "express";
import Redis from "ioredis";
const app = express();
const port = 3000;
const redisPort = 6379;
const redis = new Redis(redisPort, "redis")
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.post("/posts", async(req, res) => {
await redis.set(req.body.id, req.body.name);
return res.send(req.body);
})
app.get("/gets", async(req, res) => {
const name = await redis.get(<string>req.query.id);
return res.send(name);
})
app.listen(port, () => console.log(`SERVER started on localhost:${port}`));
使用redis.set(req.body.id, req.body.name)将收到的信息在posts中进行注册,
使用redis.get(req.query.id)从指定的id中获取值并返回。
请在package.json文件中设置以下脚本。
"scripts": {
"start": "npx ts-node index.ts"
}
在容器运行时,通过bash -c “npm run start”来执行这个命令。
如果能够成功地发送POST请求到localhost:3000/posts和localhost:3000/gets,并且能够正确地获取到数据,那就算是成功了。
哈希类型的数据结构
尝试使用其他数据结构。先删除之前的数据。
flushall
尝试使用哈希数据结构。
在这里,可以通过键(key)和字段(field)的方式来注册信息。可以像关系型数据库(RDB)一样使用。
HSET key field value
HGET key field
将index.ts重写为以下方式。
import express from "express";
import Redis from "ioredis";
const app = express();
const port = 3000;
const redisPort = 6379;
const redis = new Redis(redisPort, "redis")
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.post("/posts", async(req, res) => {
await redis.hset(<string>req.body.id, <string>req.body.field, <string>req.body.value);
return res.send(req.body);
})
app.get("/gets", async(req, res) => {
const value = await redis.hget(<string>req.query.id, <string>req.query.field);
return res.send(value);
})
app.listen(port, () => console.log(`SERVER started on localhost:${port}`));
只需要从id和field两个选项中进行注册和获取就可以了。
除此之外,还存在着列表类型等数据结构。
试试使用发布/订阅模式
我们可以使用Redis的pubsub功能来实现消息传递。让我们试试看。
在之前的index.ts中添加以下内容。
redis.on("message", (channel, msg) =>{
console.log("getMessage");
console.log({channel});
console.log({msg});
});
redis.subscribe("pubsubMessage");
-
- redisがmessageイベントを受け取ったとき、その内容を出力する。
- redisが”pubsubMessage”チャンネルをsubscribeすることを登録する。
在保持此状态的情况下,现在尝试从命令行敲击此通道。访问Redis容器的终端并执行以下操作。
redis-cli
从这里开始,按照以下方式发送消息。
publish pubsubMessage "test"
如果您能够在之前运行的index.ts文件的输出中接收到这个内容,那就可以了。
请参考