NodeJs集成Redis-Sentinel实践

柯凯旋
2023-12-01

Redis的架构分为:redis单机、redis主从、redis集群、redis-sentinel架构,其中redis-sentinel相对于redis集群实现了高可用等特性,对于需要保证稳定性以及核心功能的redis来说,一般会采用redis-sentinel的架构模式。前面2篇文章分别介绍了redis的单机、redis集群的nodeJS配置,本篇文章简单介绍一下redis-sentinel在NodeJs中的配置

安装NPM依赖

  • 使用redis-sentinel连接redis,所以需要安装对应的依赖

    npm install --save redis-sentinel

Redis-Sentinel配置

  • 创建redis-sentinel.js配置文件,并加入配置

    const sentinel = require('redis-sentinel')
    // 哨兵节点的地址与端口集合
    const sentinels = [ 
        { host: '127.0.0.1', port: 6375 },
        { host: '127.0.0.1', port: 6376 },
        { host: '127.0.0.1', port: 6377 },
    ]
    // redis-sentinel中配置的master节点的名字
    const masterName = 'sentinel-172.22.12.12-6425'; 
    // node_redis的相关属性设置
    const opts = { 
        // auth_pass: 'password', // 在版本较低的node_redis中使用auth_password作为密码,redis-sentinel及时属于版本较低的node_redis
        // password: 'password', // 在版本高的node_redis中的密码属性,如果没有密码则无需设置
        db: 0, // 如果设置,客户端将在连接上运行Redis select命令选择指定的db。
    };
    
    // 创建redisClient实例
    const redisClient = sentinel.createClient(sentinels, masterName, opts);
    
    redisClient.on('ready', function () {
        console.log('redis-sentinel client is ready to connected');
    });
    
    redisClient.on('connect', function () {
        console.log('redis-sentinel is now connected', new Date());
    });
    
    redisClient.on('reconnecting', function () {
        console.log('redis-sentinel reconnecting', new Date());
    });
    
    redisClient.on('error', function (err) {
        console.log('redis-sentinel Error ' + err);
    });
    
    
    module.exports = {
        redisClient
    };
    
  • 封装redisClient操作Redis的方法

    const redisClient = require('./redis-sentinel')
    
    
    // string: 通过key获取value
    getString = (key) => {
        return new Promise((resolve, reject) => {
            redisClient.get(key, function (err, result) {
                if (err) {
                    reject(err);
                }
                resolve(result);
            });
        });
    };
    
    // string: set key value
    setString = (key, value) => {
        return new Promise((resolve, reject) => {
            redisClient.set(key, value, function(err, res) {
    			if(err) {
                    reject(err)
                }
                resolve(res)
            })
        })
    };
    
    // string: set key value expire
    setStringWithExpire = (key, value, expire) => {
        return new Promise((resolve, reject) => {
            redisClient.set(key, value, function(err, res) {
    			if(err) {
                    reject(err)
                }
                if(expire > 0) {
                    redisClient.expire(key, parseInt(expire));
                }
                resolve(res)
            })
        })
    };
    
    module.exports = {
        getString,
        setString,
        setStringWithExpire
    }
    

对Redis的所有功能性操作都可以单独的封装到redis-operator.js文件中,模块化操作,提供了整体的redis操作工具类,便于维护和更新

使用RedisClient操作的所有方法,可以参考Redis的命令

redis命令参考:http://doc.redisfans.com/

 类似资料: