• Nodejs操作缓存数据库-Redis


    Hi I’m Shendi


    Nodejs专栏
    Nodejs操作缓存数据库-Redis



    服务端开发中,缓存数据库也是不可或缺的,可以提高程序并发以及方便后续扩展,而目前最常用的莫过于Redis了



    安装依赖

    和之前的mysql一样,redis的依赖最常用的就是redis

    npm install redis
    
    • 1

    依赖对应的github地址:https://github.com/redis/node-redis

    这是Redis官方给的NodeJS连接指南 https://redis.io/docs/clients/nodejs/

    关于 Redis 的安装使用等操作可以看这篇文章:https://sdpro.top/blog/html/article/1023.html



    连接示例

    下面是官方的示例代码

    import { createClient } from 'redis';
    
    const client = createClient();
    
    client.on('error', err => console.log('Redis Client Error', err));
    
    await client.connect();
    
    await client.set('key', 'value');
    const value = await client.get('key');
    await client.disconnect();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    上面的代码连接到 localhost:6379,要连接到其他地址,使用以下格式

    redis[s]://[[username][:password]@][host][:port][/db-number]
    
    • 1

    例如

    createClient({
      url: 'redis://alice:foobared@awesome.redis.server:6380/0'
    });
    
    • 1
    • 2
    • 3

    其中 username 账号,password 密码,host主机地址,port端口,db-number使用的数据库下标,默认0

    有关更多信息参考文档: client configuration guide


    要检查客户端是否已连接并准备好发送命令,请使用client. isReady,它返回一个布尔值。client. isOpen也可用。当客户端的底层套接字打开时,此函数返回true,当它不打开时(例如,当客户端在网络错误后仍在连接或重新连接时),此函数返回false。


    库的操作基本上都是异步的,上面使用到 await,那么就需要将当前函数设置为 async 异步,例如

    async function test() {
        await client.connect();
    }
    
    • 1
    • 2
    • 3

    因为是异步,就需要我们自行控制错误的处理

    这里提一嘴,这里的异步全是返回的Promise,所以可以使用Promise的方式


    比起解构赋值,我更喜欢以下方式

    var redis = require("redis");
    const client = redis.createClient();
    
    client.on('error', err => console.log('Redis Client Error', err));
    
    await client.connect();
    
    await client.set('key', 'value');
    const value = await client.get('key');
    await client.disconnect();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    无需关心连接及连接池

    Node_redis自动管理连接,因此无需等待连接或回调。由于Node.js和Redis实际上都是单线程的,除了少数例外,不需要使用多个客户端实例或任何池机制;最常见的例外是,如果您使用Pub/Sub订阅,或者使用流或列表进行阻塞,那么您需要有专门的客户端来接收这些长时间运行的命令。

    例如连接一个错误的Redis地址,将会一直进行重连

    在这里插入图片描述



    使用

    该库对所有开箱即用的Redis命令都提供了内置支持。这些命令使用原始的Redis命令名(HSET、HGETALL等)和一个更友好的驼峰式版本(hSet、hGetAll等)进行暴露:

    // 原始redis命令
    await client.HSET('key', 'field', 'value');
    await client.HGETALL('key');
    
    // 友好的js命令
    await client.hSet('key', 'field', 'value');
    await client.hGetAll('key');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    要指定命令的修饰符,可以使用一个JavaScript对象:

    await client.set('key', 'value', {
      EX: 10,
      NX: true
    });
    
    • 1
    • 2
    • 3
    • 4

    上面的EX是过期时间,单位秒,NX为true时,当键不存在才会进行设置,更多的参数查阅Redis的使用,可以参考https://sdpro.top/blog/html/article/1023.html



    获取的内容将被转换为有用的结构

    await client.hGetAll('key'); // { field1: 'value1', field2: 'value2' }
    await client.hVals('key'); // ['value1', 'value2']
    
    • 1
    • 2

    该库也支持 Buffer

    await client.hSet('key', 'field', Buffer.from('value')); // 'OK'
    await client.hGetAll(
      commandOptions({ returnBuffers: true }),
      'key'
    ); // { field:  }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果您想运行Node Redis还不支持的命令(还!),请使用.sendCommand():

    await client.sendCommand(['SET', 'key', 'value', 'NX']); // 'OK'
    await client.sendCommand(['HGETALL', 'key']); // ['key1', 'field1', 'key2', 'field2']
    
    • 1
    • 2


    事务(Multi/Exec)

    通过调用.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']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    您也可以通过调用.watch()来监视键。如果任何监视的键发生更改,事务将中止。
    要深入了解事务,请查看Isolated Execution Guide.



    事件

    Node Redis客户端类是一个Nodejs EventEmitter,每次网络状态发生变化时,它都会发出一个事件:

    名称何时发生监听参数
    connect启动与服务器的连接No arguments
    ready客户端已准备好使用No arguments
    end连接已关闭(通过.quit().disconnect()No arguments
    error出现错误——通常是网络问题,如 “Socket closed unexpectedly”(error: Error)
    reconnecting客户端正在尝试重新连接到服务器No arguments
    sharded-channel-movedSee hereSee here


    支持的版本

    版本是否支持
    7.0.z✔️
    6.2.z✔️
    6.0.z✔️
    5.0.z✔️
    < 5.0

    Node Redis应该可以与旧版本的Redis一起使用,但它还没有经过完全测试,我们无法提供支持。


    我使用的 windows 版本的 redis,目前版本为 3.0.504,暂时没有什么问题



    错误解决

    连接报错 ErrorReply: ERR wrong number of arguments for ‘auth’ command

    这个错误是通过调用 createClient({url : “”}) 出现的,因为redis没有设置账号,只设置了密码,而上面给出的url用户密码都有,我于是去搜索了redis的默认账号,搜到为 default… 但没有设置账户,账号处应该留空

    链接设置如下解决

    redis://:password@localhost:6379
    
    • 1



    END

  • 相关阅读:
    818专业课【考经】—《信号系统》之章节概要:第五章 连续时间信号的变换域分析
    数字IC手撕代码-XX公司笔试真题(数据流最大值)
    数仓建模—大数据建模
    网易有道财报:网易有道2023财年收入将强劲增长,亏损将减少?
    Mybatis 知识点大总结
    vue项目不用重新打包即可以修改项目ip
    HCIP-Datacom-ARST自选题库__BGP多选【22道题】
    【qemu逃逸】XCTF 华为高校挑战赛决赛-pipeline
    uni-app实现class类请求封装
    多线程学习笔记
  • 原文地址:https://blog.csdn.net/qq_41806966/article/details/134392818