使用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文件的输出中接收到这个内容,那就可以了。

请参考

 

广告
将在 10 秒后关闭
bannerAds