一、什么情况下会用到Redis?
1、高并发的情况
读写并发的请求过大,需要一个缓存空间换时间,比如 抢购下的写订单,假如5000/s甚至更高,数据库处理不过来,响应时间过慢,这个时候加redis缓存订单,然后多线程异步写,会比一堆请求往数据库阻塞在那里好。同理读也是一样的,就是用空间换时间
2. 一些需要超时失效的数据
比如session、Token(验证)、短信验证码等
二、以需要超时失效(短信验证)的数据举例
短信验证
1、短信验证码发送给用户,需要在服务器留存记录
2、用户需要再一定时间(比如5分钟)输入短信验证码
3、服务器对用户提交的验证码进行比对,如果超时,就提示用户重新获取,如果正确,就记录用户的登录信息
三、REDIS初始化
1、在centos下安装redis
【REDIS】在CentOS环境下使用yum快速安装Redis
2、npm
npm i egg-session-redis egg-redis --save
3、plugin.js
// {app_root}/config/plugin.js
sessionRedis: {
enable: true,
package: 'egg-session-redis',
},
redis: {
enable: true,
package: 'egg-redis',
},
4、config.default.js
config.redis = {
client: {
host: process.env.EGG_REDIS_HOST || '127.0.0.1',
port: process.env.EGG_REDIS_PORT || 6379,
password: process.env.EGG_REDIS_PASSWORD || '',
db: process.env.EGG_REDIS_DB || '0',
},
};
四、REDIS的具体代码部分
实现方式很简单,将返回的smsid和验证码直接放到redis中,然后设定一个超时的时间。
在用户提交的时候,到redis取得,如果redis不存在,就表明超时了。如果存在就进行验证,验证短信码是否正确。
备注:验证码部分不在此文进行描述。
- 在发送短信验证码的地方记录短信信息
let smsid; // 发送短信返回的id值
let randcode; // 自动生成的随即六位验证码
// .....略
const expIn = 60 * 5; // 如果5分钟不输入,就过期
await this.app.redis.set('vc-' + smsid, randcode, 'ex', expIn);
- 提交短信验证码进行验证
const smsauth = ctx.request.body.smsauth;
let code = 'OK';
let message = '';
const token = {};
const mobile = smsauth.mobile;
const smsid = smsauth.smsid;
const smscode = smsauth.smscode;
const redis_vc = await this.app.redis.get('vc-' + smsid);
if (redis_vc === null) {
code = 'ERROR';
message = '超时,请重新获取验证码。';
} else if (redis_vc === smscode) {
// 检查是否存在user,如果没有就添加
code = 'SUCCESS';
message = '登陆成功';
} else {
code = 'ERROR';
message = '验证码错误,请重新输入';
}
注:redis真正的优势是在高并发的情况。
网友评论