npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@vcms-io/solidis

v0.5.0

Published

The fastest Redis client for Node.js. Zero dependencies, battle-tested in production.

Readme

Quick Start

npm install @vcms-io/solidis
import { SolidisFeaturedClient } from '@vcms-io/solidis/featured';

const client = new SolidisFeaturedClient({ host: '127.0.0.1', port: 6379 });

await client.set('key', 'value');
const value = await client.get('key');

[!TIP] Need a smaller bundle? Use SolidisClient with .extend() to import only the commands you use: < 30KB with tree-shaking.

import { SolidisClient } from '@vcms-io/solidis';
import { get } from '@vcms-io/solidis/command/get';
import { set } from '@vcms-io/solidis/command/set';

const client = new SolidisClient({ host: '127.0.0.1', port: 6379 }).extend({ get, set });

extend() binds the object's functions to the client, the methods of its class included.

// Transaction (MULTI/EXEC)
const tx = client.multi();
tx.set('key', 'value');
tx.incr('counter');
const results = await tx.exec(); // null when a WATCHed key changed

// Pipeline (raw)
const replies = await client.send([
  ['set', 'a', '1'],
  ['incr', 'counter'],
  ['get', 'a']
]);

// A timeout for one request (0 disables it), and a raw blocking command handled like blpop()
await client.send([['INFO']], { timeout: 1_000 });
const job = await client.send([['BLPOP', 'jobs', '30']], { blockingTimeout: 30_000 });
  • exec() sends MULTI, the queue and EXEC in one send() and resolves with the raw replies; queued options such as { buffer: true } do not apply.
  • exec() rejects when a call queued nothing or send() refuses a queued command. Like discard(), it then sends UNWATCH.
  • Only the synchronous part of a queued call joins. A method that awaits its own queued reply never resumes; one that awaits anything else sends the rest outside the transaction. Check arguments before queueing.
  • A queued call passes its arguments on once more, so it takes about half as many spread items as a direct call. Send larger commands with send().
  • A refused MULTI (no @transaction) leaves the queue to run alone, and exec() rejects with [MULTI].
  • After a reconnect loses a WATCH, the next EXEC becomes DISCARD and returns null. After it loses a raw MULTI, only MULTI, EXEC, DISCARD and RESET pass.
  • AUTH and HELLO go out only after every earlier reply, a blocking command's included, since Redis 7.2 and later drop the error of a failed AUTH while other replies are pending. Later commands wait for their reply, and a command's timeout starts when it goes out.
  • send() refuses AUTH and HELLO after another command of the same batch or inside a transaction. A RESP3 push pending on the server at that moment still drops the error, and the AUTH times out.
client.on('message', (channel, message) => {
  console.log(`${channel}: ${message}`);
});
await client.subscribe('events');
  • When a cluster node stops serving a slot, it unsubscribes clients from the slot's shard channels with messages identical to SUNSUBSCRIBE replies. A SUNSUBSCRIBE sent at that moment can take one as its reply and pass its own reply to the next command.
// BLPOP & co. hold the whole connection until they return, so give them a dedicated client
const worker = new SolidisFeaturedClient({ host: '127.0.0.1', port: 6379 });

const job = await worker.blpop(['jobs'], 0); // a timeout of 0 waits forever
  • Deadline: commandTimeout plus the blocking timeout; none when it blocks forever or commandTimeout is 0.
  • At the deadline the connection resets, so a late reply never reaches another command. A command the server has not run yet may still run and pop a value nobody receives.
  • send() handles a raw blocking command the same way when you pass its timeout in milliseconds as blockingTimeout; 0 means it blocks forever.
  • migrate() adds its timeout the same way, and like the server counts 0 or less as 1,000 ms. shutdown() waits for the connection to close without a deadline, unless it aborts.
const views = await client.incr('views', { bigint: true }); // bigint
  • Commands return integers as number and reject one past Number.MAX_SAFE_INTEGER, such as a TTL or a time-series timestamp. The command has run by then; cause holds the exact bigint.
  • INCR, INCRBY, DECR, DECRBY, HINCRBY, BITFIELD and BITFIELD_RO take { bigint: true }, which returns every integer as a bigint; the return type follows.
  • INCRBYFLOAT returns a rounded number; HINCRBYFLOAT returns the server's exact text.
await client.set('image', Buffer.from([0xff, 0xd8, 0xff, 0xe0]));

const image = await client.get('image', { buffer: true });           // Buffer | null
const images = await client.mget('image', 'logo', { buffer: true }); // (Buffer | null)[]

| Buffer | Commands | | :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Stored as is | SET, SETNX, SETEX, PSETEX, GETSET, SETRANGE, APPEND, MSET, MSETNX, HSET, HSETNX, HMSET, LPUSH, RPUSH, LPUSHX, RPUSHX, LSET, LINSERT, XADD, RESTORE | | Compared values | LINSERT, LREM, LPOS, SMISMEMBER, DELEX, SET | | Other arguments | PUBLISH, SPUBLISH (message) · FUNCTION RESTORE (dump) · BF.LOADCHUNK, CF.LOADCHUNK (chunk) · AUTH, HELLO (credentials) · send() (any argument) | | Read with { buffer: true } | GET, GETDEL, GETEX, GETRANGE, MGET, HGET, HMGET, HGETALL, HVALS, LINDEX, LRANGE, LPOP, RPOP, LMOVE, BLMOVE, RPOPLPUSH, BRPOPLPUSH, BLPOP, BRPOP, LMPOP, BLMPOP |

  • A Buffer reply is a view of the chunk it arrived in (up to 64 KB). Copy it with Buffer.from() to keep it long.
  • send() copies command arrays, not the Buffers in them: keep a Buffer unchanged until its command settles.
  • Field names (HGETALL, HSCAN, streams) and RESP3 map keys, also from send(), decode as UTF-8, so invalid UTF-8 names can collide. Keep binary data in values.
  • Stream, set and sorted-set reads, HSCAN, HRANDFIELD, GETSET, SORT, SORT_RO and LCS return values as UTF-8 strings; read binary values from them with send().
  • DUMP and FUNCTION DUMP return the payload as a latin1 string. Pass it to restore() or functionRestore() as it is, or read its bytes with Buffer.from(value, 'latin1').
  • MGET and HMGET read a trailing undefined as missing options, not as a key.
await client.set('key', 'value', { expireInSeconds: 60, setIfKeyNotExists: true });

// Type error: SET accepts one expiration and one condition
await client.set('key', 'value', { expireInSeconds: 60, keepOriginalTimeToLive: true });

Option types accept only the option combinations the command accepts: one of NX and XX, one of BYSCORE and BYLEX, no WITHSCORES with BYLEX, and so on. Lists and records of items are not checked: an empty one is sent as it is, except that latencyReset([]), commandDocs([]) and clientTracking() with prefixes: [] reject, since they would act on everything.

const entries = await client.xrange('jobs', '-', '+');
const pending = await client.xpending('jobs', 'workers', '-', '+', 10);
  • Entry fields form a record: a repeated name keeps its last value, and integer-like names come first in ascending order. xadd() takes a record; send() returns the raw pairs.
  • On RESP3, xread() and xreadgroup() given one key twice keep only its last result, since a map holds each key once.
  • deliveryTime is the idle time in xpending(), and the Unix time of the last delivery in xinfoStream(key, true), both in milliseconds.
  • xautoclaim() with justid returns its IDs as entries with empty fields; xclaim() with justid returns the IDs alone.

Benchmarks

Up to 5.1x faster than other Node.js Redis clients

Fastest in 19 of 19 benchmarks against 5 clients

linux x64 · Node.js v22.23.3 · Redis 8.10.2 · 2026-10-08

Leaderboard

| | Client | Version | Fastest in | Throughput ↑ | CPU / op ↓ | Peak memory ↓ | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------- | :------ | ----------: | -----------: | ---------: | ----------------: | | | solidis | 0.5.0 | 19 / 19 | 1.00x | 1.00x | 1.00x | | | node-redis | 6.3.0 | 0 / 19 | 0.73x | 1.10x | 0.88x | | | speedkey | 0.4.2 | 0 / 19 | 0.49x | 2.03x | 0.40x† | | 4. | iovalkey | 0.4.0 | 0 / 19 | 0.43x | 2.21x | 1.35x | | 5. | ioredis | 6.0.0 | 0 / 19 | 0.42x | 2.24x | 1.28x | | 6. | valkey-glide | 2.5.3 | 0 / 19 | 0.39x | 2.54x | 0.94x† |

Geometric means over all benchmarks, relative to solidis · † Native memory not counted

Operations per Second

100,000 operations × 10,000 concurrency · 1 KB payload · 10 repeats

| | Benchmark | solidis | ioredis | iovalkey | node-redis | valkey-glide | speedkey | Lead | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------- | ----------: | ----------------: | ----------------: | ---------: | ----------------: | ----------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | | | TransactionSET EXPIRE GET | 100.7K | 23.7K | 24.7K | 51.3K | 38.8K1 | 35.9K | 2.0x | | | Transaction MixedSET GET | 65.9K | 13.0K | 13.8K | 35.2K | 20.6K1 | 25.2K | 1.9x | | | Pub/SubPUBLISH MESSAGE | 157.8K | 75.8K | 83.9K | 89.9K | 24.8K2 | 68.0K2 | 1.8x | | 4. | Set MutationSADD SISMEMBER SREM | 99.2K | 36.6K | 37.0K | 65.7K | 43.4K3 | 60.8K3 | 1.5x | | 5. | Pipeline MixedSET INCR GET | 78.9K | 35.9K | 35.8K | 52.8K | 34.8K3 | 41.6K3 | 1.5x | | 6. | SetSET | 152.4K | 79.4K | 79.4K | 102.3K | 60.6K | 81.5K | 1.5x | | 7. | ExpireSET EXPIRE TTL | 95.3K | 45.9K | 44.9K | 65.6K | 43.6K3 | 55.5K3 | 1.5x | | 8. | Non-TransactionSET PX GET | 97.5K | 43.5K | 44.6K | 70.7K | 38.5K3 | 49.1K3 | 1.4x | | 9. | Multi-KeyMSET MGET | 103.5K | 46.4K | 49.8K | 75.8K | 43.4K3 | 62.8K3 | 1.4x | | 10. | Sorted SetZADD ZRANGE ZREM | 88.4K | 36.7K | 38.7K | 65.0K | 36.4K3 | 47.1K3 | 1.4x | | 11. | Set ReadSADD SISMEMBER SMEMBERS | 73.8K | 31.1K | 31.2K | 55.4K | 32.7K3 | 39.3K3 | 1.3x | | 12. | Hash MutationHMSET HMGET HDEL | 83.3K | 35.7K | 38.1K | 65.3K | 33.3K3 | 39.9K3 | 1.3x | | 13. | Hash Round-TripHSET HGET HGETALL | 92.5K | 42.1K | 44.5K | 73.6K | 38.0K3 | 41.9K3 | 1.3x | | 14. | List RangeLPUSH RPUSH LRANGE | 69.9K | 30.2K | 32.1K | 55.8K | 30.6K3 | 38.8K3 | 1.3x | | 15. | StreamXADD XRANGE XLEN | 63.6K | 30.7K | 30.8K | 53.9K | 25.3K3 | 27.3K3 | 1.2x | | 16. | List MutationLPUSH RPUSH LPOP RPOP LLEN | 60.9K | 21.6K | 22.0K | 52.0K | 25.3K3 | 30.8K3 | 1.2x | | 17. | GetGET | 184.6K | 105.5K | 106.4K | 161.2K | 67.9K | 89.5K | 1.1x | | 18. | Info / ConfigINFO CONFIG GET | 119.2K | 54.7K4 | 56.8K4 | 116.4K | 48.2K3 | 51.3K3 | 1.0x | | 19. | CounterINCR DECR | 160.2K | 81.2K | 81.1K | 158.4K | 65.5K3 | 81.5K3 | 1.0x |

Medians over the repeats · fastest in bold · Lead = solidis ÷ the fastest other client

1 Sends MULTI/EXEC transactions as an atomic batch 2 Needs RESP3 for Pub/Sub 3 Sends each operation as one batch to keep command order 4 Does not auto-pipeline INFO

| Benchmark | Library | ops/s | cmds/s | p50 | p95 | p99 | p99.9 | CPU/op | GC/op | Memory | Spread | | :------------------------------------------------------------------------------------------------------------------------------------- | :----------------------- | -----: | -----: | -------: | -------: | --------: | --------: | -------: | ------: | -------------------: | -----: | | TransactionSET EXPIRE GET1 KB | solidis | 100.7K | 503.6K | 89.62ms | 160.89ms | 187.93ms | 201.56ms | 19.50µs | 3.33µs | 301.2 MB | ±3.1% | | | ioredis | 23.7K | 118.4K | 408.16ms | 493.31ms | 569.04ms | 633.58ms | 72.91µs | 9.91µs | 645.0 MB | ±3.8% | | | iovalkey | 24.7K | 123.4K | 385.78ms | 469.66ms | 640.65ms | 681.94ms | 72.37µs | 10.44µs | 688.9 MB | ±4.6% | | | node-redis | 51.3K | 256.4K | 180.99ms | 241.51ms | 262.25ms | 283.96ms | 37.55µs | 6.06µs | 541.2 MB | ±3.2% | | | valkey-glide1 | 38.8K | 193.8K | 238.38ms | 299.82ms | 313.65ms | 331.55ms | 53.28µs | 9.07µs | 379.3 MB† | ±1.8% | | | speedkey | 35.9K | 179.5K | 277.21ms | 342.64ms | 364.43ms | 373.82ms | 59.37µs | 5.33µs | 204.3 MB† | ±2.7% | | Transaction MixedSET GET1 KB | solidis | 65.9K | 395.2K | 140.12ms | 201.08ms | 237.46ms | 284.97ms | 31.54µs | 4.60µs | 356.4 MB | ±2.3% | | | ioredis | 13.0K | 78.0K | 746.91ms | 912.98ms | 1034.59ms | 1075.32ms | 119.43µs | 12.04µs | 671.7 MB | ±3.5% | | | iovalkey | 13.8K | 82.7K | 692.32ms | 855.17ms | 930.75ms | 1092.18ms | 114.38µs | 12.96µs | 724.4 MB | ±4.3% | | | node-redis | 35.2K | 211.3K | 264.23ms | 359.42ms | 369.14ms | 379.24ms | 54.67µs | 8.05µs | 492.9 MB | ±0.8% | | | valkey-glide1 | 20.6K | 123.3K | 486.44ms | 527.04ms | 541.73ms | 550.40ms | 104.77µs | 14.67µs | 364.7 MB† | ±0.7% | | | speedkey | 25.2K | 151.2K | 381.09ms | 523.65ms | 570.81ms | 587.39ms | 84.36µs | 6.29µs | 216.3 MB† | ±7.9% | | Pub/SubPUBLISH MESSAGE1 KB | solidis | 157.8K | 157.8K | 14.19ms | 30.18ms | 53.59ms | 58.67ms | 12.57µs | 1.66µs | 152.1 MB | ±3.1% | | | ioredis | 75.8K | 75.8K | 31.61ms | 52.96ms | 69.93ms | 77.67ms | 24.97µs | 3.24µs | 266.5 MB | ±2.4% | | | iovalkey | 83.9K | 83.9K | 30.02ms | 50.37ms | 56.81ms | 66.56ms | 23.90µs | 3.60µs | 284.3 MB | ±2.7% | | | node-redis | 89.9K | 89.9K | 29.30ms | 46.92ms | 61.58ms | 79.30ms | 14.90µs | 4.60µs | 176.7 MB | ±6.4% | | | valkey-glide2 | 24.8K | 24.8K | 96.71ms | 146.53ms | 159.84ms | 311.67ms | 101.62µs | 4.24µs | 111.7 MB† | ±2.3% | | | speedkey2 | 68.0K | 68.0K | 33.34ms | 51.49ms | 65.81ms | 75.61ms | 31.70µs | 1.51µs | 54.6 MB† | ±1.5% | | Set MutationSADD SISMEMBER SREM1 KB | solidis | 99.2K | 297.5K | 92.36ms | 136.70ms | 161.30ms | 174.51ms | 22.82µs | 3.71µs | 275.2 MB | ±1.6% | | | ioredis | 36.6K | 109.9K | 271.34ms | 295.79ms | 312.23ms | 315.78ms | 56.54µs | 7.67µs | 277.1 MB | ±1.5% | | | iovalkey | 37.0K | 111.1K | 271.05ms | 303.97ms | 333.62ms | 338.95ms | 57.32µs | 7.65µs | 320.4 MB | ±4.3% | | | node-redis | 65.7K | 197.0K | 146.10ms | 179.20ms | 189.35ms | 200.47ms | 23.34µs | 5.33µs | 244.2 MB | ±2.7% | | | valkey-glide3 | 43.4K | 130.3K | 221.61ms | 252.08ms | 260.20ms | 266.54ms | 49.84µs | 7.37µs | 349.7 MB† | ±1.5% | | | speedkey3 | 60.8K | 182.5K | 159.42ms | 195.46ms | 199.81ms | 205.00ms | 36.52µs | 2.81µs | 90.2 MB† | ±8.0% | | Pipeline MixedSET INCR GET1 KB | solidis | 78.9K | 236.7K | 114.56ms | 192.41ms | 225.44ms | 241.48ms | 27.68µs | 5.21µs | 344.8 MB | ±4.5% | | | ioredis | 35.9K | 107.8K | 264.87ms | 331.38ms | 343.45ms | 346.09ms | 56.96µs | 8.47µs | 475.6 MB | ±1.7% | | | iovalkey | 35.8K | 107.5K | 265.28ms | 333.22ms | 346.68ms | 351.72ms | 58.40µs | 9.46µs | 569.1 MB | ±1.6% | | | node-redis | 52.8K | 158.5K | 179.20ms | 222.02ms | 241.53ms | 279.57ms | 30.73µs | 7.69µs | 270.7 MB | ±2.5% | | | valkey-glide3 | 34.8K | 104.3K | 270.86ms | 324.85ms | 337.63ms | 347.35ms | 59.71µs | 10.25µs | 336.4 MB† | ±1.8% | | | speedkey3 | 41.6K | 124.8K | 233.59ms | 268.75ms | 282.41ms | 305.11ms | 52.51µs | 4.41µs | 77.0 MB† | ±4.2% | | SetSET1 KB | solidis | 152.4K | 152.4K | 57.05ms | 98.72ms | 126.39ms | 145.74ms | 15.42µs | 2.56µs | 262.2 MB | ±1.2% | | | ioredis | 79.4K | 79.4K | 113.90ms | 186.13ms | 198.77ms | 212.15ms | 24.91µs | 3.51µs | 259.0 MB | ±1.6% | | | iovalkey | 79.4K | 79.4K | 114.73ms | 176.77ms | 189.84ms | 229.35ms | 25.52µs | 3.71µs | 274.3 MB | ±7.0% | | | node-redis | 102.3K | 102.3K | 90.87ms | 120.81ms | 130.57ms | 139.44ms | 15.75µs | 3.93µs | 178.9 MB | ±3.8% | | | valkey-glide | 60.6K | 60.6K | 153.75ms | 182.90ms | 190.55ms | 196.51ms | 35.87µs | 4.09µs | 216.5 MB† | ±1.2% | | | speedkey | 81.5K | 81.5K | 119.08ms | 137.45ms | 145.12ms | 156.49ms | 29.43µs | 1.74µs | 101.3 MB† | ±6.2% | | ExpireSET EXPIRE TTL1 KB | solidis | 95.3K | 286.0K | 94.73ms | 157.68ms | 195.93ms | 321.33ms | 22.40µs | 4.33µs | 331.4 MB | ±7.3% | | | ioredis | 45.9K | 137.8K | 204.06ms | 263.53ms | 272.33ms | 279.61ms | 43.34µs | 7.19µs | 448.5 MB | ±1.3% | | | iovalkey | 44.9K | 134.6K | 215.23ms | 278.96ms | 306.87ms | 322.89ms | 44.88µs | 7.97µs | 484.6 MB | ±5.5% | | | node-redis | 65.6K | 196.8K | 142.20ms | 180.82ms | 191.95ms | 203.52ms | 24.44µs | 6.71µs | 248.7 MB | ±4.1% | | | valkey-glide3 | 43.6K | 130.7K | 217.28ms | 256.20ms | 267.41ms | 276.35ms | 46.83µs | 8.79µs | 409.8 MB† | ±1.9% | | | speedkey3 | 55.5K | 166.5K | 186.55ms | 208.57ms | 218.95ms | 238.14ms | 39.66µs | 3.60µs | 100.2 MB† | ±5.9% | | Non-TransactionSET PX GET1 KB | solidis | 97.5K | 194.9K | 91.85ms | 164.61ms | 196.08ms | 215.22ms | 21.96µs | 3.85µs | 276.5 MB | ±2.0% | | | ioredis | 43.5K | 87.0K | 215.33ms | 293.80ms | 300.29ms | 316.82ms | 46.17µs | 6.15µs | 373.8 MB | ±1.7% | | | iovalkey | 44.6K | 89.1K | 215.02ms | 280.90ms | 301.06ms | 307.90ms | 44.01µs | 6.49µs | 394.2 MB | ±1.8% | | | node-redis | 70.7K | 141.4K | 132.98ms | 167.31ms | 178.58ms | 191.14ms | 23.08µs | 5.44µs | 229.7 MB | ±1.5% | | | valkey-glide3 | 38.5K | 76.9K | 241.10ms | 287.24ms | 299.65ms | 310.94ms | 54.65µs | 8.49µs | 314.1 MB† | ±1.4% | | | speedkey3 | 49.1K | 98.2K | 197.52ms | 263.74ms | 273.51ms | 283.53ms | 43.93µs | 3.58µs | 167.4 MB† | ±9.6% | | Multi-KeyMSET MGET1 KB | solidis | 103.5K | 206.9K | 91.13ms | 124.77ms | 143.89ms | 162.67ms | 20.81µs | 3.21µs | 347.9 MB | ±3.9% | | | ioredis | 46.4K | 92.7K | 218.12ms | 237.36ms | 245.38ms | 261.68ms | 49.90µs | 5.82µs | 416.9 MB | ±2.3% | | | iovalkey | 49.8K | 99.6K | 200.51ms | 230.73ms | 241.00ms | 270.13ms | 43.07µs | 5.60µs | 431.2 MB | ±2.8% | | | node-redis | 75.8K | 151.6K | 125.73ms | 160.24ms | 178.72ms | 193.97ms | 23.79µs | 5.05µs | 320.8 MB | ±2.0% | | | valkey-glide3 | 43.4K | 86.7K | 218.42ms | 256.38ms | 271.15ms | 276.57ms | 49.76µs | 7.07µs | 279.2 MB† | ±1.7% | | | speedkey3 | 62.8K | 125.6K | 158.59ms | 196.65ms | 205.95ms | 210.81ms | 34.60µs | 3.16µs | 170.8 MB† | ±3.6% | | Sorted SetZADD ZRANGE ZREM1 KB | solidis | 88.4K | 265.2K | 101.85ms | 164.10ms | 200.68ms | 230.03ms | 25.94µs | 4.01µs | 340.1 MB | ±6.0% | | | ioredis | 36.7K | 110.0K | 273.50ms | 308.57ms | 350.07ms | 357.84ms | 57.54µs | 7.89µs | 401.2 MB | ±3.2% | | | iovalkey | 38.7K | 116.1K | 263.77ms | 286.75ms | 292.44ms | 297.33ms | 55.86µs | 7.92µs | 389.7 MB | ±1.7% | | | node-redis | 65.0K | 195.1K | 148.87ms | 176.80ms | 185.67ms | 191.88ms | 24.39µs | 5.57µs | 282.6 MB | ±2.8% | | | valkey-glide3 | 36.4K | 109.3K | 260.27ms | 301.34ms | 311.14ms | 344.21ms | 55.15µs | 8.82µs | 353.2 MB† | ±2.0% | | | speedkey3 | 47.1K | 141.3K | 205.68ms | 262.68ms | 275.64ms | 278.96ms | 44.96µs | 3.55µs | 250.4 MB† | ±5.0% | | Set ReadSADD SISMEMBER SMEMBERS1 KB | solidis | 73.8K | 221.5K | 122.83ms | 187.84ms | 222.38ms | 236.07ms | 31.21µs | 4.98µs | 328.3 MB | ±2.9% | | | ioredis | 31.1K | 93.4K | 328.99ms | 359.85ms | 405.11ms | 435.44ms | 68.06µs | 8.82µs | 377.9 MB | ±2.6% | | | iovalkey | 31.2K | 93.6K | 322.73ms | 357.31ms | 367.72ms | 375.85ms | 67.84µs | 9.23µs | 386.4 MB | ±1.5% | | | node-redis | 55.4K | 166.2K | 172.33ms | 210.32ms | 225.50ms | 236.42ms | 28.81µs | 6.72µs | 265.9 MB | ±1.7% | | | valkey-glide3 | 32.7K | 98.1K | 293.52ms | 336.99ms | 345.97ms | 352.81ms | 65.10µs | 9.33µs | 321.8 MB† | ±1.5% | | | speedkey3 | 39.3K | 117.9K | 246.92ms | 320.08ms | 334.71ms | 351.13ms | 54.67µs | 4.14µs | 79.7 MB† | ±5.0% | | Hash MutationHMSET HMGET HDEL1 KB | solidis | 83.3K | 250.0K | 109.71ms | 162.77ms | 176.26ms | 197.47ms | 27.60µs | 3.86µs | 389.4 MB | ±3.0% | | | ioredis | 35.7K | 107.1K | 276.09ms | 308.65ms | 340.90ms | 358.32ms | 70.09µs | 7.83µs | 452.0 MB | ±1.7% | | | iovalkey | 38.1K | 114.2K | 261.65ms | 292.94ms | 311.30ms | 318.67ms | 66.76µs | 8.01µs | 452.7 MB | ±2.4% | | | node-redis | 65.3K | 195.9K | 144.09ms | 185.38ms | 192.97ms | 198.58ms | 26.38µs | 4.66µs | 330.4 MB | ±2.7% | | | valkey-glide3 | 33.3K | 99.9K | 294.93ms | 330.74ms | 342.18ms | 356.41ms | 63.12µs | 9.02µs | 334.9 MB† | ±1.3% | | | speedkey3 | 39.9K | 119.8K | 243.52ms | 299.46ms | 317.91ms | 330.12ms | 52.47µs | 3.94µs | 192.1 MB† | ±2.8% | | Hash Round-TripHSET HGET HGETALL1 KB | solidis | 92.5K | 277.6K | 93.68ms | 168.86ms | 202.67ms | 227.88ms | 24.99µs | 3.77µs | 377.2 MB | ±4.3% | | | ioredis | 42.1K | 126.3K | 234.39ms | 291.05ms | 425.20ms | 445.46ms | 52.44µs | 6.74µs | 488.4 MB | ±4.8% | | | iovalkey | 44.5K | 133.6K | 228.94ms | 275.72ms | 295.75ms | 303.14ms | 50.46µs | 6.91µs | 503.7 MB | ±4.7% | | | node-redis | 73.6K | 220.9K | 126.25ms | 172.10ms | 183.33ms | 198.16ms | 23.66µs | 4.52µs | 338.0 MB | ±5.6% | | | valkey-glide3 | 38.0K | 113.9K | 244.41ms | 309.66ms | 320.46ms | 329.74ms | 53.68µs | 8.00µs | 326.0 MB† | ±2.9% | | | speedkey3 | 41.9K | 125.7K | 231.40ms | 295.19ms | 313.10ms | 336.22ms | 51.63µs | 3.73µs | 167.1 MB† | ±5.2% | | List RangeLPUSH RPUSH LRANGE1 KB | solidis | 69.9K | 209.8K | 126.84ms | 193.98ms | 210.90ms | 244.86ms | 32.49µs | 4.96µs | 382.6 MB | ±1.5% | | | ioredis | 30.2K | 90.6K | 328.74ms | 365.19ms | 395.65ms | 414.20ms | 83.00µs | 9.95µs | 443.3 MB | ±1.5% | | | iovalkey | 32.1K | 96.2K | 315.71ms | 344.10ms | 355.59ms | 364.69ms | 76.27µs | 9.92µs | 488.0 MB | ±2.2% | | | node-redis | 55.8K | 167.3K | 167.00ms | 215.52ms | 224.07ms | 234.10ms | 31.38µs | 6.23µs | 327.7 MB | ±1.1% | | | valkey-glide3 | 30.6K | 91.7K | 317.69ms | 365.49ms | 382.91ms | 399.14ms | 70.80µs | 10.16µs | 301.8 MB† | ±1.1% | | | speedkey3 | 38.8K | 116.5K | 249.10ms | 311.48ms | 327.65ms | 333.98ms | 55.73µs | 4.81µs | 180.2 MB† | ±4.8% | | StreamXADD XRANGE XLEN1 KB | solidis | 63.6K | 190.9K | 135.77ms | 213.77ms | 243.95ms | 254.15ms | 34.39µs | 6.21µs | 398.9 MB | ±2.0% | | | ioredis | 30.7K | 92.2K | 311.12ms | 371.80ms | 382.60ms | 391.00ms | 63.08µs | 8.48µs | 481.3 MB | ±1.8% | | | iovalkey | 30.8K | 92.3K | 313.85ms | 367.92ms | 390.06ms | 397.52ms | 62.82µs | 8.99µs | 494.3 MB | ±2.1% | | | node-redis | 53.9K | 161.8K | 176.55ms | 224.46ms | 237.40ms | 246.75ms | 30.59µs | 7.61µs | 327.2 MB | ±2.4% | | | valkey-glide3 | 25.3K | 76.0K | 366.32ms | 451.84ms | 495.74ms | 550.42ms | 79.44µs | 12.18µs | 388.6 MB† | ±2.0% | | | speedkey3 | 27.3K | 81.9K | 359.57ms | 441.96ms | 485.70ms | 506.40ms | 74.68µs | 6.08µs | 208.2 MB† | ±3.3% | | List MutationLPUSH RPUSH LPOP RPOP LLEN1 KB | solidis | 60.9K | 304.6K | 152.59ms | 219.83ms | 279.90ms | 297.95ms | 34.62µs | 4.33µs | 432.5 MB | ±4.1% | | | ioredis | 21.6K | 108.2K | 461.84ms | 487.03ms | 494.98ms | 498.10ms | 102.20µs | 15.09µs | 439.0 MB | ±1.2% | | | iovalkey | 22.0K | 110.2K | 452.17ms | 475.01ms | 479.00ms | 481.18ms | 103.26µs | 14.99µs | 437.7 MB | ±0.9% | | | node-redis | 52.0K | 260.2K | 176.77ms | 240.68ms | 251.63ms | 262.19ms | 35.60µs | 4.14µs | 378.1 MB | ±1.5% | | | valkey-glide3 | 25.3K | 126.5K | 392.42ms | 431.54ms | 444.68ms | 455.07ms | 80.44µs | 11.82µs | 333.9 MB† | ±0.8% | | | speedkey3 | 30.8K | 153.8K | 319.25ms | 394.61ms | 403.21ms | 407.01ms | 70.77µs | 5.09µs | 103.1 MB† | ±2.5% | | GetGET1 KB | solidis | 184.6K | 184.6K | 50.07ms | 81.22ms | 94.68ms | 104.98ms | 11.72µs | 1.73µs | 198.3 MB | ±3.4% | | | ioredis | 105.5K | 105.5K | 87.33ms | 131.25ms | 144.32ms | 150.30ms | 18.58µs | 3.06µs | 284.4 MB | ±1.6% | | | iovalkey | 106.4K | 106.4K | 87.66ms | 128.46ms | 142.94ms | 151.63ms | 19.22µs | 3.32µs | 258.2 MB | ±2.0% | | | node-redis | 161.2K | 161.2K | 54.44ms | 87.95ms | 96.01ms | 102.93ms | 14.65µs | 2.07µs | 92.0 MB | ±2.2% | | | valkey-glide | 67.9K | 67.9K | 121.54ms | 223.02ms | 293.85ms | 372.79ms | 34.61µs | 3.19µs | 83.7 MB† | ±4.7% | | | speedkey | 89.5K | 89.5K | 107.37ms | 139.97ms | 153.29ms | 171.80ms | 25.94µs | 2.14µs | 8.5 MB† | ±1.7% | | Info / ConfigINFO CONFIG GET | solidis | 119.2K | 238.3K | 73.49ms | 138.66ms | 159.23ms | 169.53ms | 18.48µs | 3.00µs | 302.7 MB | ±2.3% | | | ioredis4 | 54.7K | 109.5K | 171.27ms | 244.90ms | 266.28ms | 284.27ms | 33.81µs | 4.89µs | 296.0 MB | ±3.3% | | | iovalkey4 | 56.8K | 113.6K | 164.71ms | 231.97ms | 249.99ms | 268.53ms | 34.00µs | 5.34µs | 321.0 MB | ±2.0% | | | node-redis | 116.4K | 232.8K | 77.44ms | 127.94ms | 141.36ms | 150.06ms | 18.22µs | 2.99µs | 266.9 MB | ±4.5% | | | valkey-glide3 | 48.2K | 96.4K | 188.37ms | 296.58ms | 336.49ms | 368.85ms | 45.95µs | 8.22µs | 335.1 MB† | ±5.8% | | | speedkey3 | 51.3K | 102.6K | 191.51ms | 232.31ms | 249.57ms | 258.94ms | 42.04µs | 4.45µs | 203.8 MB† | ±2.4% | | CounterINCR DECR | solidis | 160.2K | 320.4K | 55.27ms | 110.54ms | 132.27ms | 200.76ms | 12.80µs | 2.33µs | 268.4 MB | ±4.3% | | | ioredis | 81.2K | 162.4K | 113.14ms | 177.92ms | 184.53ms | 189.74ms | 25.74µs | 4.62µs | 350.9 MB | ±1.6% | | | iovalkey | 81.1K | 162.2K | 116.06ms | 165.65ms | 174.51ms | 180.60ms | 26.40µs | 4.85µs | 376.9 MB | ±2.8% | | | node-redis | 158.4K | 316.8K | 56.60ms | 91.51ms | 111.92ms | 152.19ms | 14.13µs | 2.34µs | 248.1 MB | ±16.5% | | | valkey-glide3 | 65.5K | 131.0K | 142.89ms | 184.46ms | 208.37ms | 324.82ms | 32.49µs | 6.20µs | 366.3 MB† | ±2.9% | | | speedkey3 | 81.5K | 163.0K | 126.68ms | 158.80ms | 173.31ms | 184.79ms | 27.58µs | 2.64µs | 276.4 MB† | ±8.1% |

† Native memory not counted

| Parameter | Value | | :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | CPU | AMD EPYC 7763 64-Core Processor (4 threads)AMD EPYC 9V74 80-Core Processor (4 threads)AMD EPYC 9V45 96-Core Processor (4 threads)INTEL(R) XEON(R) PLATINUM 8573C (4 threads) | | Memory | 15.6 GB | | Operating system | linux x64 (6.17.0-1022-azure) | | Node.js | v22.23.3 | | Server | Redis 8.10.2