Skip to content

chore(deps): bump github.com/redis/go-redis/v9 from 9.9.0 to 9.21.0 in /backend - #18

Open
dependabot[bot] wants to merge 88 commits into
mainfrom
dependabot/go_modules/backend/github.com/redis/go-redis/v9-9.21.0
Open

chore(deps): bump github.com/redis/go-redis/v9 from 9.9.0 to 9.21.0 in /backend#18
dependabot[bot] wants to merge 88 commits into
mainfrom
dependabot/go_modules/backend/github.com/redis/go-redis/v9-9.21.0

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Jun 27, 2026

Copy link
Copy Markdown
Contributor

Bumps github.com/redis/go-redis/v9 from 9.9.0 to 9.21.0.

Release notes

Sourced from github.com/redis/go-redis/v9's releases.

9.21.0

This is a minor release adding new features and bug fixes. There are no breaking changes; upgrading from 9.20.x is a drop-in replacement.

🚀 Highlights

Zero-copy GetToBuffer / SetFromBuffer

Two new StringCmdable methods let callers read and write Redis string values directly into and from pre-allocated byte buffers, eliminating the per-call payload allocation that Get/Set incur:

GetToBuffer(ctx, key, buf) *ZeroCopyStringCmd   // reads into buf; ZeroCopyStringCmd { Val() int; Bytes() []byte; Result() (int, error) }
SetFromBuffer(ctx, key, buf) *StatusCmd

GetToBuffer decodes the bulk reply straight into the caller-owned buf (no intermediate allocation); a buffer that is too small returns an error after draining the payload, so the connection stays aligned for the next reply. SetFromBuffer is provided for API symmetry — it dispatches to the same []byte writer path as Set(ctx, key, buf, 0) and produces byte-identical output on the wire. Available on *Client, *ClusterClient, *Ring, *Conn and Pipeliner.

(#3834) by @​ndyakov

Explicit LIMIT 0 for stream trimming

Redis treats XTRIM/XADD approximate-trim (~) LIMIT 0 as "disable the trimming effort cap entirely", which differs from omitting LIMIT (the implicit 100 * stream-node-max-entries default). The command builders previously only emitted LIMIT when limit > 0, so callers could never send an explicit LIMIT 0. Following the KeepTTL = -1 precedent, the new XTrimLimitDisabled = -1 sentinel now emits an explicit LIMIT 0; limit == 0 keeps the historical no-LIMIT behavior, so existing callers produce byte-identical commands.

(#3848) by @​TheRealMal

✨ New Features

  • Zero-copy buffer string commands: new GetToBuffer / SetFromBuffer on StringCmdable and the ZeroCopyStringCmd result type, reading/writing string values into caller-owned buffers without per-call payload allocation (#3834) by @​ndyakov
  • XTrimLimitDisabled sentinel: XTRIM/XADD approximate trimming can now send an explicit LIMIT 0 to disable the trim effort cap, via the new XTrimLimitDisabled = -1 sentinel (#3848) by @​TheRealMal
  • PubSub health-check timeouts: channel.initHealthCheck now bounds the Ping it issues with a fresh per-check timeout context (the exported pingTimeout / reconnectTimeout) instead of context.TODO(), so a stuck health-check Ping can no longer block indefinitely (#3819) by @​abdellani
  • Skip redundant UNWATCH in Tx.Close: a transaction now tracks whether a WATCH is still active (watchArmed) and only issues UNWATCH on Close when it is, removing an extra round trip on the common WATCH/.../EXEC and no-key Watch paths while never returning a connection to the pool with an active watch (#3854) by @​fcostaoliveira

🐛 Bug Fixes

  • maintnotifications ModeAuto fail-open: ModeAuto now stays fail-open when the server does not support maintenance notifications — connections are retired and tracking is guarded during downgrade so the client keeps working instead of erroring (#3853) by @​terrorobe

👥 Contributors

We'd like to thank all the contributors who worked on this release!

@​abdellani, @​fcostaoliveira, @​ndyakov, @​terrorobe, @​TheRealMal

9.20.1

This is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.

🚀 Highlights

RESP3 pub/sub message loss fixed

PeekPushNotificationName previously inspected only the bytes already buffered by bufio, so when a push frame header straddled a buffer fill boundary it could return a truncated notification name (e.g. "messa" instead of "message"). The push processor then mis-routed the frame and ReadReply silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes #3839.

... (truncated)

Changelog

Sourced from github.com/redis/go-redis/v9's changelog.

9.21.0 (2026-06-18)

This is a minor release adding new features and bug fixes. There are no breaking changes; upgrading from 9.20.x is a drop-in replacement.

🚀 Highlights

Zero-copy GetToBuffer / SetFromBuffer

Two new StringCmdable methods let callers read and write Redis string values directly into and from pre-allocated byte buffers, eliminating the per-call payload allocation that Get/Set incur:

GetToBuffer(ctx, key, buf) *ZeroCopyStringCmd   // reads into buf; ZeroCopyStringCmd { Val() int; Bytes() []byte; Result() (int, error) }
SetFromBuffer(ctx, key, buf) *StatusCmd

GetToBuffer decodes the bulk reply straight into the caller-owned buf (no intermediate allocation); a buffer that is too small returns an error after draining the payload, so the connection stays aligned for the next reply. SetFromBuffer is provided for API symmetry — it dispatches to the same []byte writer path as Set(ctx, key, buf, 0) and produces byte-identical output on the wire. Available on *Client, *ClusterClient, *Ring, *Conn and Pipeliner.

(#3834) by @​ndyakov

Explicit LIMIT 0 for stream trimming

Redis treats XTRIM/XADD approximate-trim (~) LIMIT 0 as "disable the trimming effort cap entirely", which differs from omitting LIMIT (the implicit 100 * stream-node-max-entries default). The command builders previously only emitted LIMIT when limit > 0, so callers could never send an explicit LIMIT 0. Following the KeepTTL = -1 precedent, the new XTrimLimitDisabled = -1 sentinel now emits an explicit LIMIT 0; limit == 0 keeps the historical no-LIMIT behavior, so existing callers produce byte-identical commands.

(#3848) by @​TheRealMal

✨ New Features

  • Zero-copy buffer string commands: new GetToBuffer / SetFromBuffer on StringCmdable and the ZeroCopyStringCmd result type, reading/writing string values into caller-owned buffers without per-call payload allocation (#3834) by @​ndyakov
  • XTrimLimitDisabled sentinel: XTRIM/XADD approximate trimming can now send an explicit LIMIT 0 to disable the trim effort cap, via the new XTrimLimitDisabled = -1 sentinel (#3848) by @​TheRealMal
  • PubSub health-check timeouts: channel.initHealthCheck now bounds the Ping it issues with a fresh per-check timeout context (the exported pingTimeout / reconnectTimeout) instead of context.TODO(), so a stuck health-check Ping can no longer block indefinitely (#3819) by @​abdellani
  • Skip redundant UNWATCH in Tx.Close: a transaction now tracks whether a WATCH is still active (watchArmed) and only issues UNWATCH on Close when it is, removing an extra round trip on the common WATCH/.../EXEC and no-key Watch paths while never returning a connection to the pool with an active watch (#3854) by @​fcostaoliveira

🐛 Bug Fixes

  • maintnotifications ModeAuto fail-open: ModeAuto now stays fail-open when the server does not support maintenance notifications — connections are retired and tracking is guarded during downgrade so the client keeps working instead of erroring (#3853) by @​terrorobe

👥 Contributors

We'd like to thank all the contributors who worked on this release!

@​abdellani, @​fcostaoliveira, @​ndyakov, @​terrorobe, @​TheRealMal


Full Changelog: redis/go-redis@v9.20.1...v9.21.0

9.20.1 (2026-06-11)

This is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.

... (truncated)

Commits
  • 1551837 chore(release): 9.21.0 (#3857)
  • 1cfa927 fix(maintnotifications): keep ModeAuto fail-open (#3853)
  • 1f0ea0e feat(pubsub): introduce timeouts for Ping on channel.initHealthCheck (#3819)
  • 5484b0b feat(tx): skip redundant UNWATCH in Tx.Close when no WATCH is active (#3854)
  • bf57a51 chore(deps): bump rojopolis/spellcheck-github-actions (#3852)
  • 641294c feat(streams): support explicit LIMIT 0 in XTRIM/XADD trimming via XTrimLimit...
  • 74d9bb0 feat(command): add zero-copy GetToBuffer and SetFromBuffer (#3834)
  • a13416b chore(release): 9.20.1 (#3847)
  • 10dc44f fix(push): fix peeking when push name is truncated (#3842)
  • e1a2d68 fix(ft.hybrid): Always generate vector param names if they are not provided b...
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

songkwon and others added 30 commits June 11, 2026 18:30
Added the GNU General Public License version 3 to the project.
Add a frontend MDX engine that renders documentation with the full
Mintlify component set (callouts, Card/CardGroup/Columns, Tabs, Steps,
Accordion/Expandable, CodeGroup, Frame, Tooltip, Badge, fields, Tree,
Mermaid, ...). Markdown entries are compiled at request time via
next-mdx-remote/rsc with a matching component library and theme-aware
styles.

Plumb raw markdown end-to-end as `content_md`:
docsctl DocumentRecord -> documents.jsonl -> deploy -> store.Page ->
getPage -> doc page, which renders it through the MDX engine (falling
back to content_html/content_text). Embedded seed docs showcase every
component.

Note: next-mdx-remote v6 defaults blockJS:true, which strips JSX
expression props (cols={3}); the engine sets blockJS:false +
blockDangerousJS:true so Mintlify expression props work while
eval/Function/require/process stay blocked.

Also bundles in-progress admin/UI and infra changes from prior work.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add ?page=&limit=&keyword= server-side pagination to the six admin list
endpoints (users, teams, doc sources, releases, search logs, MCP logs).
Endpoints return a {items,total,page,limit} envelope when paginated and
stay backward-compatible (plain array without ?page=), so dropdowns, the
homepage module list, and user-identity derivation that need full lists
keep working.

Keyword filtering now happens on the backend over the same fields the UI
used to filter client-side (incl. module key/repo and team members).

Frontend: a shared usePaged hook replaces the load-all-then-slice pattern
in all six pages; keyword changes reset to page 1 and refetch.

Also fix backend Dockerfile GOPROXY default to goproxy.cn (matches the
other Dockerfiles) so `go mod download` doesn't hang on slow networks.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Releases, search logs and MCP logs rendered the Pagination component
inside the "has rows" branch, so the footer disappeared when a list was
empty — making it look like those pages had no pagination, unlike
users/teams/modules which always show the bar. Move Pagination outside
the empty/loading conditional so the "共 N 条" footer is always present.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…l pagination

Address four LLM integration issues across the four supported API formats:

- max_tokens: Anthropic no longer hardcodes 1024 (truncated long answers).
  Add configurable AskMaxTokens (default 4096); applied to Anthropic where
  it is required, others keep the model default.
- temperature: make it consistent — configurable AskTemperature (default
  0.2) now sent by all four protocols (chat/responses/anthropic/gemini),
  not just openai-chat. Nil pointer preserves an explicit 0.
- Gemini: pass the API key via the x-goog-api-key header instead of a
  ?key= query param so it doesn't leak into proxy/gateway logs (both
  generateContent and the models listing).
- Anthropic models listing: follow has_more / last_id pagination so all
  models are returned, not just the first page.

Settings UI gains "最大回复 Tokens" and "采样温度" inputs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Introduce a team-scoped admin tier alongside super admins:

Backend (data-layer enforcement):
- accessibleCategoryIDs(user): a user's teams (leader or member) → owned
  categories (Category.ResponsibleTeam) + descendants. Super admin = all.
- hasConsoleAccess/isTeamAdmin/requireConsole helpers; store.TeamKeysForUser
  and AllCategories.
- /api/auth/me now returns is_team_admin.
- Scope reads by accessible categories: categories tree (?scope=managed),
  admin module list, releases, search logs (via clicked doc→module),
  MCP logs (best-effort via input_json doc_id/module_key). These four
  list endpoints now require console access (previously ungated).
- Doc sources must be filed under ≥1 category (create + update reject
  empty); team admins may only pick categories they own. Root category
  creation stays super-admin only.

Frontend:
- Reusable components/ui/user-select.tsx: search + group-by-department
  multi-select user picker; used in the team edit modal (replaces the
  per-row inline member add/remove).
- Admin menu gated by role: team admins see only 分类管理/文档源管理/
  发布记录/搜索日志/MCP日志; super admins see all 9. Console entry in the
  user dropdown now shows for team admins too.
- Categories page uses the managed (scoped) tree and hides root-category
  creation for non-super-admins; teams list load is tolerant of 403.
- Module form sources categories from the scoped tree and requires one.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ory rows

Team edit: leader and members are now both chosen with the reusable user
picker, opened from "选择负责人" / "添加成员" buttons in a popup (search icon
sits inside the input). Leader is a required single-select (≥1); the team
list shows a member count instead of every name. UserSelect gains a
`single` mode.

Doc source form: framework / mount options split into title + subtitle
(subtitle via Combobox hint); the selected chip shows only the title.
Aligned the two fields (field-row align-items:start + matching hints).

Categories: each row now shows only icon, name and responsible team —
dropped the key tag and description for a cleaner tree.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Team.Leader (single) becomes Team.Leaders []string. A team requires at
least one leader and may have several; every leader is kept in Members.
Leader/membership permission checks, the team keyword filter, seed data,
and Create/Update/SetTeamLeader handle the slice. The team edit modal
picks leaders with the same multi-select user picker (required ≥1), the
list shows all leader badges, and user-identity derivation reads the
leader list.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Frontend PostHog init (analytics-init.tsx), pageview/event tracking in
  analytics.ts, docs/category/admin pages, and user-menu opt-out.
- Backend PostHog proxy + capture endpoints (posthog.go), auth config and
  server wiring; add server security test coverage.
- next.config / tsconfig adjustments for the analytics client.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Diagram-as-code via Kroki (kroki.tsx): Pre routes plantuml/graphviz/c4/
  ditaa/d2/vega/… fences to a configurable Kroki server (NEXT_PUBLIC_KROKI_URL,
  default kroki.io). Optional self-hosted `kroki` compose profile.
- Math: remark-math + rehype-katex ($..$, $$..$$), katex CSS.
- GitHub-style alerts: > [!NOTE|TIP|IMPORTANT|WARNING|CAUTION] → callouts.
- Auto table-of-contents: [[toc]] / [toc] → nav of h2–h4 (rehypeToc).
- Footnote styling (remark-gfm). Plugins extracted to remark-plugins.ts.
- Seed demo doc showcases all of the above.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Next 16 requires React 19; the tree pinned React 18.3.1, which made
next-mdx-remote/rsc throw "A React Element from an older version of React
was rendered" on every docs page (dev and prod prerender). Bump react,
react-dom and @types to ^19; fix useRef() now requiring an initial arg.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds a curated, admin-managed plugin registry for the doc engine. Admins
toggle/configure built-in capabilities (no third-party code); state is global,
super-admin managed, and applied to rendering immediately.

Backend:
- store/plugins.go: catalog (kroki, mermaid, math, github_alerts, toc,
  footnotes, snippets, openapi) + per-plugin overrides in Settings; merge,
  save (filters unknown keys/fields), and effective-config helpers.
- GET/PUT /api/admin/plugins (super-admin); effective enabled+config exposed
  un-gated on /api/config for the renderer. Unit + auth-gate tests.

Frontend:
- MdxConfigProvider context carries effective config to client MDX components.
- mdx-content.tsx conditionally includes math/alerts/toc plugins by config
  (falls back to all-enabled on fetch failure); Kroki/Mermaid routing and
  Kroki base_url now honor config.
- Admin "插件管理" page + nav entry; getPlugins/savePlugins API client.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds an admin-managed snippet library and global variables. Docs reference
partials as <Snippet name="key"/> and values as {{key}}; both are expanded in
a pre-compile pass before compileMDX, gated by the `snippets` plugin.

Backend:
- store/snippets.go: Snippet + Variables in Settings; SnippetData /
  SaveSnippetData (trim, drop blank keys, de-dup last-wins). Unit test.
- GET/PUT /api/admin/snippets (super-admin); read-only /api/docs/snippets
  for the renderer.

Frontend:
- snippets.ts expandSnippets: recursive snippet splice (depth-capped) +
  variable substitution; wired into mdx-content.tsx.
- <Snippet> fallback renders nothing for unknown names / disabled plugin.
- Admin "复用片段" page + nav entry; getSnippets/saveSnippets/getDocsSnippets.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Closes the last big Mintlify gap, gated by the `openapi` plugin.

- <ApiPlayground method url baseUrl headers body>: editable request console
  with a client-side Send showing status, latency and pretty-printed response.
- <RequestExample>/<ResponseExample>: passive Mintlify-compat sample containers.
- <OpenApi spec operation>: fetches+caches a JSON OpenAPI spec, renders the
  operation's summary/parameters/responses and embeds a prefilled playground;
  spec falls back to the plugin's default_spec_url. (JSON specs; shallow $ref.)
- Registered in the component map; seed doc showcases the playground.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Lets users install the MCP server without public npm. Backend serves the
zero-dep npx package (mcp/npx) from MCP_DIST_DIR:
- GET /api/mcp/dist (listing), /api/mcp/dist/{file}, and
  /api/mcp/dist/modex-docs-mcp.tgz (npm-style tarball built on the fly).
- compose bind-mounts ../mcp/npx → /app/mcp-dist (read-only).
- me/mcp page gains an offline/intranet install card: `npx -y <tarball-url>`
  with the user's token prefilled, plus direct file download links.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Admins can import third-party plugins (JSX/React source) from 插件管理; once
enabled they render in docs with no rebuild. Imported code runs inside an
isolated iframe (sandbox="allow-scripts" WITHOUT allow-same-origin → opaque
origin, no access to modex cookies/DOM/session), with React/ReactDOM/Babel
self-hosted under /plugin-runtime. Code + props are base64-embedded, so there
is no <script> injection surface (security-reviewed).

Backend:
- store/uploaded_plugins.go: UploadedPlugin model (component/fence kinds) +
  validated upsert/delete; merged into PluginStates (default disabled) and the
  shared enable/override path. Unit tests.
- POST/DELETE /api/admin/plugins/import (super-admin); GET /api/docs/plugins
  serves enabled plugins' source to the renderer.

Frontend:
- components/mdx/sandboxed-plugin.tsx: iframe runtime (Babel-transpiles JSX,
  renders a Plugin component, auto-resizes via postMessage).
- mdx-content.tsx registers component-kind as dynamic MDX tags and passes
  fence-kind via context; code.tsx routes uploaded fenced languages.
- Admin 插件管理: 已导入插件 list (toggle/delete), 导入 modal, 开发方法 guide panel.
- Vendored React 18 + ReactDOM + Babel standalone under public/plugin-runtime.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Search hits rendered raw Markdown (**, #, [text](url), code fences, tables) in
titles/snippets. Add a display-only plainText() pass so results read as clean
prose; keyword scoring and embeddings still use the raw content.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Expose a built-in default RAG system prompt (store.DefaultAskSystemPrompt) via
the settings API so the admin UI pre-fills the editor instead of a blank box,
and add a "reset to default" action. Empty still falls back to the built-in.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Every setting (source, output, module, version, deploy-url, token, metadata,
entry/build overrides) now has a CLI flag, with the matching DOCS_* env var as
fallback so existing pipelines keep working. Adds usage/help text.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- DOCS_DEPLOY_MAX_BYTES default raised to 512MB for image-heavy doc sites.
- Pass MINIO_ROOT_USER/PASSWORD/BUCKET to the backend so site-file uploads
  stop failing with Access Denied.
- Regroup and trim .env.example comments.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Site-builder docs (VitePress/VuePress/Fumadocs) open full-width; the Modex
  topbar auto-hides and reveals on top-edge hover (ImmersiveChrome).
- Preserve per-page routes as ?p= deep links on ingest so search hits open the
  matched page instead of the entry root; the viewer maps it to the built file.
- Single static-site category redirects to the full-width viewer.
- Use the public API base for the embedded iframe (never backend: internal host).
- Avoid cloning site files on ingest to cut peak memory and prevent OOM.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Split queries into ASCII and Han runs so mixed input like "EventBus怎么用"
  matches (whitespace splitting collapsed it to one token that matched nothing).
- In hybrid mode, when the embedding provider is mock, rank by keyword only —
  the pseudo-random vectors otherwise buried strong keyword hits. Explicit
  semantic mode still uses the vectors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Fall back to CommonMark (format md) + rehype-raw when MDX compile fails, so
  imported plain Markdown (Pascal braces, <generics>, raw HTML) renders instead
  of being dumped as raw text or silently dropped.
- Restore list markers (global reset stripped list-style) and add blockquote
  vertical spacing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Right rail shows the current page's own heading tree (本页目录) instead of the
  module entry list; drop the auto-generated description lead that duplicated
  garbage at the top of each doc.
- A single-doc category redirects to the full doc viewer rather than embedding
  it in an iframe (which nested a second Modex chrome); guard null modules so a
  parent category with only sub-categories no longer 500s.
- Topbar: wider search box, smaller Ask-AI button, more spacing between items.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
dependabot Bot and others added 25 commits June 22, 2026 11:41
Bumps node from 20-alpine to 26-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 26-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
…6-alpine

chore(deps): bump node from 20-alpine to 26-alpine in /frontend
Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.9.0 to 9.21.0.
- [Release notes](https://github.com/redis/go-redis/releases)
- [Changelog](https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md)
- [Commits](redis/go-redis@v9.9.0...v9.21.0)

---
updated-dependencies:
- dependency-name: github.com/redis/go-redis/v9
  dependency-version: 9.21.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file go Pull requests that update go code labels Jun 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file go Pull requests that update go code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant