深入了解node​中怎么使用redis集群功能【配置详解】

node中怎么使用redis集群功能?下面本篇文章给大家详解一下基于node的redis集群配置,希望对大家有所帮助!

深入了解node​中怎么使用redis集群功能【配置详解】

关于nodejs中使用nodejs集群功能,没有找到一篇比较完整且通俗易懂的文章,因此自己在开发调试的过程中也走了不少弯路。

本文会详细介绍了在本地如何搭建redis集群、在客户端如何使用集群、在搭建过程中遇到的问题和错误汇总并说明,以避免下次使用的时候再走弯路,提高开发、工作效率。

使用集群的背景是:在Redis单例模式下随着用户量、访问量的提高,qps值急剧上涨??,大量的redis操作导致某一时刻占满io,随时有宕机的危险,同时通过批量处理redis等方式也是治标不治本,无法突破服务器性能的瓶颈。因此使用集群方案或增加redis实例就势在必行。

名词解释–集群

集群一般是指服务器集群,区别于分布式系统,是将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器。集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行。(在redis3.0之前一般使用的都是 哨兵模式,但 哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般)

redis集群要求

由于投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群,因此Redis集群至少需要3个节点。

要保证集群的高可用、需要每个节点都有从节点(也就是备份节点),所以cpu(100%)集群至少需要6台服务器。 (三主三从、三存三取、高可用、可备份)

当然,我们在本地调试时不可能用这么多服务器,因此我们可以在本地模拟运行6个Redis实例,事实上生产环境的Redis集群搭建和这里基本上一样。

mac 环境下搭建本地redis集群

1. 下载安装redis

可以在官网选择安装,也可以用命名行安装

#安装brew install redis#启动redis-server#进入redis客户端redis-cli

2. 通过redis配置集群环境

首先要找到redis配置文件的位置

redis # 查看redis安装的位置brew list redis # 根据位置进入版本号所在的文件夹cd /opt/homebrew/Cellar/redis/6.2.4# 打开文件夹用open . 打开Xcode.app, 即可找到homebrew.mxcl.redis.plist所在的位置,如下所示:

1.png

2.png

创建六个服务配置文件

redis.conf(上一步找到的配置文件目录)

# 需要在 /opt/homebrew/etc/ 路径下mkdir -p redis/cluster/7000mkdir -p redis/cluster/7001mkdir -p redis/cluster/7002mkdir -p redis/cluster/7003mkdir -p redis/cluster/7004mkdir -p redis/cluster/7005

修改配置文件

cd /opt/homebrew/etc/路径下的配置文件不用去修改, 只要将其copy到上面创建的 /opt/homebrew/etc/redis.conf目录下,然后再修改,步骤如下

先复制一份配置文件修改

cd /opt/homebrew/etc/ # 进入配置文件目录cp redis.conf redis/cluster/7000/7000.confcode redis/cluster/7000/7000.conf # 用编辑器打开或者用vim打开配置文件来进行修改

进入到redis/cluster/7000后,修改以下属性

# Redis端口号(7000-7005每个配置文件都要修改)port 7000  # 开启集群模式运行cluster-enabled yes   # 集群内部配置文件配置文件路径,默认nodes-6379.conf(7000-7005每个配置文件都要修改)cluster-config-file nodes-7000.conf # 节点间通信的超时时间cluster-node-timeout 5000  # 数据持久化appendonly yes

将7000.conf复制到每个redis服务的目录下

cd /opt/homebrew/etc/redis/cluster # 进入配置文件目录cp 7000/7000.conf 7001/7001.confcp 7000/7000.conf 7002/7002.confcp 7000/7000.conf 7003/7003.confcp 7000/7000.conf 7004/7004.confcp 7000/7000.conf 7005/7005.conf

再修改7000.conf每个配置文件的port和cluster-config-file属性

注意:每个配置文件必需配置不一样的7001.conf-7005.conf值(否则集群不会生效),上面是以端口区分。

通过port和cluster-config-file命令可查找到该配置文件的目录

3. 启动和停止集群服务

由于我们配置了6个服务,因此不可能一个一个的启动或停止,需要借助shell脚本来实现

进入find /opt/homebrew -name nodes-7000.conf目录,创建start.sh和stop.sh文件

# start.sh 文件#!/bin/shredis-server /opt/homebrew/etc/redis/cluster/7000/7000.conf &redis-server /opt/homebrew/etc/redis/cluster/7001/7001.conf &redis-server /opt/homebrew/etc/redis/cluster/7002/7002.conf &redis-server /opt/homebrew/etc/redis/cluster/7003/7003.conf &redis-server /opt/homebrew/etc/redis/cluster/7004/7004.conf &redis-server /opt/homebrew/etc/redis/cluster/7005/7005.conf &# stop.sh 文件#!/bin/shredis-cli -p 7000 shutdown &redis-cli -p 7001 shutdown &redis-cli -p 7002 shutdown &redis-cli -p 7003 shutdown &redis-cli -p 7004 shutdown &redis-cli -p 7005 shutdown &

执行/opt/homebrew/etc/redis/cluster或者./start.sh来启停服务

执行./stop.sh来查看已启动的redis服务

注意: 第一次执行./start.sh需要通过ps -ef |grep redis授权执行权限

4. 相关命令

redis-cli -p 7000 # 单个客户端启动redis-server 7000/7000.conf  # 启动单个服务端redis-cli -p 7000 shutdown # 关闭服务端sudo chmod +x start.sh # 开启脚本执行权限# 设置redis主从关系(三主三从)redis-cli --cluster create  --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005cluster nodes #查看集群节点情况(进入某个客户端执行)cluster info #查看集群信息(进入某个客户端执行)查看所有key值:keys *删除指定索引的值:del key清空整个 Redis 服务器的数据:flushall 清空当前库中的所有 key:flushdb

客户端使用 ioredis 框架接入集群

Redis.Cluster提供了在多个Redis节点上自动分片的功能,使用前面搭建好的六个redis服务器,然后在本地启动sudo chmod +x start.sh,就可以测试集群的效果了。ioredis

// redis.jsconst Redis = require("ioredis");const cluster = new Redis.Cluster([  {    port: 7000,    host: "127.0.0.1",  },  {    port: 7001,    host: "127.0.0.1",  },]);cluster.set("foo", "bar");cluster.get("foo", (err, res) => {  // res === 'bar'});

使用bull框架(redis 队列)

import Queue from 'bull'// 创建redis队列实例const instance = new Queue('custom', {  prefix : '{myprefix}',  createClient(type) {    // cluster 集群实例同上    return cluster  }})// 添加数据到redis队列(生产者)instance.add(  'request',   {     ...params  },  {    removeOnComplete: false  }).catch(e => {  console.error(e)})// 消费者回调instance.process('request', 5, async (job, done) => {  console.log('获取当前消费的数据:', job.data)  // 执行异步操作  await new Promise((resolve)=>resolve())  done()})

使用node redis.js框架连接bull集群时存在问题: 每次有数据ioredispush队列时对应的回调函数可能会触发多次,目前无法确定是使用的问题还是框架本身的问题(如果有了解的欢迎大家留言告知)。

替代集群的方案:在不需要数据同步和数据迁移的情况下,可以在客户端使用多个redis实例,结合redis使数据平分到其中的一个Math.random(),从而解决了单个实例硬件(redis等)瓶颈的问题。

问题处理

1、Mac系统下连接redis报错?

Gnomic智能体平台 Gnomic智能体平台

国内首家无需魔法免费无限制使用的ChatGPT4.0,网站内设置了大量智能体供大家免费使用,还有五款语言大模型供大家免费使用~

Gnomic智能体平台 47 查看详情 Gnomic智能体平台

控制台错误提示:Could not connect to Redis at 127.0.0.1:6379: Connection refused

原因:服务端没有开启或启动失败

解决办法:需要先启动redis服务端redis-server 

参考链接https://blog.csdn.net/qq_23347459/article/details/104257529

2、客户端启动、读写报错?

错误提示:ClusterAllFailedError: Failed to refresh slots cache.

原因:每个服务下的配置文件中的cluster-config-file属性一致。

处理:修改成唯一的属性值 

参考链接1 

https://stackoverflow.com/questions/57350961/ioredis-clusterallfailederror-failed-to-refresh-slots-cache

参考2

https://github.com/luin/ioredis/issues/711

3、执行创建主从redis语句失败?

执行语句:cpu

提示错误:redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

原因:执行创建语句时,没有清空数据和重置集群

处理:清空数据和重置集群, 清除rdb和aof文件

参考清除redis数据

https://stackoverflow.com/questions/37206993/redis-server-cluster-not-working

# 以7000端口的服务为例,7001-7005重复以下操作$redis-cli -p 7000127.0.0.1:7000> flushall127.0.0.1:7000> cluster reset127.0.0.1:7000> exit# 使用find找到rdb和aof文件(也在rdb目录下)find /opt/homebrew -name dump.rdb# 重新执行创建语句成功redis-cli --cluster create  --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

结语

redis集群在客户端的使用是非常简单的,相比之下服务端的配置会比较繁琐。

客户端的具体使用只做了一下简单的说明,使用过程中要注意redis数据的同步和迁移等问题。

使用集群虽然能提升服务能力、支持主从复制、哨兵模式、读写分离、平分服务器的压力等特点。但不具备自动容错和恢复功能,如果出现宕机会使部分读写请求失败,降低了系统的可用性。在使用时根据业务情况分析、选择不同的方案。

本文转载自:https://juejin.cn/post/7079928963107127327

作者:tager

更多node相关知识,请访问:nodejs 教程!

以上就是深入了解node​中怎么使用redis集群功能【配置详解】的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/551901.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
自定义 Markdown 解析器:hiyokko2/hiyokko2_text_parser 的使用指南
上一篇 2025年11月9日 20:34:24
Kafka在Linux环境下的最佳实践是什么
下一篇 2025年11月9日 20:34:26

相关推荐

  • JavaScript 高效判断页面所有复选框状态的技巧与实践

    本文旨在提供一套高效且专业的javascript方法,用于判断网页中所有复选框的选中状态。我们将探讨如何利用`array.some()`快速确定是否有未选中的复选框(进而判断是否全部选中),以及如何使用`array.filter()`统计选中和未选中的复选框数量。通过优化dom元素选择和数组操作,提…

    2026年5月10日
    000
  • OSMnx中interpolate_points函数详解及街道细分与图构建实践

    本文详细介绍了osmnx库中`utils_geo.interpolate_points`函数的使用方法,特别是其返回的python生成器类型。我们将学习如何处理生成器输出,并提供一个完整的教程,演示如何利用此函数将现有街道几何体细分为更小的线段,进而构建一个精细化的网络图,以支持更细粒度的空间分析。…

    2026年5月10日
    000
  • 如何安全有效地从外部网页获取HTML元素数据并应用于自身页面

    本教程旨在解决如何在不同域名下,通过javascript获取并使用另一个网页的html元素数据。文章将深入探讨同源策略的限制,并提供两种主要解决方案:使用` 在现代Web开发中,有时我们需要从外部网站获取特定的HTML内容或属性值,并将其整合到我们自己的网页中。例如,从XYZ.COM/B.html页…

    2026年5月10日
    000
  • JS如何操作HTML元素_DOM编程核心方法【教程】

    必须掌握操作HTML元素的核心DOM方法:一、通过ID获取单个元素;二、通过类名获取元素集合;三、通过标签名获取元素集合;四、通过CSS选择器获取元素;五、为元素绑定事件监听器;六、创建并插入新元素;七、替换或删除现有元素。 如果您希望使用JavaScript动态修改网页内容、响应用户交互或构建交互…

    2026年5月10日
    000
  • Golang如何提升TCP长连接处理效率_Golang TCP长连接处理性能优化实践详解

    答案:通过非阻塞I/O、单Goroutine双工模型、sync.Pool对象复用、TCP_NODELAY优化及高效心跳管理,结合系统调优,可显著提升Golang百万级TCP长连接处理效率。 在高并发网络服务场景中,TCP长连接的处理效率直接影响系统的吞吐能力和资源消耗。Golang凭借其轻量级Gor…

    2026年5月10日
    000
  • 使用SMTP.js发送邮件:客户端集成、常见问题与最佳实践指南

    本文深入探讨了使用SMTP.js库在前端发送邮件时可能遇到的问题,特别是与Elastic Email集成时的挑战。我们将分析代码中常见的异步处理错误、条件函数定义陷阱,并提供修正后的代码示例和最佳实践。重点强调了正确处理Promise链、确保函数可访问性以及客户端邮件发送的安全考量,帮助开发者构建更…

    2026年5月10日
    000
  • 如何在不暴露密钥的情况下,在客户端创建 Stripe Payment Link

    本文介绍了在纯静态网站环境下,如何利用 Stripe Payment Link 实现商品售卖,并着重讨论了在不暴露 Stripe 密钥的前提下,客户端创建 Payment Link 的可行性。分析了直接在客户端使用密钥的风险,并提出了预先生成 Payment Link 或使用后端服务动态生成 Pay…

    2026年5月10日
    000
  • Windows用Prettier一键格式化乱码HTML代码

    首先确保HTML文件保存为UTF-8编码,使用文本编辑器另存为UTF-8格式;其次在命令行执行chcp 65001切换至UTF-8代码页后再运行Prettier;接着在VS Code中设置files.encoding为utf8并启用files.autoGuessEncoding;最后可通过Node.…

    2026年5月10日
    000
  • php怎么截取网页_php抓取网页内容的几种方法

    file_get_contents适用于静态页抓取,但受限于allow_url_fopen且无法执行JS;2. cURL支持自定义请求头、Cookie等,适合处理复杂HTTP请求;3. Guzzle作为现代PHP项目推荐方案,具备良好扩展性与异步支持;4. 动态渲染内容需借助Puppeteer或Se…

    2026年5月10日
    000
  • html函数如何实现动态内容显示 html函数在网页交互中的核心应用

    JavaScript函数通过操作DOM实现动态内容更新与交互,如显示时间、实时搜索、增删元素及加载数据,使网页具备动态功能。 HTML 本身没有“函数”的概念,它是一种标记语言,用于定义网页结构。真正实现动态内容显示和交互功能的是 JavaScript。通常所说的“HTML函数”其实是 JavaSc…

    2026年5月10日
    000
  • HTMLAMP怎么做_加速移动页面实现教程

    答案:HTML AMP通过规范标签、禁用自定义JS、引入AMP JS库和缓存技术提升移动页面加载速度,需遵循AMP HTML标准并验证有效性,有助于SEO但非万能,未来将更开放并与PWA等融合。 HTML AMP 旨在加速移动页面加载速度,提升用户体验。简单来说,它通过限制某些 HTML 功能,并采…

    2026年5月10日
    000
  • 理解PHP服务器端请求与浏览器开发者工具的限制

    当PHP脚本使用file_get_contents等函数发起服务器端请求时,这些请求直接在服务器上执行,而非通过浏览器。因此,浏览器开发者工具的网络活动面板无法捕获和显示这些内部的服务器间通信,因为它仅监控浏览器自身发出的网络请求,对服务器内部处理过程无感知。 客户端请求与服务器端请求的本质区别 在…

    2026年5月10日
    000
  • JavaScript DOM操作:点击关联元素获取目标文本内容的教程

    本教程详细介绍了如何通过JavaScript处理用户点击事件,并结合DOM的 closest() 和 querySelector() 方法,从复杂的HTML结构中准确获取目标元素的文本内容。文章强调了使用 addEventListener() 进行事件绑定、避免重复ID以及高效DOM遍历的最佳实践,…

    2026年5月10日
    000
  • 前端构建优化:利用常量折叠提升应用性能

    本文深入探讨了一种在构建阶段执行部分源代码以进行优化的技术——常量折叠(Constant Folding)。通过在编译时预计算表达式并替换为最终结果,该技术显著减少了运行时开销,提升了应用性能。文章将详细解释其工作原理、优势,并探讨其在现代前端构建工具中的应用与配置,旨在帮助开发者实现更高效的代码优…

    2026年5月10日
    000
  • JavaScript数据结构实现_javascript算法基础

    JavaScript中常用数据结构包括栈、链表和字典:1. 栈利用数组的push和pop实现LIFO,适用于括号匹配;2. 链表由节点组成,插入删除高效,适合频繁修改场景;3. 字典用对象实现键值对存储,常用于频率统计;4. 二分查找在有序数组中以O(log n)效率查找目标值,需数组已排序。掌握这…

    2026年5月10日
    000
  • JavaScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程

    本教程详细介绍了如何使用javascript实现井字棋(tic-tac-toe)游戏的核心交互逻辑。内容涵盖了如何遍历并为棋盘上的每个方格添加点击事件监听器,实现玩家x和o的交替落子,以及重置游戏状态的功能。通过提供的html、css和javascript代码示例,读者可以快速理解并构建一个基础的井…

    2026年5月10日
    000
  • 全栈JS代码怎么结构化_全栈JavaScript项目代码结构与规范指南

    采用分层+功能划分的目录结构,明确分离前后端代码;2. 遵循单一职责原则,路由、控制器、服务与模型各司其职;3. 统一命名规范并集成ESLint+Prettier保证代码风格一致;4. 使用环境变量管理配置,通过脚本实现自动化构建与并发启动服务。 全栈JavaScript项目涉及前端、后端、数据库交…

    2026年5月10日
    000
  • JavaScript模块加载机制_JavaScript代码组织规范

    现代前端推荐使用ES Modules,通过import和export实现静态依赖管理,配合合理目录结构与命名规范提升可维护性,注意浏览器与Node.js的运行差异。 JavaScript 的模块加载机制和代码组织规范是现代前端开发中的核心基础。随着项目规模扩大,良好的模块化设计能提升代码可维护性、复…

    2026年5月10日
    000
  • c++怎么实现一个静态代码分析工具_C++代码质量与静态分析工具开发

    静态代码分析工具通过解析源码构建AST,利用Clang框架实现未使用变量检测,结合ASTMatchers进行规则匹配,最终生成警告信息。 静态代码分析工具可以在不运行程序的前提下,检测出潜在的语法错误、编码规范问题、内存泄漏风险等。在C++中开发一个简单的静态分析工具,核心思路是解析源码并构建抽象语…

    2026年5月10日
    000
  • JavaScript模块化是什么_ES6模块和CommonJS有什么区别呢

    JavaScript模块化将代码拆分为独立可复用单元,ES6模块(import/export,编译时加载、实时引用)与CommonJS(require/module.exports,运行时加载、值拷贝)核心区别在于设计目标和运行机制不同。 JavaScript模块化是把代码按功能拆分成独立、可复用的…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信