如何在Nest.js中使用Redis实现指定Key数值递增及解决相关报错
在Nest.js中实现Redis的INCR命令
问题分析
你遇到的Property 'getClient' does not exist on type 'Store'错误,是因为TypeScript无法识别cache-manager-redis-yet提供的Redis特定存储类型。通用的Store类型没有getClient方法,需要显式将存储实例转换为Redis专属类型来访问底层客户端。
修正后的代码实现
1. Redis模块配置
确保模块中注册的服务与实际服务类名一致,并使用registerAsync更安全地加载环境变量:
import { CacheModule } from '@nestjs/cache-manager'; import { Module } from '@nestjs/common'; import { redisStore } from 'cache-manager-redis-yet'; import { RedisUtilityService } from './redis-utility.service'; @Module({ imports: [ CacheModule.registerAsync({ useFactory: () => ({ store: redisStore, host: process.env.REDIS_HOST, port: parseInt(process.env.REDIS_PORT, 10), // 端口需转为数字类型 password: process.env.REDIS_PASSWORD, }), }), ], providers: [RedisUtilityService], exports: [RedisUtilityService], }) export class RedisModule {}
2. Redis工具服务
通过类型转换获取Redis客户端,直接调用incr命令:
import { CACHE_MANAGER } from '@nestjs/cache-manager'; import { Injectable, Inject } from '@nestjs/common'; import { Cache } from 'cache-manager'; import { RedisStore } from 'cache-manager-redis-yet'; @Injectable() export class RedisUtilityService { constructor(@Inject(CACHE_MANAGER) private readonly cache: Cache) {} async incrementCache(key: string): Promise<number> { // 将通用Store转换为RedisStore类型,获取底层ioredis客户端 const redisStore = this.cache.store as RedisStore; // 调用Redis原生INCR命令 const incrementedValue = await redisStore.client.incr(key); return incrementedValue; } }
关键说明
- 类型转换:
cache-manager-redis-yet的RedisStore类型暴露了client属性,该属性是完整的ioredis客户端实例,支持所有Redis原生命令(如incrby、decr、expire等)。 - 环境变量处理:使用
registerAsync确保环境变量加载完成后再初始化Redis连接,避免异步加载问题。 - 端口类型:Redis端口号需要是数字类型,因此使用
parseInt转换环境变量中的字符串值。
内容的提问来源于stack exchange,提问作者Vinay chaurasiya
相关产品推荐
相关产品推荐

