node-redis 是一个现代化、高性能的 Node.js Redis 客户端。
名称 | 描述 |
---|---|
redis | |
@redis/client | |
@redis/bloom | |
@redis/graph | |
@redis/json | |
@redis/search | |
@redis/time-series |
:warning: 在 4.1.0 版本中,我们将子包从
@node-redis
移动到了@redis
。如果你只是使用npm install redis
,你不需要做任何改变——它会自动升级。如果你直接使用子包,你需要指向新的作用域(例如使用@redis/client
而不是@node-redis/client
)。
通过 docker 启动 redis:
docker run -p 6379:6379 -it redis/redis-stack-server:latest
要安装 node-redis,只需:
npm install redis
:warning: 新接口简洁酷炫,但如果你有现有的代码库,你可能需要阅读迁移指南。
寻找处理对象映射的高级库?请参见 redis-om-node!
import { createClient } from 'redis'; const client = await createClient() .on('error', err => console.log('Redis 客户端错误', err)) .connect(); await client.set('key', 'value'); const value = await client.get('key'); await client.disconnect();
上述代码连接到本地主机的 6379 端口。要连接到不同的 主机或端口,请使用格式为 redis[s]://[[username][:password]@][host][:port][/db-number]
的连接字符串:
createClient({ url: 'redis://alice:foobared@awesome.redis.server:6380' });
你还可以使用离散参数、UNIX 套接字,甚至 TLS 来连接。详细信息可以在客户端配置指南中找到。
要检查客户端是否已连接并准备好发送命令,请使用 client.isReady
,它返回一个布尔 值。client.isOpen
也可用。当客户端的底层套接字打开时,它返回 true
,否则返回 false
(例如,当客户端仍在连接或在网络错误后重新连接时)。
内置支持所有开箱即用的 Redis 命令。它们使用原始 Redis 命令名称(HSET
、HGETALL
等)和更友好的驼峰式版本(hSet
、hGetAll
等)暴露:
// 原始 Redis 命令 await client.HSET('key', 'field', 'value'); await client.HGETALL('key'); // 友好的 JavaScript 命令 await client.hSet('key', 'field', 'value'); await client.hGetAll('key');
命令的修饰符使用 JavaScript 对象指定:
await client.set('key', 'value', { EX: 10, NX: true });
回复将被转换为有用的数据结构:
await client.hGetAll('key'); // { field1: 'value1', field2: 'value2' } await client.hVals('key'); // ['value1', 'value2']
也支持 Buffer
:
await client.hSet('key', 'field', Buffer.from('value')); // 'OK' await client.hGetAll( commandOptions({ returnBuffers: true }), 'key' ); // { field: <Buffer 76 61 6c 75 65> }
如果你想运行 Node Redis 尚不知道的命令和/或使用参数,请使用 .sendCommand()
:
await client.sendCommand(['SET', 'key', 'value', 'NX']); // 'OK' await client.sendCommand(['HGETALL', 'key']); // ['key1', 'field1', 'key2', 'field2']
通过调用 .multi()
开始一个事务,然后链式调用你的命令。完成后,调用 .exec()
你将得到一个包含结果的数组:
await client.set('another-key', 'another-value'); const [setKeyReply, otherKeyValue] = await client .multi() .set('key', 'value') .get('another-key') .exec(); // ['OK', 'another-value']
你也可以通过调用 .watch()
来监视键。如果任何被监视的键发生变化,你的事务将会中止。
要深入了解事务,请查看隔离执 行指南。
通过指定 isolated
选项,可以在新连接上运行任何命令。当命令的 Promise
被履行时,新创建的连接将被关闭。
这种模式特别适用于阻塞命令——比如 BLPOP
和 BLMOVE
:
import { commandOptions } from 'redis'; const blPopPromise = client.blPop( commandOptions({ isolated: true }), 'key', 0 ); await client.lPush('key', ['1', '2']); await blPopPromise; // '2'
要了解更多关于隔离执行的信息,请查看指南。
请参阅发布/订阅概述。
for await (const key of client.scanIterator()) { // 使用 key! await client.get(key); }
这也适用于 HSCAN
、SSCAN
和 ZSCAN
:
for await (const { field, value } of client.hScanIterator('hash')) {} for await (const member of client.sScanIterator('set')) {} for await (const { score, value } of client.zScanIterator('sorted-set')) {}
你可以通过提供配置对象来覆盖默认选项:
client.scanIterator({ TYPE: 'string', // 仅适用于 `SCAN` MATCH: 'patter*', COUNT: 100 });
Redis 提供了一个编程接口,允许在 redis 服务器上执行代码。
以下示例从 redis 中检索一个键,返回该键的值加上一个整数。例如,如果你的键 foo 的值为 17,我们运行 add('foo', 25)
,它会返回生命、宇宙和万物的答案。
#!lua name=library redis.register_function { function_name = 'add', callback = function(keys, args) return redis.call('GET', keys[1]) + args[1] end, flags = { 'no-writes' } }
这是相同的示例,但格式可以粘贴到 redis-cli
中。
FUNCTION LOAD "#!lua name=library\nredis.register_function{function_name=\"add\", callback=function(keys, args) return redis.call('GET', keys[1])+args[1] end, flags={\"no-writes\"}}"
在运行以下示例之前,先在 redis 服务器 上加载上述 redis 函数。
import { createClient } from 'redis'; const client = createClient({ functions: { library: { add: { NUMBER_OF_KEYS: 1, transformArguments(key: string, toAdd: number): Array<string> { return [key, toAdd.toString()]; }, transformReply(reply: number): number { return reply; } } } } }); await client.connect(); await client.set('key', '1'); await client.library.add('key', 2); // 3
以下是上述概念的端到端示例。
import { createClient, defineScript } from 'redis'; const client = createClient({ scripts: { add: defineScript({ NUMBER_OF_KEYS: 1, SCRIPT: 'return redis.call("GET", KEYS[1]) + ARGV[1];', transformArguments(key: string, toAdd: number): Array<string> { return [key, toAdd.toString()]; }, transformReply(reply: number): number { return reply; } }) } }); await client.connect(); await client.set('key', '1'); await client.add('key', 2); // 3
有两个函数可以断开客户端与 Redis 服务器的连接。在大多数情况下,你应该使用 .quit()
以确保在关闭连接之前将待处理的命令发送到 Redis。
.QUIT()
/.quit()
通过向服务器发送 QUIT
命令,优雅地关闭客户端与 Redis 的连接。在退出之前,客户端会执行其队列中的任何剩余命令,并将从 Redis 收到每个命令的回复。
const [ping, get, quit] = await Promise.all([ client.ping(), client.get('key'), client.quit() ]); // ['PONG', null, 'OK'] try { await client.get('key'); } catch (err) { // ClosedClient 错误 }
.disconnect()
立即强制关闭客户端与 Redis 的连接。调用 disconnect
不会向 Redis 服务器发送进一步的待处理命令,也不会等待或解析未完成的响应。
await client.disconnect();
Node Redis 会自动将同一"tick"期间发出的请求组成流水线。
client.set('Tm9kZSBSZWRpcw==', 'users:1'); client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw==');
当然,如果你不处理你的 Promise,你肯定会得到未处理的 Promise 异常。要利用自动流水线并处理你的 Promise,请使用 Promise.all()
。
await Promise.all([ client.set('Tm9kZSBSZWRpcw==', 'users:1'), client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw==') ]);
在使用 Node Redis 连接到 Redis 集群时,请查看集群指南。
Node Redis 客户端类是一个 Node.js EventEmitter,每当网络状态发生变化时它都会发出一个事件:
名称 | 何时 | 监听器参数 |
---|---|---|
connect | 正在初始化与服务器的连接 | 无参数 |
ready | 客户端准备就绪可以使用 | 无参数 |
end | 连接已关闭(通过 .quit() 或 .disconnect() ) | 无参数 |
error | 发生错误—通常是网络问题,如"Socket closed unexpectedly" | (error: Error) |
reconnecting | 客户端正在尝试重新连接到服务器 | 无参数 |
sharded-channel-moved | 参见这里 | 参见这里 |
:warning: 你必须监听
error
事件。如果客户端没有至少一个已注册的error
监听器,并且发生error
,那么该错误将被抛出,Node.js 进程将退出。有关更多详细信息,请参阅EventEmitter
文档。
客户端不会发出任何其他事件,除了上面列出的 那些。
Node Redis 支持以下版本的 Redis:
版本 | 支持 |
---|---|
7.0.z | :heavy_check_mark: |
6.2.z | :heavy_check_mark: |
6.0.z | :heavy_check_mark: |
5.0.z | :heavy_check_mark: |
< 5.0 | :x: |
Node Redis 应该可以与旧版本的 Redis 一起工作,但它没有经过全面测试,我们无法提供支持。
如果你想贡献,请查看贡献指南。
感谢所有已经为 Node Redis 做出贡献的人!
本仓库采用"MIT"许可证。参见LICENSE。
AI数字人视频创作平台
Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。
一站式AI创作平台
提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作
AI办公助手,复杂任务高效处理
AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!
AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI小说写作助手,一站式润色、改写、扩写
蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号