我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Nodejs 实现一个简单的 Redis客户端(推荐)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用Nodejs 实现一个简单的 Redis客户端(推荐)

0. 写在前面

大家如果有去看过nodejs所支持的官方库的话,应该会惊讶于它所提供了非常完善的网络库,不仅是应用层,传输层,等等基础的协议,我们可以按照事件驱动的逻辑编写清晰易懂的网络应用,网络服务。这也是本文为什么选择Nodejs编写的原因。

1. 背景映入

大家在使用一些数据库软件的时候常常会使用远程连接

mysql -h xxx.xxx.xxx.xx -u xzzz -p

这里也指明了ip地址,但是很明显这里可不是http协议在服务,而是更加底层的协议 - 传输层协议,具体来说是TCP协议(Transmission Control Protocol)。通信的示意图如下:

所以很自然的想到,数据库的客户端一定经过如下流程,从而与远程相连接:

graph TB身份验证 --> 运输层连接建立运输层连接建立 --> 客户端服务端输入输出绑定_通道客户端服务端输入输出绑定_通道 --> 连接中断连接中断 --> 双方退出释放资源

所以我们可以尝试向服务端发送这样的请求消息,建立与服务端的连接,发送一些数据,接受一些数据,最后断开连接。

2. 数据库选择

这里为了简单起见,我们考虑不需要身份验证的redis数据库来作为此次实验的服务端。
如果大家是mac,或者linux倒是可以直接安装,如果是windows的话,推荐使用docker进行安装,这里给出一行docker命令。

docker run  --name redis-server -p 6379:6379 -d redis:latest

3. Nodejs TCP连接

在nodejs中支持TCP连接的是net模块, 其中使用createConnection(config)或者直接new Socket(config)来初始化一个TCP连接。
上面两个函数不论哪一个都会返回socket实例,如果连接正常的话,就可以通过这个socket发送消息了。

当服务端redis接收到消息之后也会返回相应的消息,在本机客户端通过对数据的校验,检查后,触发相应的操作(是拒绝还是接受服务端的响应)。

4. 代码编写

知道了原理之后,我这里直接把代码贴出来

  • RedisSocket: 继承自Socket
class RedisSocket extends Socket {
    constructor(config: RedisClientConfig) {
        super();
        this.connect(config.port, config.host);
    }
	// Set
    public set(key: string, value: string | number): Promise<Buffer> {
        return new Promise((resolve, reject) => {
            this.write(`SET ${key} ${value}\n`);
            const fetchAns = (chunk: Buffer) => {
                if (chunk.toString().includes("OK")) {
                    resolve(chunk);
                    this.off("data", fetchAns);
					// 在交付完成之后使用off 把函数取消绑定
                } else {
                    reject("error! can't set data");
                }
            }
            this.on("data", fetchAns);
        })
    }
	// Get
    public get(key: string): Promise<Buffer> {
        return new Promise((resolve, reject) => {
            try {
                this.write(`GET ${key}\n`);
                const fetchAns = (chunk: Buffer) => {
                    resolve(chunk);
                    this.off("data", fetchAns);
					// 在交付完成之后使用off 把函数取消绑定
                }
                this.on("data", fetchAns);
            } catch(err) {
                reject(err);
            }
        })
    }
	// 断开TCP
    public close() {
        this.end();
    }
}

这个类将用来处理建立好后的连接的

  • RedisClient
class RedisClient {
    private config: RedisClientConfig;
    constructor(config: RedisClientConfig) {
        this.config = config; // 配置项
    }

	// 获取redis实例
    getConnection(): Promise<RedisSocket> {
        return new Promise((resolve, reject) => {
            const socket = new RedisSocket(this.config);

            socket.on("connect", () => {
                resolve(socket);
            });

            socket.on("error", (err) => {
                reject(err);
            });
        });
    }
}

这个类用来建立与服务端的连接,使用getConnection()方法,将会交付一个redisSocket,使用这个Socket可以直接向server发送和接受数据。

5. 实验

import { RedisClient, RedisSocket } from "./class="lazy" data-src/Client";


const Redis = new RedisClient({
    host: "localhost",
    port: 6379
});


Redis.getConnection().then((socket: RedisSocket) => {
    socket.set("Mushroom", "Cookie");
    socket.set("Mici", "Icmi").then( () => {
        socket.get("Mushroom").then((data: Buffer) => {
            console.log(data.toString());
            socket.close();
        })
    });
})

这里使用RedisClient建立与本地redis的连接,随后通过getConnection()获取到连接实例,并通过这个连接实例设置了两个数据,以及获取了一数据并打印了出来。

> pnpm dev
> $6 // 这里的$6你也许会感到奇怪,不过我们很快就会知道这是什么
> Cookie

6. wireshark 抓包分析

这一次请求就是一整个完整的TCP流程,
在这其中TCP保证数据的可靠传输,而RESP(REdis Serialization Protocol)把数据封装成一个fragment段,发送到下面的TCP
服务端相应的时候也是如此,会把数据封装起来发送到TCP中转发出去。

看看发送方的RESP

看看响应的RESP

所以知道了吗?没错,6其实就是长度那一部分强行转化为字符串的结果,所以在现在很多流行的redis客户端中如ioredis都对RESP报文做了非常完备的解析,这使得开发者能够非常丝滑的与redis服务端交互。(感谢这些开发者做的一切!)

7. 杂与代码

Github 仓库

到此这篇关于用Nodejs 实现一个简单的 Redis客户端的文章就介绍到这了,更多相关Nodejs实现Redis客户端内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Nodejs 实现一个简单的 Redis客户端(推荐)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Nodejs 实现一个简单的 Redis客户端(推荐)

在nodejs中支持TCP连接的是net模块, 其中使用createConnection(config)或者直接new Socket(config)来初始化一个TCP连接,这篇文章主要介绍了用Nodejs 实现一个简单的 Redis客户端,需要的朋友可以参考下
2022-11-13

Nodejs实现的一个简单udp广播服务器、客户端

nodejs发送udp广播还是蛮简单的,我们先写个服务器用于接收广播数据,代码如下:var dgram = require("dgram"); var server = dgram.createSocket("udp4"); server.
2022-06-04

如何利用C++实现一个简单的邮件客户端程序?

如何利用C++实现一个简单的邮件客户端程序?随着互联网的快速发展,电子邮件已经成为人们日常生活中必不可少的一部分。作为一名程序员,掌握如何利用C++语言来实现一个简单的邮件客户端程序无疑是非常重要的。本文将以1500个字以内的篇幅,介绍如何
如何利用C++实现一个简单的邮件客户端程序?
2023-11-04

如何使用MySQL和Java实现一个简单的电影推荐功能

如何使用MySQL和Java实现一个简单的电影推荐功能近年来,随着互联网和大数据的普及,电影推荐功能成为很多影视平台的重要组成部分。通过分析用户的喜好和行为,可以精准地推荐给用户适合的电影,提升用户体验和平台的活跃度。本文将介绍如何使用My
2023-10-22

怎么在java中使用SocketChannel实现一个客户端

怎么在java中使用SocketChannel实现一个客户端?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。常用的java框架有哪些1.SpringMVC,Spr
2023-06-14

如何使用PHP实现一个简单的博客2.0版本

概述:在互联网时代,博客已经成为一种非常流行的表达方式和记录生活的工具。在开发一个博客应用程序时,PHP是一种常用的服务器端脚本语言,它可以用来处理用户请求、生成动态页面以及与数据库交互等。本文将介绍如何使用PHP来实现一个简单的博客2.0
2023-10-21

怎么使用nodejs实现一个简单的网页爬虫功能

这篇文章主要介绍了怎么使用nodejs实现一个简单的网页爬虫功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。网页源码  使用http.get()方法获取网页源码,以hao1
2023-06-06

如何使用MySQL和Python实现一个简单的博客系统

MySQL和Python简单博客系统本教程提供了逐步说明,指导你使用MySQL数据库和Python脚本创建一个简单的博客系统。包含步骤:数据库设计:创建两个表(posts和users)存储博客数据。Python脚本:涵盖建立数据库连接,执行查询(添加、获取、更新和删除帖子),以及创建和验证用户。此系统提供了访问和操作博客数据的基本功能,适合初学者或希望构建简单博客应用程序的开发人员。
如何使用MySQL和Python实现一个简单的博客系统
2024-04-09

如何使用MySQL和Python实现一个简单的博客系统

要使用MySQL和Python实现一个简单的博客系统,可以按照以下步骤进行:1. 安装MySQL数据库和Python的MySQL库:首先在你的机器上安装MySQL数据库,并且安装Python的MySQL库,可以使用pip install m
2023-10-20

怎么在C#中使用MJPEG实现一个客户端功能

怎么在C#中使用MJPEG实现一个客户端功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。环境:服务端MJPEG服务器使用的是手机的DroidCam,很方便的一个MJPEG服务
2023-06-06

Unity使用webSocket与服务器通信(一)搭建一个简单地服务器和客户端

你想在unity WebGL里面使用TCP通信吗,那么你可以用一用webSocket。当然,桌面端也可以使用webSocket,这样Unity多平台发布的时候,业务层的通信代码可以使用一套,而不是桌面用socket,网页用http… 一、什
2023-08-19

怎么使用java和redis实现一个简单的热搜功能

这篇文章主要介绍“怎么使用java和redis实现一个简单的热搜功能”,在日常操作中,相信很多人在怎么使用java和redis实现一个简单的热搜功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用jav
2023-06-29

如何使用MySQL和Ruby on Rails开发一个简单的音乐推荐功能

要使用MySQL和Ruby on Rails开发一个简单的音乐推荐功能,你可以按照以下步骤进行操作:1. 配置项目:创建一个新的Ruby on Rails项目,并确保你的项目已经设置好使用MySQL数据库。你可以在config/databa
2023-10-20

使用python实现一个简单的图片爬虫

本教程详细介绍使用Python编写图片爬虫的步骤:导入库(requests、BeautifulSoup)获取目标网站的HTML代码解析HTML提取图像URL下载图像处理错误优化建议:并行下载图像使用线程池使用缓存示例脚本可从特定网站爬取特定类型的图像。最佳实践:遵守机器人协议限制爬虫速率避免下载受版权保护的图像获得必要授权
使用python实现一个简单的图片爬虫
2024-04-02

使用Python实现一个简单的接口服务

使用Python实现一个简单的接口服务,可以通过get、post方法请求该接口,拿到响应数据。创建一个api_server.py文件,添加代码如下:import flask, jsonfrom flask import request'''
2023-01-31

编程热搜

目录