Redis Go client
This report summarizes scanner evidence for redis/go-redis, a Go project with 22,286 GitHub stars. SynthScan examined 246,883 lines of code across 559 source files, recording 754 pattern matches distributed across 7 syntactic categories. The legacy adjusted pattern signal is 3.2 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 716 finding(s).
Are imports declared and package/API names verified? 3 finding(s).
Are wrappers, guards, and repeated structures necessary? 35 finding(s).
Which changes need focused human review? 754 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 754 distinct pattern matches across 7 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | autopipeline_bench_test.go | 601 | COMMENT | |
| LOW | hash_commands.go | 121 | } | COMMENT |
| LOW | hash_commands.go | 141 | // type MyHash struct { Key1 string `redis:"key1"`; Key2 int `redis:"key2"` } | COMMENT |
| LOW | error.go | 21 | COMMENT | |
| LOW | search_builders.go | 341 | // SortBy adds SORTBY <field> ASC|DESC. Consecutive SortBy calls (with no | COMMENT |
| LOW | command.go | 481 | ctx context.Context | COMMENT |
| LOW | command.go | 561 | // returns); return the not-yet-executed state instead — the same | COMMENT |
| LOW | command.go | 1341 | return nil | COMMENT |
| LOW | command.go | 2481 | COMMENT | |
| LOW | himport.go | 21 | // SET can lazily prepare them on whichever pooled connection it executes. | COMMENT |
| LOW | himport.go | 181 | // | COMMENT |
| LOW | himport.go | 401 | } | COMMENT |
| LOW | options.go | 41 | // whether it is a success or a failure. | COMMENT |
| LOW | options.go | 61 | Network string | COMMENT |
| LOW | options.go | 81 | // Network and Addr options. | COMMENT |
| LOW | options.go | 101 | // or the User Password when connecting to a Redis 6.0 instance, or greater, | COMMENT |
| LOW | options.go | 121 | // CredentialsProviderContext is an enhanced parameter of CredentialsProvider, | COMMENT |
| LOW | options.go | 141 | // default: 3 retries | COMMENT |
| LOW | options.go | 161 | // A value <= 0 uses the default. | COMMENT |
| LOW | options.go | 181 | // ReadTimeout for socket reads. If reached, commands will fail | COMMENT |
| LOW | options.go | 201 | ContextTimeoutEnabled bool | COMMENT |
| LOW | options.go | 221 | // | COMMENT |
| LOW | options.go | 241 | // then plateaus; going beyond ~128 KiB gives no further gain and very large | COMMENT |
| LOW | options.go | 261 | // PipelineWriteBufferSize is the size of the bufio.Writer buffer for pipeline | COMMENT |
| LOW | options.go | 281 | // default: 0 (the larger of WriteBufferSize and DefaultPipelineBufferSize) | COMMENT |
| LOW | options.go | 301 | // (a non-blocking TryGet on the pipeline pool) rather than waiting a grace | COMMENT |
| LOW | options.go | 321 | // against PipelinePoolSize and are dialed but not initialized (init runs on | COMMENT |
| LOW | options.go | 341 | // default: 0 | COMMENT |
| LOW | options.go | 361 | // but it helps closing idle connections faster reducing the pool size. | COMMENT |
| LOW | options.go | 381 | // preserve an explicit dial cap for the pipeline pool instead of expanding it. | COMMENT |
| LOW | options.go | 401 | // default: 0 | COMMENT |
| LOW | options.go | 421 | // If d <= 0, connections are not closed due to a connection's idle time. | COMMENT |
| LOW | options.go | 441 | // | COMMENT |
| LOW | options.go | 461 | // Deprecated: Use DisableIdentity instead. | COMMENT |
| LOW | options.go | 481 | // PushNotificationProcessor is the processor for handling push notifications. | COMMENT |
| LOW | options.go | 501 | // be monotonic: a value observed through an uncached path can be newer | COMMENT |
| LOW | options.go | 521 | // | COMMENT |
| LOW | options.go | 541 | COMMENT | |
| LOW | options.go | 561 | // overrides. Nil is the static default. | COMMENT |
| LOW | options.go | 581 | // invalidated key as soon as its invalidation arrives, instead of waiting for | COMMENT |
| LOW | options.go | 601 | // tail at a small pool. | COMMENT |
| LOW | options.go | 621 | // | COMMENT |
| LOW | options.go | 641 | // to a *LocalCache), like ClientSideCacheCoalesceMisses: the batcher's | COMMENT |
| LOW | options.go | 661 | // pool connection runs plain CLIENT TRACKING ON and a background drainer applies | COMMENT |
| LOW | options.go | 681 | // TYPICAL (small-command) traffic, while very large buffers (>=512 KiB) can | COMMENT |
| LOW | options.go | 961 | // Unix connection: | COMMENT |
| LOW | options.go | 981 | // - unknown parameter names will result in an error | COMMENT |
| LOW | tls_cert_auth_test.go | 21 | COMMENT | |
| LOW | local_cache.go | 41 | COMMENT | |
| LOW | local_cache.go | 61 | COMMENT | |
| LOW | local_cache.go | 101 | // cscFetchSeq is the global monotonic counter feeding cacheEntry.fetchSeq. It | COMMENT |
| LOW | local_cache.go | 121 | // MaxEntries limits the number of entries. Zero or negative means unlimited. | COMMENT |
| LOW | local_cache.go | 141 | StaleTimeout time.Duration | COMMENT |
| LOW | local_cache.go | 161 | // All methods may be called concurrently. Cache keys and Redis keys are opaque | COMMENT |
| LOW | local_cache.go | 321 | } | COMMENT |
| LOW | local_cache.go | 961 | COMMENT | |
| LOW | local_cache_test.go | 781 | // and eviction picks the oldest entry whose bit is CLEAR. If nothing ever | COMMENT |
| LOW | autopipeline_fd_pipeline.go | 21 | // The submit queue already has the primitive for it. fdQueue.pushBatch appends | COMMENT |
| LOW | autopipeline_fd_pipeline.go | 41 | // using the cluster pipeline, as it did before FD batches existed. | COMMENT |
| LOW | autopipeline_fd_pipeline.go | 61 | "redis: FDPipelined batch has keys on different full-duplex engines") | COMMENT |
| 588 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | example/otel/uptrace.yml | 1 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | example/otel/uptrace.yml | 3 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | example/otel/uptrace.yml | 11 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | example/otel/uptrace.yml | 13 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | example/otel/uptrace.yml | 15 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | example/otel/uptrace.yml | 21 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | example/otel/uptrace.yml | 23 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | example/otel/uptrace.yml | 246 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | example/otel/uptrace.yml | 248 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | example/otel/uptrace.yml | 255 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | example/otel/uptrace.yml | 257 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 42 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 44 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 67 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 69 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 85 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 87 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 142 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 144 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 185 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 187 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 201 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 203 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 225 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 227 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 274 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 276 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 333 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 335 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 350 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 352 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 377 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 379 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 405 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | example/otel/uptrace.yml | 407 | # ----------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tls_cert_auth_test.go | 88 | // Step 3: Load CA certificate for server verification | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 94 | // Step 4: Load the pre-generated client certificate with CN=testcertuser | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 104 | // Step 5: Create TLS config with the client certificate | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 206 | // Step 2: Load CA certificate for server verification | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 212 | // Step 3: Load the client certificate with CN=testcertuser | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 222 | // Step 4: Create TLS config with the client certificate | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 233 | // Step 5: Connect with TLS using the certificate | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 240 | // Step 6: Verify we're authenticated as "default" (fallback) | COMMENT |
| LOW | tls_cert_auth_test.go | 50 | // Step 1: Create a non-TLS client to set up the ACL user | COMMENT |
| LOW | tls_cert_auth_test.go | 64 | // Step 2: Create ACL user with specific permissions | COMMENT |
| LOW | tls_cert_auth_test.go | 115 | // Step 6: Connect with TLS using the certificate | COMMENT |
| LOW | tls_cert_auth_test.go | 126 | // Step 7: Verify we're authenticated as the correct user | COMMENT |
| LOW | tls_cert_auth_test.go | 137 | // Step 8: Test that we can execute allowed commands | COMMENT |
| LOW | tls_cert_auth_test.go | 151 | // Step 9: Test that we CANNOT execute disallowed commands | COMMENT |
| LOW | tls_cert_auth_test.go | 180 | // Step 1: Create a non-TLS client to ensure the user does NOT exist | COMMENT |
| LOW | tls_cert_auth_test.go | 252 | // Step 7: Verify we can execute commands as default user | COMMENT |
| LOW | example/tls-cert-auth/main.go | 42 | // Step 1: First, ensure the ACL user exists (using non-TLS connection) | COMMENT |
| LOW⚡ | example/tls-cert-auth/main.go | 60 | // Step 2: Load CA certificate | COMMENT |
| LOW⚡ | example/tls-cert-auth/main.go | 68 | // Step 3: Load client certificate (CN must match the Redis ACL username) | COMMENT |
| LOW⚡ | example/tls-cert-auth/main.go | 77 | // Step 4: Create TLS config | COMMENT |
| LOW⚡ | example/tls-cert-auth/main.go | 85 | // Step 5: Connect to Redis with TLS - NO username/password needed! | COMMENT |
| LOW⚡ | example/tls-cert-auth/main.go | 93 | // Step 6: Verify authentication | COMMENT |
| LOW⚡ | example/tls-cert-auth/main.go | 100 | // Step 7: Test some commands | COMMENT |
| LOW⚡ | example/ts-querylabels/main.go | 33 | // Step 1: first dropdown - which labels does the sensor group carry? | COMMENT |
| LOW⚡ | example/ts-querylabels/main.go | 42 | // Step 2: second dropdown - which values does "location" take in that | COMMENT |
| LOW⚡ | example/ts-querylabels/main.go | 50 | // Step 3: third dropdown - the keys matching the fully-selected filter | COMMENT |
| LOW | maintnotifications/e2e/proxy_fault_injector_server.go | 499 | // Step 1: Inject SMIGRATING notification | COMMENT |
| LOW | maintnotifications/e2e/proxy_fault_injector_server.go | 519 | // Step 2: Inject SMIGRATED notification | COMMENT |
| LOW | maintnotifications/e2e/proxy_fault_injector_server.go | 645 | // Step 1: Inject FAILING_OVER notification | COMMENT |
| LOW | maintnotifications/e2e/proxy_fault_injector_server.go | 664 | // Step 2: Inject FAILED_OVER notification | COMMENT |
| LOW | maintnotifications/e2e/proxy_fault_injector_server.go | 688 | // Step 1: Inject MIGRATING notification (no MOVING for migrate action) | COMMENT |
| LOW | maintnotifications/e2e/proxy_fault_injector_server.go | 709 | // Step 2: Inject MIGRATED notification | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tls_cert_auth_test.go | 88 | // Step 3: Load CA certificate for server verification | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 94 | // Step 4: Load the pre-generated client certificate with CN=testcertuser | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 104 | // Step 5: Create TLS config with the client certificate | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 206 | // Step 2: Load CA certificate for server verification | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 212 | // Step 3: Load the client certificate with CN=testcertuser | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 222 | // Step 4: Create TLS config with the client certificate | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 233 | // Step 5: Connect with TLS using the certificate | COMMENT |
| LOW⚡ | tls_cert_auth_test.go | 240 | // Step 6: Verify we're authenticated as "default" (fallback) | COMMENT |
| LOW | tls_cert_auth_test.go | 50 | // Step 1: Create a non-TLS client to set up the ACL user | COMMENT |
| LOW | tls_cert_auth_test.go | 64 | // Step 2: Create ACL user with specific permissions | COMMENT |
| LOW | tls_cert_auth_test.go | 115 | // Step 6: Connect with TLS using the certificate | COMMENT |
| LOW | tls_cert_auth_test.go | 126 | // Step 7: Verify we're authenticated as the correct user | COMMENT |
| LOW | tls_cert_auth_test.go | 137 | // Step 8: Test that we can execute allowed commands | COMMENT |
| LOW | tls_cert_auth_test.go | 151 | // Step 9: Test that we CANNOT execute disallowed commands | COMMENT |
| LOW | tls_cert_auth_test.go | 180 | // Step 1: Create a non-TLS client to ensure the user does NOT exist | COMMENT |
| LOW | tls_cert_auth_test.go | 252 | // Step 7: Verify we can execute commands as default user | COMMENT |
| LOW | example/tls-cert-auth/main.go | 42 | // Step 1: First, ensure the ACL user exists (using non-TLS connection) | COMMENT |
| LOW⚡ | example/tls-cert-auth/main.go | 60 | // Step 2: Load CA certificate | COMMENT |
| LOW⚡ | example/tls-cert-auth/main.go | 68 | // Step 3: Load client certificate (CN must match the Redis ACL username) | COMMENT |
| LOW⚡ | example/tls-cert-auth/main.go | 77 | // Step 4: Create TLS config | COMMENT |
| LOW⚡ | example/tls-cert-auth/main.go | 85 | // Step 5: Connect to Redis with TLS - NO username/password needed! | COMMENT |
| LOW⚡ | example/tls-cert-auth/main.go | 93 | // Step 6: Verify authentication | COMMENT |
| LOW⚡ | example/tls-cert-auth/main.go | 100 | // Step 7: Test some commands | COMMENT |
| LOW⚡ | example/ts-querylabels/main.go | 33 | // Step 1: first dropdown - which labels does the sensor group carry? | COMMENT |
| LOW⚡ | example/ts-querylabels/main.go | 42 | // Step 2: second dropdown - which values does "location" take in that | COMMENT |
| LOW⚡ | example/ts-querylabels/main.go | 50 | // Step 3: third dropdown - the keys matching the fully-selected filter | COMMENT |
| LOW | maintnotifications/e2e/proxy_fault_injector_server.go | 499 | // Step 1: Inject SMIGRATING notification | COMMENT |
| LOW | maintnotifications/e2e/proxy_fault_injector_server.go | 519 | // Step 2: Inject SMIGRATED notification | COMMENT |
| LOW | maintnotifications/e2e/proxy_fault_injector_server.go | 645 | // Step 1: Inject FAILING_OVER notification | COMMENT |
| LOW | maintnotifications/e2e/proxy_fault_injector_server.go | 664 | // Step 2: Inject FAILED_OVER notification | COMMENT |
| LOW | maintnotifications/e2e/proxy_fault_injector_server.go | 688 | // Step 1: Inject MIGRATING notification (no MOVING for migrate action) | COMMENT |
| LOW | maintnotifications/e2e/proxy_fault_injector_server.go | 709 | // Step 2: Inject MIGRATED notification | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | autopipeline.go | 1402 | // three document intent and are robust to any init reordering. | COMMENT |
| MEDIUM | autopipeline_fullduplex.go | 155 | // clean fdRecycle. The maintnotifications OnPut hook then performs the seamless | COMMENT |
| MEDIUM | autopipeline_fullduplex.go | 2281 | // seamless handoff for a moving conn, or the conn simply returns to the pool for | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | osscluster_test.go | 3339 | // Values should be in the same order as requested keys | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | search_builders_test.go | 367 | client.HSet(ctx, "doc1", "title", "hello world", "body", "lorem ipsum") | CODE |
| LOW | search_test.go | 316 | client.HSet(ctx, "doc2", "f1", "very important", "f2", "lorem ipsum") | CODE |
| LOW | search_test.go | 4752 | client.HSet(ctx, "doc2", "f1", "very important", "f2", "lorem ipsum") | CODE |