solid-redis 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b6c2088305fc897e081c9f3b7d2a5913441ab4816851a9da52158d05ea84d863
4
- data.tar.gz: 15d0a731a92ac785fd837ca99be1d6521a728446be45087adbf997f338f6456d
3
+ metadata.gz: 6535a0060c982d888022b36257c3fd25899961583e9ecd9033ec56852e11fc39
4
+ data.tar.gz: fabf7a71f4c204002e5f4a8f54f3a9666b9004fb20fd642eb56295ed2694aca6
5
5
  SHA512:
6
- metadata.gz: a20d9fcccf65d69d08045d196ca54478e65c689941c6a07b302acea78e3f2218b6b96b3039904e5f710fff54fc013ef951ef98b267c24d3c9cbf961066ad8442
7
- data.tar.gz: 373aac9ed547db8482549be91af26821fba8ed48b4098fae5049ffd9496de97960c7f3176e6ebdbf46e6230196c90058842efce10803d5e5251d321afe623ca8
6
+ metadata.gz: e4c26409524aeb11b8d788f1f59babe79854679f9eb5527246d0921d23d4e71be3463f6dab6782d3de62db0da18945e9a2631265544d6d3bbf51dcc92004fccd
7
+ data.tar.gz: d369d2a83f623f929dc56277694c66251d2ff40c615ab8a374e01d31be39efc1b5f88dd217bb31a0c831133866fd6ac5bec9d507a954c2e182267e641c1f0cad
data/CHANGELOG.md CHANGED
@@ -4,6 +4,16 @@ All notable changes to this project are documented in this file. The format
4
4
  follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the
5
5
  project adheres to [Semantic Versioning](https://semver.org/).
6
6
 
7
+ ## [1.0.5] - 2026-09-28
8
+
9
+ ### Changed
10
+
11
+ - Publish the final six-run benchmark matrix for GET/SET, pipelines,
12
+ Ractor-local pools, Cluster, and forced Sentinel failover using SolidRedis
13
+ 1.0.4.
14
+ - Make the Sentinel benchmark more reliable with bounded reconnect backoff,
15
+ post-failover recovery validation, and ports outside the ephemeral range.
16
+
7
17
  ## [1.0.4] - 2026-09-27
8
18
 
9
19
  ### Changed
@@ -113,6 +123,7 @@ project adheres to [Semantic Versioning](https://semver.org/).
113
123
  TLS, reconnection), `Pool` owned by a single Ractor, pipelines, and
114
124
  lifecycle callbacks via `callback-collection`.
115
125
 
126
+ [1.0.5]: https://github.com/nicolasva/solid-redis/compare/v1.0.4...v1.0.5
116
127
  [1.0.4]: https://github.com/nicolasva/solid-redis/compare/v1.0.3...v1.0.4
117
128
  [1.0.3]: https://github.com/nicolasva/solid-redis/compare/v1.0.2...v1.0.3
118
129
  [1.0.2]: https://github.com/nicolasva/solid-redis/compare/v1.0.1...v1.0.2
data/README.md CHANGED
@@ -592,26 +592,30 @@ Cluster rows compare `solid-redis` with `redis-cluster-client`, the
592
592
  Cluster implementation built on `redis-client`. Unsupported combinations
593
593
  are reported rather than replaced with a different concurrency model.
594
594
 
595
- **Environment:** Ruby 3.4.4 (arm64-darwin24); solid-redis 1.0.3; Redis server v=8.10.0 sha=00000000:1 malloc=libc bits=64 build=80fd3081013fc32b; redis-client 0.30.1; redis-cluster-client 0.17.1; Apple M2 Max, 12 logical CPUs, 96 GiB RAM, macOS 26.6.2.
595
+ **Environment:** Ruby 3.4.4 (arm64-darwin24); solid-redis 1.0.4; Redis server v=8.10.0 sha=00000000:1 malloc=libc bits=64 build=80fd3081013fc32b; redis-client 0.30.1; redis-cluster-client 0.17.1; Apple M2 Max, 12 logical CPUs, 96 GiB RAM, macOS 26.6.2.
596
596
 
597
597
  Each row is measured in a fresh Ruby process. Both clients use RESP2,
598
598
  identical commands and the same local Redis topology. Client order is
599
- alternated between runs; values are medians of 5 runs.
599
+ alternated between runs; values are medians of 6 runs.
600
600
  Regular workloads warm for 2 seconds and measure
601
601
  for 10 seconds. Pipeline latency is amortized
602
602
  per command (batch size 50). The isolated-pool scenario creates a
603
603
  five-connection pool inside each Ractor, warms it with
604
- 1,000 PINGs, then measures 100,000
604
+ 1,000 PINGs, then measures
605
+ 100,000
605
606
  PINGs per Ractor.
606
607
  CPU is client-process CPU divided by wall time and may exceed 100% with
607
608
  multiple Ractors. Peak RSS excludes Redis server processes. Sentinel
608
609
  rows kill the master process 0.5 seconds after measurement starts and
609
610
  verify that every Ractor resumes on the promoted replica. Recovery is
610
- measured from the kill to each Ractor's first successful response.
611
+ measured from each Ractor's first observed failure to its next successful
612
+ response; failed commands are retried after a 10 ms backoff.
611
613
  Throughput counts successful commands; errors are failed commands
612
- observed during the measured interval. Allocation and RSS measurements
613
- include the identical latency-recording harness used for both clients, so
614
- they are comparative rather than intrinsic library-only costs.
614
+ observed during the measured interval.
615
+ Allocation and RSS measurements include the identical sampled-latency
616
+ harness used for both clients, so they are comparative rather than
617
+ intrinsic library-only costs. `redis-cluster-client` uses its default
618
+ synchronous routing model (`concurrency: { model: :none }`).
615
619
 
616
620
  Reproduce the full run (requires `redis-server` and `redis-cli`):
617
621
 
@@ -623,66 +627,66 @@ BENCHMARK_README=README.md bundle exec rake benchmark:comparison
623
627
 
624
628
  | Ractors | Client | Throughput (ops/s) | p50 (ms) | p95 (ms) | p99 (ms) | CPU | Peak RSS | Allocations/op | Errors/run |
625
629
  |---:|---|---:|---:|---:|---:|---:|---:|---:|---:|
626
- | 1 | `redis-client` | 35,636 | 0.027 | 0.033 | 0.045 | 58.3% | 50.6 MiB | 17.4 | 0 |
627
- | 1 | `solid-redis` | 33,891 | 0.028 | 0.034 | 0.051 | 52.4% | 49.0 MiB | 28.9 | 0 |
628
- | 2 | `redis-client` | 53,941 | 0.035 | 0.049 | 0.069 | 114.6% | 58.6 MiB | 17.3 | 0 |
629
- | 2 | `solid-redis` | 56,594 | 0.033 | 0.045 | 0.090 | 104.7% | 57.9 MiB | 28.7 | 0 |
630
- | 4 | `redis-client` | 67,608 | 0.055 | 0.092 | 0.131 | 238.3% | 63.7 MiB | 17.3 | 0 |
631
- | 4 | `solid-redis` | 75,539 | 0.049 | 0.082 | 0.141 | 204.1% | 63.8 MiB | 28.5 | 0 |
632
- | 8 | `redis-client` | 48,828 | 0.078 | 0.171 | 0.236 | 268.5% | 75.4 MiB | 17.3 | 0 |
633
- | 8 | `solid-redis` | 80,691 | 0.087 | 0.172 | 0.267 | 431.4% | 69.5 MiB | 28.2 | 0 |
630
+ | 1 | `redis-client` | 35,363 | 0.028 | 0.035 | 0.045 | 58.6% | 37.9 MiB | 17.4 | 0 |
631
+ | 1 | `solid-redis` | 39,259 | 0.025 | 0.032 | 0.044 | 65.0% | 54.5 MiB | 19.9 | 0 |
632
+ | 2 | `redis-client` | 53,847 | 0.036 | 0.050 | 0.073 | 114.4% | 38.0 MiB | 17.3 | 0 |
633
+ | 2 | `solid-redis` | 58,259 | 0.033 | 0.047 | 0.095 | 112.6% | 54.5 MiB | 19.8 | 0 |
634
+ | 4 | `redis-client` | 67,086 | 0.058 | 0.097 | 0.136 | 238.4% | 38.0 MiB | 17.3 | 0 |
635
+ | 4 | `solid-redis` | 75,789 | 0.049 | 0.081 | 0.170 | 220.7% | 55.3 MiB | 19.6 | 0 |
636
+ | 8 | `redis-client` | 48,938 | 0.083 | 0.180 | 0.249 | 267.7% | 38.7 MiB | 17.3 | 0 |
637
+ | 8 | `solid-redis` | 84,294 | 0.085 | 0.169 | 0.274 | 479.1% | 65.1 MiB | 19.0 | 0 |
634
638
 
635
639
  ### Pipelines
636
640
 
637
641
  | Ractors | Client | Throughput (ops/s) | p50 (ms) | p95 (ms) | p99 (ms) | CPU | Peak RSS | Allocations/op | Errors/run |
638
642
  |---:|---|---:|---:|---:|---:|---:|---:|---:|---:|
639
- | 1 | `redis-client` | 262,482 | 0.004 | 0.005 | 0.007 | 81.5% | 39.5 MiB | 12.6 | 0 |
640
- | 1 | `solid-redis` | 317,150 | 0.003 | 0.004 | 0.006 | 77.9% | 41.0 MiB | 16.2 | 0 |
641
- | 2 | `redis-client` | 270,197 | 0.007 | 0.010 | 0.013 | 149.9% | 39.9 MiB | 12.5 | 0 |
642
- | 2 | `solid-redis` | 459,445 | 0.004 | 0.007 | 0.009 | 147.5% | 42.5 MiB | 15.9 | 0 |
643
- | 4 | `redis-client` | 222,813 | 0.017 | 0.025 | 0.031 | 282.8% | 40.0 MiB | 12.5 | 0 |
644
- | 4 | `solid-redis` | 464,640 | 0.008 | 0.014 | 0.017 | 251.9% | 43.2 MiB | 15.6 | 0 |
645
- | 8 | `redis-client` | 204,898 | 0.004 | 0.055 | 0.063 | 314.2% | 41.9 MiB | 12.5 | 0 |
646
- | 8 | `solid-redis` | 341,323 | 0.021 | 0.042 | 0.047 | 550.7% | 43.4 MiB | 15.5 | 0 |
643
+ | 1 | `redis-client` | 261,689 | 0.004 | 0.005 | 0.007 | 81.0% | 37.9 MiB | 12.6 | 0 |
644
+ | 1 | `solid-redis` | 329,512 | 0.003 | 0.004 | 0.005 | 76.8% | 40.5 MiB | 12.2 | 0 |
645
+ | 2 | `redis-client` | 273,064 | 0.007 | 0.009 | 0.012 | 147.4% | 38.0 MiB | 12.5 | 0 |
646
+ | 2 | `solid-redis` | 509,797 | 0.004 | 0.005 | 0.007 | 149.0% | 40.7 MiB | 12.0 | 0 |
647
+ | 4 | `redis-client` | 226,198 | 0.017 | 0.023 | 0.029 | 282.3% | 38.3 MiB | 12.5 | 0 |
648
+ | 4 | `solid-redis` | 609,096 | 0.006 | 0.011 | 0.013 | 272.3% | 41.0 MiB | 11.7 | 0 |
649
+ | 8 | `redis-client` | 204,166 | 0.004 | 0.054 | 0.062 | 315.5% | 38.9 MiB | 12.5 | 0 |
650
+ | 8 | `solid-redis` | 420,118 | 0.017 | 0.029 | 0.034 | 559.2% | 41.6 MiB | 11.6 | 0 |
647
651
 
648
652
  ### Isolated pool per Ractor
649
653
 
650
654
  | Ractors | Client | Throughput (ops/s) | p50 (ms) | p95 (ms) | p99 (ms) | CPU | Peak RSS | Allocations/op | Errors/run |
651
655
  |---:|---|---:|---:|---:|---:|---:|---:|---:|---:|
652
656
  | 1 | `redis-client` | unsupported: Ractor::IsolationError (`connection_pool` uses non-shareable global state) | — | — | — | — | — | — | — |
653
- | 1 | `solid-redis` | 34,528 | 0.028 | 0.033 | 0.043 | 53.3% | 39.0 MiB | 25.0 | 0 |
657
+ | 1 | `solid-redis` | 40,785 | 0.023 | 0.031 | 0.053 | 66.6% | 55.2 MiB | 17.0 | 0 |
654
658
  | 2 | `redis-client` | unsupported: Ractor::IsolationError (`connection_pool` uses non-shareable global state) | — | — | — | — | — | — | — |
655
- | 2 | `solid-redis` | 57,408 | 0.032 | 0.046 | 0.086 | 106.3% | 44.4 MiB | 24.8 | 0 |
659
+ | 2 | `solid-redis` | 63,540 | 0.030 | 0.042 | 0.073 | 117.0% | 55.3 MiB | 16.9 | 0 |
656
660
  | 4 | `redis-client` | unsupported: Ractor::IsolationError (`connection_pool` uses non-shareable global state) | — | — | — | — | — | — | — |
657
- | 4 | `solid-redis` | 78,461 | 0.047 | 0.078 | 0.129 | 205.4% | 54.1 MiB | 24.6 | 0 |
661
+ | 4 | `solid-redis` | 80,969 | 0.046 | 0.072 | 0.160 | 221.7% | 54.8 MiB | 16.6 | 0 |
658
662
  | 8 | `redis-client` | unsupported: Ractor::IsolationError (`connection_pool` uses non-shareable global state) | — | — | — | — | — | — | — |
659
- | 8 | `solid-redis` | 72,809 | 0.071 | 0.129 | 0.202 | 297.3% | 68.9 MiB | 24.4 | 0 |
663
+ | 8 | `solid-redis` | 74,339 | 0.068 | 0.163 | 0.351 | 334.1% | 62.3 MiB | 16.3 | 0 |
660
664
 
661
665
  ### Cluster
662
666
 
663
667
  | Ractors | Client | Throughput (ops/s) | p50 (ms) | p95 (ms) | p99 (ms) | CPU | Peak RSS | Allocations/op | Errors/run |
664
668
  |---:|---|---:|---:|---:|---:|---:|---:|---:|---:|
665
- | 1 | `redis-client` | 29,071 | 0.033 | 0.040 | 0.051 | 64.8% | 48.8 MiB | 19.4 | 0 |
666
- | 1 | `solid-redis` | 29,213 | 0.033 | 0.038 | 0.056 | 57.1% | 47.6 MiB | 34.9 | 0 |
667
- | 2 | `redis-client` | 50,333 | 0.037 | 0.051 | 0.078 | 124.7% | 57.8 MiB | 19.3 | 0 |
668
- | 2 | `solid-redis` | 51,805 | 0.036 | 0.050 | 0.097 | 117.2% | 57.0 MiB | 34.7 | 0 |
669
- | 4 | `redis-client` | 60,752 | 0.062 | 0.099 | 0.139 | 252.6% | 62.5 MiB | 19.3 | 0 |
670
- | 4 | `solid-redis` | 66,626 | 0.055 | 0.089 | 0.152 | 225.9% | 61.2 MiB | 34.4 | 0 |
671
- | 8 | `redis-client` | 43,258 | 0.089 | 0.186 | 0.253 | 278.1% | 75.4 MiB | 19.3 | 0 |
672
- | 8 | `solid-redis` | 48,644 | 0.079 | 0.154 | 0.248 | 241.4% | 74.7 MiB | 34.3 | 0 |
669
+ | 1 | `redis-client` | 28,804 | 0.034 | 0.042 | 0.059 | 64.2% | 38.4 MiB | 19.4 | 0 |
670
+ | 1 | `solid-redis` | 29,651 | 0.032 | 0.040 | 0.065 | 63.1% | 54.1 MiB | 24.9 | 0 |
671
+ | 2 | `redis-client` | 49,533 | 0.039 | 0.055 | 0.091 | 124.1% | 37.6 MiB | 19.3 | 0 |
672
+ | 2 | `solid-redis` | 51,253 | 0.037 | 0.052 | 0.105 | 121.0% | 54.2 MiB | 24.8 | 0 |
673
+ | 4 | `redis-client` | 60,385 | 0.064 | 0.103 | 0.149 | 251.9% | 40.2 MiB | 19.3 | 0 |
674
+ | 4 | `solid-redis` | 66,630 | 0.056 | 0.088 | 0.175 | 242.5% | 57.2 MiB | 24.5 | 0 |
675
+ | 8 | `redis-client` | 43,361 | 0.095 | 0.195 | 0.275 | 277.5% | 44.0 MiB | 19.3 | 0 |
676
+ | 8 | `solid-redis` | 47,102 | 0.077 | 0.198 | 0.415 | 251.3% | 58.0 MiB | 24.2 | 0 |
673
677
 
674
678
  ### Sentinel master crash
675
679
 
676
680
  | Ractors | Client | Throughput (ops/s) | p50 (ms) | p95 (ms) | p99 (ms) | Recovery p50 (ms) | Recovery max (ms) | CPU | Peak RSS | Allocations/op | Errors/run |
677
681
  |---:|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
678
- | 1 | `redis-client` | 29,378 | 0.028 | 0.035 | 0.046 | 1333.8 | 1333.8 | 61.9% | 52.3 MiB | 20.1 | 2050 |
679
- | 1 | `solid-redis` | 28,794 | 0.029 | 0.035 | 0.050 | 1319.1 | 1319.1 | 55.5% | 48.3 MiB | 33.3 | 2090 |
680
- | 2 | `redis-client` | 30,829 | 0.036 | 0.049 | 0.070 | 4242.9 | 4243.0 | 87.8% | 53.4 MiB | 20.4 | 3080 |
681
- | 2 | `solid-redis` | 31,074 | 0.033 | 0.045 | 0.093 | 4440.4 | 4451.4 | 77.3% | 50.3 MiB | 33.1 | 2202 |
682
- | 4 | `redis-client` | 36,404 | 0.054 | 0.093 | 0.131 | 4302.8 | 4870.8 | 157.2% | 58.0 MiB | 20.5 | 3113 |
683
- | 4 | `solid-redis` | 41,080 | 0.048 | 0.081 | 0.136 | 4802.3 | 4962.6 | 132.6% | 56.0 MiB | 32.0 | 2251 |
684
- | 8 | `redis-client` | 48,133 | 0.117 | 0.219 | 0.297 | 2278.4 | 2741.5 | 434.1% | 61.5 MiB | 19.7 | 3114 |
685
- | 8 | `solid-redis` | 63,627 | 0.087 | 0.171 | 0.277 | 2073.7 | 2085.0 | 374.0% | 64.4 MiB | 30.6 | 2268 |
682
+ | 1 | `redis-client` | 29,749 | 0.028 | 0.037 | 0.052 | 1321.9 | 1321.9 | 52.8% | 41.9 MiB | 17.6 | 99 |
683
+ | 1 | `solid-redis` | 32,279 | 0.026 | 0.034 | 0.050 | 1313.3 | 1313.3 | 57.0% | 69.5 MiB | 20.1 | 96 |
684
+ | 2 | `redis-client` | 46,483 | 0.036 | 0.050 | 0.075 | 1307.7 | 1311.9 | 101.9% | 42.0 MiB | 17.5 | 202 |
685
+ | 2 | `solid-redis` | 50,273 | 0.033 | 0.045 | 0.098 | 1344.3 | 1344.4 | 99.5% | 69.6 MiB | 20.0 | 206 |
686
+ | 4 | `redis-client` | 58,224 | 0.058 | 0.095 | 0.132 | 1319.1 | 1319.1 | 212.7% | 41.8 MiB | 17.6 | 386 |
687
+ | 4 | `solid-redis` | 66,969 | 0.049 | 0.078 | 0.154 | 1341.8 | 1341.8 | 196.9% | 69.4 MiB | 19.9 | 398 |
688
+ | 8 | `redis-client` | 53,640 | 0.124 | 0.229 | 0.305 | 1342.8 | 1343.1 | 474.6% | 42.2 MiB | 17.7 | 679 |
689
+ | 8 | `solid-redis` | 72,816 | 0.086 | 0.172 | 0.289 | 1349.4 | 1353.1 | 421.7% | 64.5 MiB | 19.5 | 687 |
686
690
  <!-- benchmark-results:end -->
687
691
 
688
692
  ## Development
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidRedis
4
- VERSION = "1.0.4"
4
+ VERSION = "1.0.5"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solid-redis
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicolas Vandenbogaerde
@@ -132,7 +132,7 @@ licenses:
132
132
  - MIT
133
133
  metadata:
134
134
  rubygems_mfa_required: 'true'
135
- documentation_uri: https://www.rubydoc.info/gems/solid-redis/1.0.4
135
+ documentation_uri: https://www.rubydoc.info/gems/solid-redis/1.0.5
136
136
  source_code_uri: https://github.com/nicolasva/solid-redis
137
137
  changelog_uri: https://github.com/nicolasva/solid-redis/blob/main/CHANGELOG.md
138
138
  rdoc_options: []