Redis
介绍
Redis 用作缓存,主要用来缓存一些访问量较大的数据查询,以减轻数据库的查询压力
官网的描述是
Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine.
使用
在本项目中,我们使用了 ioredis 这个库,这是使用 Nodejs
来操作 Redis 的良好实践
Redis 的配置文件在 src/config/redisConfig.ts
文件下
import Redis from 'ioredis'
import env from '@/config/config.dev'
const redisClient = new Redis({
port: parseInt(env.REDIS_PORT),
host: env.REDIS_HOST,
})
redisClient.on('connect', () => {
console.log(
`redis: ${env.REDIS_HOST}:${env.REDIS_PORT} connection successful! `
)
})
和前面的 Mongoose
操作 Mongodb
一样,我们使用了 .env
文件中的环境变量
.env
文件中读取出来的 key-value 都是 string
类型,所以我们将 REDIS_PORT
转换为 number
我们将 Redis 的基本操作封装为了三个函数便于操作
RedisInsight
如果不喜欢 Redis-cli 直接操作 redis,可以使用 Redis 官方的 GUI 操作工具 RedisInsight
官网的描述为
The best Redis GUI
例子
在我们的项目中,Redis 主要在下面几个地方用到
登陆冷却时间
可以看到 src/controller/userController.ts
中的 login
这个类成员函数
const loginCD = await getValue(`loginCD:${name}`)
if (loginCD) {
ctx.app.emit('kunError', 10112, ctx)
return
} else {
setValue(`loginCD:${name}`, name, 60)
}
这里我们借助 Redis 的失效时间实现了登陆冷却时间,如果有其他地方有这个需求也可以用类似的方法实现
JWT 有效时间
可以看到 src/service/authService.ts
中的 generateTokens
这个类成员函数
await setValue(`refreshToken:${uid}`, refreshToken, 7 * 24 * 60 * 60)
这里将 token 在 redis
中留存一份,便于后续的操作
验证码有效时间
可以看到 src/service/authService.ts
中的 sendVerificationCodeEmail
这个类成员函数
同样的,它是利用 Redis 的过期时间实现的