1
0
mirror of https://github.com/redis/node-redis.git synced 2025-08-07 13:22:56 +03:00
Files
node-redis/docs/v4-to-v5.md
Leibale Eidelman b4bb68d8ab V5 branch (#2491)
* wip

* Worked on phrasing etc for v5 doc changes.

* Removed quite repetition of 'Rather'

* Update v4-to-v5.md

* Update v4-to-v5.md

* Update v4-to-v5.md

* WIP

* WIP

* clean SET command

* some more commands, multi.exec<'typed'>

* "typed" multi

* WIP

* upgrade deps

* wip

* wip

* fix #2469

* wip

* npm update

* wip

* wip

* wip

* wip

* some tests

* tests.yml

* wip

* wip

* merge master into v5

* some more commands

* some more commands

* WIP

* Release client@2.0.0-next.1

---------

Co-authored-by: Simon Prickett <simon@redislabs.com>
2023-04-30 11:18:46 -04:00

3.5 KiB

v4 to v5 migration guide

Command Options

In v4, command options are passed as a first optional argument:

await client.get('key'); // `string | null`
await client.get(client.commandOptions({ returnBuffers: true }), 'key'); // `Buffer | null`

This has a couple of flaws:

  1. The argument types are checked in runtime, which is a performance hit.
  2. Code suggestions are less readable/usable, due to "function overloading".
  3. Overall, "user code" is not as readable as it could be.

The new API for v5

With the new API, instead of passing the options directly to the commands we use a "proxy client" to store them:

await client.get('key'); // `string | null`

const proxyClient = client.withCommandOptions({
  flags: {
    [TYPES.BLOB_STRING]: Buffer
  }
});

await proxyClient.get('key'); // `Buffer | null`

withCommandOptions can be used to override all of the command options, without reusing any existing ones.

To override just a specific option, use the following functions:

  • withFlags - override flags only.
  • asap - override asap to true.
  • isolated - override isolated to true.

Quit VS Disconnect

The QUIT command has been deprecated in Redis 7.2 and should now also be considered deprecated in Node-Redis. Instead of sending a QUIT command to the server, the client can simply close the network connection.

Rather than using client.quit(), your code should use client.close() or client.disconnect().

TODO difference between close and disconnect...

Scan Iterators

TODO

Yields chunks instead of individual items:

for await (const chunk of client.scanIterator()) {
  // `chunk` type is `Array<string>`
  // will allow multi keys operations
  await client.del(chunk);
}

Commands

Some command arguments/replies have changed to align more closely to data types returned by Redis:

  • ACL GETUSER: selectors
  • CLIENT KILL: enum ClientKillFilters -> const CLIENT_KILL_FILTERS 1
  • CLUSTER FAILOVER: enum FailoverModes -> const FAILOVER_MODES 1
  • LCS IDX: length has been changed to len, matches has been changed from Array<{ key1: RangeReply; key2: RangeReply; }> to Array<[key1: RangeReply, key2: RangeReply]>
  • HEXISTS: boolean -> number 2
  • HRANDFIELD_COUNT_WITHVALUES: Record<BlobString, BlobString> -> Array<{ field: BlobString; value: BlobString; }> (it can return duplicates).
  • SCAN, HSCAN, SSCAN, and ZSCAN: cursor type is string instead of number?
  • HSETNX: boolean -> number 2
  • ZINTER: instead of client.ZINTER('11, { WEIGHTS: [1] }) use client.ZINTER({ key: '1', weight: 1 }])
  • SETNX: boolean -> number 2
  • COPY: destinationDb -> DB, replace -> REPLACE, boolean -> number 2
  • EXPIRE: boolean -> number 2
  • EXPIREAT: boolean -> number 2
  • MOVE: boolean -> number 2
  • PEXPIRE: boolean -> number 2
  • PEXPIREAT: boolean -> number 2
  • RENAMENX: boolean -> number 2
  • HSCAN: tuples has been renamed to entries
  • PFADD: boolean -> number 2
  • SCRIPT EXISTS: Array<boolean> -> Array<number> 2
  • SISMEMBER: boolean -> number 2
  • SMISMEMBER: Array<boolean> -> Array<number> 2

  1. TODO ↩︎

  2. TODO ↩︎