Skip to content

fix(cache): Redis ストアを Keyv アダプタへ切り替え(cache-manager v7 対応) - #36

Merged
Cho-Geer merged 1 commit into
developfrom
fix/cache-store-keyv-redis
Sep 10, 2026
Merged

Cho-Geer merged 1 commit into
developfrom
fix/cache-store-keyv-redis

Conversation

@Cho-Geer

Copy link
Copy Markdown
Owner

概要

検証コードが Redis に保存されず、ログイン・登録の E2E が全件タイムアウトする不具合を修正します。

症状

  • API は 200 验证码发送成功 を返す
  • バックエンドも 保存验证码: 139xxxx - 654321 をログ出力する
  • しかし E2E が Redis から検証コードを読めず Timed out waiting for verification code で全件失敗する

原因

cache-manager v7 は内部で Keyv を使うため、stores: Keyv[] を要求します。一方 cache-manager-redis-store v3 は Keyv 以前の旧インターフェース実装です。

そのため cacheManager.set() は例外を出さずに成功を返すものの、実 Redis には一切書き込まれません(サイレント失敗)。

実測(ローカル):

検証 修正前 修正後
cache.get "654321"(インメモリから返る) "654321"
生 Redis の get null {"value":"654321",...}
生 Redis の dbsize 0 1
生 Redis の keys '*' [] ["verification_code:..."]

補足: cache-manager-redis-store の最新版は 3.0.1(2022-10 公開)で、v4 系は存在しません(npm view cache-manager-redis-store@4 → E404)。v7 世代に追随していないため、このパッケージでは解決できません。

変更

src/app.module.ts

// before
store: redisStore as any,
host: ..., port: ..., password: ..., max: 1000,

// after
stores: [ createKeyv({ url: `redis://host:port`, password }) ],
  • createKeyv は @keyv/redis の公式ファクトリです
  • ttl はミリ秒のまま(Keyv 実測で 5000 を渡すと pttl 4999 になることを確認)

package.json

  • 削除: cache-manager-redis-store, @types/cache-manager-redis-store
  • 追加: @keyv/redis

@nestjs/cache-manager@3.0.1 は cache-manager >=6 を要求するため、そのままで整合します(ダウングレード不要)。

検証

コマンド 結果
npx tsc --noEmit exit 0
npm run lint:check 0 errors / 46 warnings
npm test -- --runInBand 19 suites / 285 tests 全緑
ローカル Redis 実測 生 Redis に書き込まれることを確認(TTL 299999ms = 5 分)

影響範囲

  • 検証コードだけでなく、トークンブラックリスト(blacklist:*)も同じ経路で書き込まれていました。本修正でそちらも実際に機能するようになります
  • 他に cacheManager を使う箇所(health チェック、users サービス)も同一ストアを共有します

補足

検証コードが Redis に保存されず、ログイン・登録の E2E が全件タイムアウトする不具合を修正。

原因: cache-manager v7 は内部で Keyv を使うため stores: Keyv[] を要求するが、cache-manager-redis-store v3 は Keyv 以前の旧インターフェース実装だった。そのため cacheManager.set は成功を返すのに実 Redis には一切書き込まれない(サイレント失敗)状態だった。

- app.module.ts: store: redisStore を stores: [createKeyv({url, password})] に置き換え

- package.json: cache-manager-redis-store と @types/cache-manager-redis-store を削除し @keyv/redis を追加

- TTL はミリ秒のまま(Keyv 実測で 5000 -> pttl 4999ms)。既存の 300*1000 = 5 分は意図どおり
@Cho-Geer
Cho-Geer merged commit f7e36e5 into develop Sep 10, 2026
3 checks passed
@Cho-Geer
Cho-Geer deleted the fix/cache-store-keyv-redis branch September 12, 2026 12:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants