diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index 9b7198c..644067b 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -116,6 +116,14 @@ jobs: if: steps.check.outputs.pr == 'true' run: npm run benchmark:replace:readme -- merged.benchmark + - name: Update website benchmark data + if: steps.check.outputs.pr == 'true' + run: npm run benchmark:replace:website -- merged.benchmark + + - name: Lint and format + if: steps.check.outputs.pr == 'true' + run: npm run lint + - name: Create pull request if: steps.check.outputs.pr == 'true' uses: peter-evans/create-pull-request@v8 @@ -131,4 +139,5 @@ jobs: - Ran **19** benchmark cases independently - Merged all results into a single report - Updated the benchmark section in all `README*.md` files (localized) + - Updated website benchmark data (`benchmarks`, `home`, i18n) labels: benchmark,automated diff --git a/.github/workflows/bundle.yml b/.github/workflows/bundle.yml index f973230..6ce9022 100644 --- a/.github/workflows/bundle.yml +++ b/.github/workflows/bundle.yml @@ -56,6 +56,10 @@ jobs: echo "pr=false" >> "$GITHUB_OUTPUT" fi + - name: Lint and format + if: steps.check.outputs.pr == 'true' + run: npm run lint + - name: Create pull request if: steps.check.outputs.pr == 'true' uses: peter-evans/create-pull-request@v8 diff --git a/README.ko.md b/README.ko.md index 5c63465..965352a 100644 --- a/README.ko.md +++ b/README.ko.md @@ -1,8 +1,10 @@

- Zero-dependency RESP client for Redis. Fastest by design. -
+
@@ -118,43 +120,45 @@ await client.subscribe('events');
#
Solidis vs ioredis
측정일 2026-06-20 10:28:46 · linux x64 · Node.js v22.22.3
+
### ioredis 대비 최대 **2.1x 빠릅니다**!
---
+
**15**개 중 **15**개 벤치마크 우위 · 평균 **72%** 성능 향상 · 최대 **109%** 성능 향상
-*100,000번 반복 × 10,000 동시 실행 · 1 KB 페이로드 · 10회 측정*
-
-| | 벤치마크 | 명령어 | solidis | ioredis | 차이 | 성능 |
-|---:|:---|:---:|:---:|:---:|:---:|:---|
-|
| **Set 변경** | SADD SISMEMBER SREM | **1600ms** | 3336ms | **2.1x** ![]()
| `██████████` |
-|
| **List 범위** | LPUSH RPUSH LRANGE | **1914ms** | 3635ms | **1.9x** ![]()
| `████████░░` |
-|
| **Multi-Key** | MSET MGET | **1646ms** | 3124ms | **1.9x** ![]()
| `████████░░` |
-| 4. | **List 변경** | LPUSH RPUSH LPOP RPOP LLEN | **2419ms** | 4482ms | **1.9x** ![]()
| `████████░░` |
-| 5. | **Set** | SET | **715ms** | 1285ms | **1.8x** ![]()
| `███████░░░` |
-| 6. | **Expire** | SET EXPIRE TTL | **1422ms** | 2521ms | **1.8x** ![]()
| `███████░░░` |
-| 7. | **Hash 변경** | HMSET HMGET HDEL | **1971ms** | 3487ms | **1.8x** ![]()
| `███████░░░` |
-| 8. | **Sorted Set** | ZADD ZRANGE ZREM | **1881ms** | 3286ms | **1.7x** ![]()
| `███████░░░` |
-| 9. | **비트랜잭션** | SETPX GET | **1263ms** | 2102ms | **1.7x** ![]()
| `██████░░░░` |
-| 10. | **Stream** | XADD XRANGE XLEN | **1984ms** | 3266ms | **1.6x** ![]()
| `██████░░░░` |
-| 11. | **Set 조회** | SADD SISMEMBER SMEMBERS | **1940ms** | 3120ms | **1.6x** ![]()
| `██████░░░░` |
-| 12. | **파이프라인 혼합** | SET INCR GET | **1787ms** | 2839ms | **1.6x**
| `█████░░░░░` |
-| 13. | **Counter** | INCR DECR | **952ms** | 1446ms | **1.5x**
| `█████░░░░░` |
-| 14. | **Hash 왕복** | HSET HGET HGETALL | **1859ms** | 2798ms | **1.5x**
| `█████░░░░░` |
-| 15. | **Get Buffer** | GETBUFFER | **628ms** | 928ms | **1.5x**
| `████░░░░░░` |
+_100,000번 반복 × 10,000 동시 실행 · 1 KB 페이로드 · 10회 측정_
+
+| | 벤치마크 | 명령어 | solidis | ioredis | 차이 | 성능 |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------ | :-----------------------------------------------------------------------------------------------------: | :--------: | :-----: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------- |
+|
| **Set 변경** | SADD SISMEMBER SREM | **1600ms** | 3336ms | **2.1x** ![]()
| `██████████` |
+|
| **List 범위** | LPUSH RPUSH LRANGE | **1914ms** | 3635ms | **1.9x** ![]()
| `████████░░` |
+|
| **Multi-Key** | MSET MGET | **1646ms** | 3124ms | **1.9x** ![]()
| `████████░░` |
+| 4. | **List 변경** | LPUSH RPUSH LPOP RPOP LLEN | **2419ms** | 4482ms | **1.9x** ![]()
| `████████░░` |
+| 5. | **Set** | SET | **715ms** | 1285ms | **1.8x** ![]()
| `███████░░░` |
+| 6. | **Expire** | SET EXPIRE TTL | **1422ms** | 2521ms | **1.8x** ![]()
| `███████░░░` |
+| 7. | **Hash 변경** | HMSET HMGET HDEL | **1971ms** | 3487ms | **1.8x** ![]()
| `███████░░░` |
+| 8. | **Sorted Set** | ZADD ZRANGE ZREM | **1881ms** | 3286ms | **1.7x** ![]()
| `███████░░░` |
+| 9. | **비트랜잭션** | SETPX GET | **1263ms** | 2102ms | **1.7x** ![]()
| `██████░░░░` |
+| 10. | **Stream** | XADD XRANGE XLEN | **1984ms** | 3266ms | **1.6x** ![]()
| `██████░░░░` |
+| 11. | **Set 조회** | SADD SISMEMBER SMEMBERS | **1940ms** | 3120ms | **1.6x** ![]()
| `██████░░░░` |
+| 12. | **파이프라인 혼합** | SET INCR GET | **1787ms** | 2839ms | **1.6x**
| `█████░░░░░` |
+| 13. | **Counter** | INCR DECR | **952ms** | 1446ms | **1.5x**
| `█████░░░░░` |
+| 14. | **Hash 왕복** | HSET HGET HGETALL | **1859ms** | 2798ms | **1.5x**
| `█████░░░░░` |
+| 15. | **Get Buffer** | GETBUFFER | **628ms** | 928ms | **1.5x**
| `████░░░░░░` |
### 엄격 비교가 불가능한 벤치마크
라이브러리별 고유 동작으로 인해 엄밀한 비교가 어려운 벤치마크입니다.
-| | 벤치마크 | 명령어 | solidis | ioredis | 차이 | 성능 |
-|---:|:---|:---:|:---:|:---:|:---:|:---|
-| 16. | **트랜잭션** | SET EXPIRE GET | 1261ms | 6006ms | **4.8x** ![]()
| `██████████` |
-| 17. | **트랜잭션 혼합** | SET GET | 1621ms | 6977ms | **4.3x** ![]()
| `██████████` |
-| 18. | **Pub/Sub** | PUBLISH MESSAGE | 775ms | 2569ms | **3.3x** ![]()
| `██████████` |
-| 19. | **Info / Config** | INFO CONFIGGET | 1119ms | 1745ms | **1.6x**
| `█████░░░░░` |
+| | 벤치마크 | 명령어 | solidis | ioredis | 차이 | 성능 |
+| --: | :---------------- | :-------------------------------------------------------------------: | :-----: | :-----: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------- |
+| 16. | **트랜잭션** | SET EXPIRE GET | 1261ms | 6006ms | **4.8x** ![]()
| `██████████` |
+| 17. | **트랜잭션 혼합** | SET GET | 1621ms | 6977ms | **4.3x** ![]()
| `██████████` |
+| 18. | **Pub/Sub** | PUBLISH MESSAGE | 775ms | 2569ms | **3.3x** ![]()
| `██████████` |
+| 19. | **Info / Config** | INFO CONFIGGET | 1119ms | 1745ms | **1.6x**
| `█████░░░░░` |
`solidis`의 `ioredis` (기준) 대비 성능 향상률 순으로 정렬. 소요 시간 = 반복 측정의 중앙값.
@@ -169,38 +173,38 @@ await client.subscribe('events');
상세 지표 테이블 펼치기
-| 벤치마크 | 라이브러리 | ops/s | cmds/s | 소요 시간 | 분산 |
-|:---|:---|---:|---:|---:|---:|
-| **Set 변경: SADD SISMEMBER SREM**
1 KB | **solidis** | 62.5K | 187.5K | 1600ms | ±6.0% |
-| | ioredis | 30.0K | 89.9K | 3336ms | ±1.1% |
-| **List 범위: LPUSH RPUSH LRANGE**
1 KB | **solidis** | 52.3K | 156.8K | 1914ms | ±2.6% |
-| | ioredis | 27.5K | 82.5K | 3635ms | ±1.2% |
-| **Multi-Key: MSET MGET**
1 KB | **solidis** | 60.7K | 121.5K | 1646ms | ±1.4% |
-| | ioredis | 32.0K | 64.0K | 3124ms | ±4.0% |
-| **List 변경: LPUSH RPUSH LPOP RPOP LLEN**
1 KB | **solidis** | 41.3K | 206.7K | 2419ms | ±8.0% |
-| | ioredis | 22.3K | 111.6K | 4482ms | ±0.9% |
-| **Set: SET**
1 KB | **solidis** | 139.8K | 139.8K | 715ms | ±3.4% |
-| | ioredis | 77.8K | 77.8K | 1285ms | ±2.3% |
-| **Expire: SET EXPIRE TTL**
1 KB | **solidis** | 70.3K | 211.0K | 1422ms | ±2.4% |
-| | ioredis | 39.7K | 119.0K | 2521ms | ±2.2% |
-| **Hash 변경: HMSET HMGET HDEL**
1 KB | **solidis** | 50.7K | 152.2K | 1971ms | ±7.5% |
-| | ioredis | 28.7K | 86.0K | 3487ms | ±1.2% |
-| **Sorted Set: ZADD ZRANGE ZREM**
1 KB | **solidis** | 53.2K | 159.5K | 1881ms | ±4.0% |
-| | ioredis | 30.4K | 91.3K | 3286ms | ±2.2% |
-| **비트랜잭션: SETPX GET**
1 KB | **solidis** | 79.2K | 158.4K | 1263ms | ±5.1% |
-| | ioredis | 47.6K | 95.1K | 2102ms | ±1.7% |
-| **Stream: XADD XRANGE XLEN**
1 KB | **solidis** | 50.4K | 151.2K | 1984ms | ±6.8% |
-| | ioredis | 30.6K | 91.8K | 3266ms | ±3.3% |
-| **Set 조회: SADD SISMEMBER SMEMBERS**
1 KB | **solidis** | 51.6K | 154.7K | 1940ms | ±2.8% |
-| | ioredis | 32.1K | 96.2K | 3120ms | ±2.0% |
-| **파이프라인 혼합: SET INCR GET**
1 KB | **solidis** | 56.0K | 167.9K | 1787ms | ±2.2% |
-| | ioredis | 35.2K | 105.7K | 2839ms | ±1.6% |
-| **Counter: INCR DECR**
1 KB | **solidis** | 105.0K | 210.0K | 952ms | ±7.2% |
-| | ioredis | 69.2K | 138.3K | 1446ms | ±1.3% |
-| **Hash 왕복: HSET HGET HGETALL**
1 KB | **solidis** | 53.8K | 161.4K | 1859ms | ±7.5% |
-| | ioredis | 35.7K | 107.2K | 2798ms | ±2.5% |
-| **Get Buffer: GETBUFFER**
1 KB | **solidis** | 159.3K | 159.3K | 628ms | ±7.9% |
-| | ioredis | 107.7K | 107.7K | 928ms | ±4.3% |
+| 벤치마크 | 라이브러리 | ops/s | cmds/s | 소요 시간 | 분산 |
+| :----------------------------------------------------------------------------------------------------------------------------------------- | :---------- | -----: | -----: | --------: | ----: |
+| **Set 변경: SADD SISMEMBER SREM**
1 KB | **solidis** | 62.5K | 187.5K | 1600ms | ±6.0% |
+| | ioredis | 30.0K | 89.9K | 3336ms | ±1.1% |
+| **List 범위: LPUSH RPUSH LRANGE**
1 KB | **solidis** | 52.3K | 156.8K | 1914ms | ±2.6% |
+| | ioredis | 27.5K | 82.5K | 3635ms | ±1.2% |
+| **Multi-Key: MSET MGET**
1 KB | **solidis** | 60.7K | 121.5K | 1646ms | ±1.4% |
+| | ioredis | 32.0K | 64.0K | 3124ms | ±4.0% |
+| **List 변경: LPUSH RPUSH LPOP RPOP LLEN**
1 KB | **solidis** | 41.3K | 206.7K | 2419ms | ±8.0% |
+| | ioredis | 22.3K | 111.6K | 4482ms | ±0.9% |
+| **Set: SET**
1 KB | **solidis** | 139.8K | 139.8K | 715ms | ±3.4% |
+| | ioredis | 77.8K | 77.8K | 1285ms | ±2.3% |
+| **Expire: SET EXPIRE TTL**
1 KB | **solidis** | 70.3K | 211.0K | 1422ms | ±2.4% |
+| | ioredis | 39.7K | 119.0K | 2521ms | ±2.2% |
+| **Hash 변경: HMSET HMGET HDEL**
1 KB | **solidis** | 50.7K | 152.2K | 1971ms | ±7.5% |
+| | ioredis | 28.7K | 86.0K | 3487ms | ±1.2% |
+| **Sorted Set: ZADD ZRANGE ZREM**
1 KB | **solidis** | 53.2K | 159.5K | 1881ms | ±4.0% |
+| | ioredis | 30.4K | 91.3K | 3286ms | ±2.2% |
+| **비트랜잭션: SETPX GET**
1 KB | **solidis** | 79.2K | 158.4K | 1263ms | ±5.1% |
+| | ioredis | 47.6K | 95.1K | 2102ms | ±1.7% |
+| **Stream: XADD XRANGE XLEN**
1 KB | **solidis** | 50.4K | 151.2K | 1984ms | ±6.8% |
+| | ioredis | 30.6K | 91.8K | 3266ms | ±3.3% |
+| **Set 조회: SADD SISMEMBER SMEMBERS**
1 KB | **solidis** | 51.6K | 154.7K | 1940ms | ±2.8% |
+| | ioredis | 32.1K | 96.2K | 3120ms | ±2.0% |
+| **파이프라인 혼합: SET INCR GET**
1 KB | **solidis** | 56.0K | 167.9K | 1787ms | ±2.2% |
+| | ioredis | 35.2K | 105.7K | 2839ms | ±1.6% |
+| **Counter: INCR DECR**
1 KB | **solidis** | 105.0K | 210.0K | 952ms | ±7.2% |
+| | ioredis | 69.2K | 138.3K | 1446ms | ±1.3% |
+| **Hash 왕복: HSET HGET HGETALL**
1 KB | **solidis** | 53.8K | 161.4K | 1859ms | ±7.5% |
+| | ioredis | 35.7K | 107.2K | 2798ms | ±2.5% |
+| **Get Buffer: GETBUFFER**
1 KB | **solidis** | 159.3K | 159.3K | 628ms | ±7.9% |
+| | ioredis | 107.7K | 107.7K | 928ms | ±4.3% |
벤치마크 설정 펼치기
-| 항목 | 값 |
-|:----------|:------|
-| 모드 | `autopipeline` |
-| 페이로드 크기 | 1 KB |
-| 반복 횟수 | 100,000 |
-| 워밍업 | 1,000 |
-| 클라이언트 수 | 1 |
-| 클라이언트당 동시 실행 | 10000 |
-| 총 동시 실행 | 10000 |
-| 측정 횟수 | 10 |
-| 쿨다운 | 2500ms |
-| 플랫폼 | linux x64 |
-| Node.js | v22.22.3 |
-| 날짜 | 2026-06-20 10:28:46 |
+| 항목 | 값 |
+| :--------------------- | :------------------ |
+| 모드 | `autopipeline` |
+| 페이로드 크기 | 1 KB |
+| 반복 횟수 | 100,000 |
+| 워밍업 | 1,000 |
+| 클라이언트 수 | 1 |
+| 클라이언트당 동시 실행 | 10000 |
+| 총 동시 실행 | 10000 |
+| 측정 횟수 | 10 |
+| 쿨다운 | 2500ms |
+| 플랫폼 | linux x64 |
+| Node.js | v22.22.3 |
+| 날짜 | 2026-06-20 10:28:46 |

- Zero-dependency RESP client for Redis. Fastest by design. -
+
@@ -118,43 +120,45 @@ await client.subscribe('events');
#
Solidis vs ioredis
Generated on 2026-06-20 10:28:46 · linux x64 · Node.js v22.22.3
+
### Up to **2.1x faster** than ioredis!
---
+
**15** / **15** benchmarks won · **72%** average speed improvement · **109%** peak speed improvement
-*100,000 iterations × 10,000 concurrency · 1 KB payload · 10 repeats*
-
-| | Benchmark | Commands | solidis | ioredis | Difference | Performance |
-|---:|:---|:---:|:---:|:---:|:---:|:---|
-|
| **Set Mutation** | SADD SISMEMBER SREM | **1600ms** | 3336ms | **2.1x** ![]()
| `██████████` |
-|
| **List Range** | LPUSH RPUSH LRANGE | **1914ms** | 3635ms | **1.9x** ![]()
| `████████░░` |
-|
| **Multi-Key** | MSET MGET | **1646ms** | 3124ms | **1.9x** ![]()
| `████████░░` |
-| 4. | **List Mutation** | LPUSH RPUSH LPOP RPOP LLEN | **2419ms** | 4482ms | **1.9x** ![]()
| `████████░░` |
-| 5. | **Set** | SET | **715ms** | 1285ms | **1.8x** ![]()
| `███████░░░` |
-| 6. | **Expire** | SET EXPIRE TTL | **1422ms** | 2521ms | **1.8x** ![]()
| `███████░░░` |
-| 7. | **Hash Mutation** | HMSET HMGET HDEL | **1971ms** | 3487ms | **1.8x** ![]()
| `███████░░░` |
-| 8. | **Sorted Set** | ZADD ZRANGE ZREM | **1881ms** | 3286ms | **1.7x** ![]()
| `███████░░░` |
-| 9. | **Non-Transaction** | SETPX GET | **1263ms** | 2102ms | **1.7x** ![]()
| `██████░░░░` |
-| 10. | **Stream** | XADD XRANGE XLEN | **1984ms** | 3266ms | **1.6x** ![]()
| `██████░░░░` |
-| 11. | **Set Read** | SADD SISMEMBER SMEMBERS | **1940ms** | 3120ms | **1.6x** ![]()
| `██████░░░░` |
-| 12. | **Pipeline Mixed** | SET INCR GET | **1787ms** | 2839ms | **1.6x**
| `█████░░░░░` |
-| 13. | **Counter** | INCR DECR | **952ms** | 1446ms | **1.5x**
| `█████░░░░░` |
-| 14. | **Hash Round-Trip** | HSET HGET HGETALL | **1859ms** | 2798ms | **1.5x**
| `█████░░░░░` |
-| 15. | **Get Buffer** | GETBUFFER | **628ms** | 928ms | **1.5x**
| `████░░░░░░` |
+_100,000 iterations × 10,000 concurrency · 1 KB payload · 10 repeats_
+
+| | Benchmark | Commands | solidis | ioredis | Difference | Performance |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------ | :-----------------------------------------------------------------------------------------------------: | :--------: | :-----: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------- |
+|
| **Set Mutation** | SADD SISMEMBER SREM | **1600ms** | 3336ms | **2.1x** ![]()
| `██████████` |
+|
| **List Range** | LPUSH RPUSH LRANGE | **1914ms** | 3635ms | **1.9x** ![]()
| `████████░░` |
+|
| **Multi-Key** | MSET MGET | **1646ms** | 3124ms | **1.9x** ![]()
| `████████░░` |
+| 4. | **List Mutation** | LPUSH RPUSH LPOP RPOP LLEN | **2419ms** | 4482ms | **1.9x** ![]()
| `████████░░` |
+| 5. | **Set** | SET | **715ms** | 1285ms | **1.8x** ![]()
| `███████░░░` |
+| 6. | **Expire** | SET EXPIRE TTL | **1422ms** | 2521ms | **1.8x** ![]()
| `███████░░░` |
+| 7. | **Hash Mutation** | HMSET HMGET HDEL | **1971ms** | 3487ms | **1.8x** ![]()
| `███████░░░` |
+| 8. | **Sorted Set** | ZADD ZRANGE ZREM | **1881ms** | 3286ms | **1.7x** ![]()
| `███████░░░` |
+| 9. | **Non-Transaction** | SETPX GET | **1263ms** | 2102ms | **1.7x** ![]()
| `██████░░░░` |
+| 10. | **Stream** | XADD XRANGE XLEN | **1984ms** | 3266ms | **1.6x** ![]()
| `██████░░░░` |
+| 11. | **Set Read** | SADD SISMEMBER SMEMBERS | **1940ms** | 3120ms | **1.6x** ![]()
| `██████░░░░` |
+| 12. | **Pipeline Mixed** | SET INCR GET | **1787ms** | 2839ms | **1.6x**
| `█████░░░░░` |
+| 13. | **Counter** | INCR DECR | **952ms** | 1446ms | **1.5x**
| `█████░░░░░` |
+| 14. | **Hash Round-Trip** | HSET HGET HGETALL | **1859ms** | 2798ms | **1.5x**
| `█████░░░░░` |
+| 15. | **Get Buffer** | GETBUFFER | **628ms** | 928ms | **1.5x**
| `████░░░░░░` |
### Non Strictly Comparable Benchmarks
These benchmarks have library-specific behavior that prevents a strictly fair comparison.
-| | Benchmark | Commands | solidis | ioredis | Difference | Performance |
-|---:|:---|:---:|:---:|:---:|:---:|:---|
-| 16. | **Transaction** | SET EXPIRE GET | 1261ms | 6006ms | **4.8x** ![]()
| `██████████` |
-| 17. | **Transaction Mixed** | SET GET | 1621ms | 6977ms | **4.3x** ![]()
| `██████████` |
-| 18. | **Pub/Sub** | PUBLISH MESSAGE | 775ms | 2569ms | **3.3x** ![]()
| `██████████` |
-| 19. | **Info / Config** | INFO CONFIGGET | 1119ms | 1745ms | **1.6x**
| `█████░░░░░` |
+| | Benchmark | Commands | solidis | ioredis | Difference | Performance |
+| --: | :-------------------- | :-------------------------------------------------------------------: | :-----: | :-----: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------- |
+| 16. | **Transaction** | SET EXPIRE GET | 1261ms | 6006ms | **4.8x** ![]()
| `██████████` |
+| 17. | **Transaction Mixed** | SET GET | 1621ms | 6977ms | **4.3x** ![]()
| `██████████` |
+| 18. | **Pub/Sub** | PUBLISH MESSAGE | 775ms | 2569ms | **3.3x** ![]()
| `██████████` |
+| 19. | **Info / Config** | INFO CONFIGGET | 1119ms | 1745ms | **1.6x**
| `█████░░░░░` |
Ranked by performance gain of `solidis` over `ioredis` (baseline). Elapsed = median time across repeats.
@@ -169,38 +173,38 @@ await client.subscribe('events');
Click to expand detailed metrics table
-| Benchmark | Library | ops/s | cmds/s | Elapsed | Spread |
-|:---|:---|---:|---:|---:|---:|
-| **Set Mutation: SADD SISMEMBER SREM**
1 KB | **solidis** | 62.5K | 187.5K | 1600ms | ±6.0% |
-| | ioredis | 30.0K | 89.9K | 3336ms | ±1.1% |
-| **List Range: LPUSH RPUSH LRANGE**
1 KB | **solidis** | 52.3K | 156.8K | 1914ms | ±2.6% |
-| | ioredis | 27.5K | 82.5K | 3635ms | ±1.2% |
-| **Multi-Key: MSET MGET**
1 KB | **solidis** | 60.7K | 121.5K | 1646ms | ±1.4% |
-| | ioredis | 32.0K | 64.0K | 3124ms | ±4.0% |
-| **List Mutation: LPUSH RPUSH LPOP RPOP LLEN**
1 KB | **solidis** | 41.3K | 206.7K | 2419ms | ±8.0% |
-| | ioredis | 22.3K | 111.6K | 4482ms | ±0.9% |
-| **Set: SET**
1 KB | **solidis** | 139.8K | 139.8K | 715ms | ±3.4% |
-| | ioredis | 77.8K | 77.8K | 1285ms | ±2.3% |
-| **Expire: SET EXPIRE TTL**
1 KB | **solidis** | 70.3K | 211.0K | 1422ms | ±2.4% |
-| | ioredis | 39.7K | 119.0K | 2521ms | ±2.2% |
-| **Hash Mutation: HMSET HMGET HDEL**
1 KB | **solidis** | 50.7K | 152.2K | 1971ms | ±7.5% |
-| | ioredis | 28.7K | 86.0K | 3487ms | ±1.2% |
-| **Sorted Set: ZADD ZRANGE ZREM**
1 KB | **solidis** | 53.2K | 159.5K | 1881ms | ±4.0% |
-| | ioredis | 30.4K | 91.3K | 3286ms | ±2.2% |
-| **Non-Transaction: SETPX GET**
1 KB | **solidis** | 79.2K | 158.4K | 1263ms | ±5.1% |
-| | ioredis | 47.6K | 95.1K | 2102ms | ±1.7% |
-| **Stream: XADD XRANGE XLEN**
1 KB | **solidis** | 50.4K | 151.2K | 1984ms | ±6.8% |
-| | ioredis | 30.6K | 91.8K | 3266ms | ±3.3% |
-| **Set Read: SADD SISMEMBER SMEMBERS**
1 KB | **solidis** | 51.6K | 154.7K | 1940ms | ±2.8% |
-| | ioredis | 32.1K | 96.2K | 3120ms | ±2.0% |
-| **Pipeline Mixed: SET INCR GET**
1 KB | **solidis** | 56.0K | 167.9K | 1787ms | ±2.2% |
-| | ioredis | 35.2K | 105.7K | 2839ms | ±1.6% |
-| **Counter: INCR DECR**
1 KB | **solidis** | 105.0K | 210.0K | 952ms | ±7.2% |
-| | ioredis | 69.2K | 138.3K | 1446ms | ±1.3% |
-| **Hash Round-Trip: HSET HGET HGETALL**
1 KB | **solidis** | 53.8K | 161.4K | 1859ms | ±7.5% |
-| | ioredis | 35.7K | 107.2K | 2798ms | ±2.5% |
-| **Get Buffer: GETBUFFER**
1 KB | **solidis** | 159.3K | 159.3K | 628ms | ±7.9% |
-| | ioredis | 107.7K | 107.7K | 928ms | ±4.3% |
+| Benchmark | Library | ops/s | cmds/s | Elapsed | Spread |
+| :--------------------------------------------------------------------------------------------------------------------------------------------- | :---------- | -----: | -----: | ------: | -----: |
+| **Set Mutation: SADD SISMEMBER SREM**
1 KB | **solidis** | 62.5K | 187.5K | 1600ms | ±6.0% |
+| | ioredis | 30.0K | 89.9K | 3336ms | ±1.1% |
+| **List Range: LPUSH RPUSH LRANGE**
1 KB | **solidis** | 52.3K | 156.8K | 1914ms | ±2.6% |
+| | ioredis | 27.5K | 82.5K | 3635ms | ±1.2% |
+| **Multi-Key: MSET MGET**
1 KB | **solidis** | 60.7K | 121.5K | 1646ms | ±1.4% |
+| | ioredis | 32.0K | 64.0K | 3124ms | ±4.0% |
+| **List Mutation: LPUSH RPUSH LPOP RPOP LLEN**
1 KB | **solidis** | 41.3K | 206.7K | 2419ms | ±8.0% |
+| | ioredis | 22.3K | 111.6K | 4482ms | ±0.9% |
+| **Set: SET**
1 KB | **solidis** | 139.8K | 139.8K | 715ms | ±3.4% |
+| | ioredis | 77.8K | 77.8K | 1285ms | ±2.3% |
+| **Expire: SET EXPIRE TTL**
1 KB | **solidis** | 70.3K | 211.0K | 1422ms | ±2.4% |
+| | ioredis | 39.7K | 119.0K | 2521ms | ±2.2% |
+| **Hash Mutation: HMSET HMGET HDEL**
1 KB | **solidis** | 50.7K | 152.2K | 1971ms | ±7.5% |
+| | ioredis | 28.7K | 86.0K | 3487ms | ±1.2% |
+| **Sorted Set: ZADD ZRANGE ZREM**
1 KB | **solidis** | 53.2K | 159.5K | 1881ms | ±4.0% |
+| | ioredis | 30.4K | 91.3K | 3286ms | ±2.2% |
+| **Non-Transaction: SETPX GET**
1 KB | **solidis** | 79.2K | 158.4K | 1263ms | ±5.1% |
+| | ioredis | 47.6K | 95.1K | 2102ms | ±1.7% |
+| **Stream: XADD XRANGE XLEN**
1 KB | **solidis** | 50.4K | 151.2K | 1984ms | ±6.8% |
+| | ioredis | 30.6K | 91.8K | 3266ms | ±3.3% |
+| **Set Read: SADD SISMEMBER SMEMBERS**
1 KB | **solidis** | 51.6K | 154.7K | 1940ms | ±2.8% |
+| | ioredis | 32.1K | 96.2K | 3120ms | ±2.0% |
+| **Pipeline Mixed: SET INCR GET**
1 KB | **solidis** | 56.0K | 167.9K | 1787ms | ±2.2% |
+| | ioredis | 35.2K | 105.7K | 2839ms | ±1.6% |
+| **Counter: INCR DECR**
1 KB | **solidis** | 105.0K | 210.0K | 952ms | ±7.2% |
+| | ioredis | 69.2K | 138.3K | 1446ms | ±1.3% |
+| **Hash Round-Trip: HSET HGET HGETALL**
1 KB | **solidis** | 53.8K | 161.4K | 1859ms | ±7.5% |
+| | ioredis | 35.7K | 107.2K | 2798ms | ±2.5% |
+| **Get Buffer: GETBUFFER**
1 KB | **solidis** | 159.3K | 159.3K | 628ms | ±7.9% |
+| | ioredis | 107.7K | 107.7K | 928ms | ±4.3% |
Click to expand benchmark configuration
-| Parameter | Value |
-|:----------|:------|
-| Mode | `autopipeline` |
-| Payload Sizes | 1 KB |
-| Iterations | 100,000 |
-| Warmup | 1,000 |
-| Clients | 1 |
-| Concurrency / Client | 10000 |
-| Total Concurrency | 10000 |
-| Repeats | 10 |
-| Cooldown | 2500ms |
-| Platform | linux x64 |
-| Node.js | v22.22.3 |
-| Date | 2026-06-20 10:28:46 |
+| Parameter | Value |
+| :------------------- | :------------------ |
+| Mode | `autopipeline` |
+| Payload Sizes | 1 KB |
+| Iterations | 100,000 |
+| Warmup | 1,000 |
+| Clients | 1 |
+| Concurrency / Client | 10000 |
+| Total Concurrency | 10000 |
+| Repeats | 10 |
+| Cooldown | 2500ms |
+| Platform | linux x64 |
+| Node.js | v22.22.3 |
+| Date | 2026-06-20 10:28:46 |