工作中遇到的一个问题,之前没接触过redis,一开始没搞清原理感觉有点复杂,再后来花了点时间学习,发现…还是比较容易掌握基本用法的
npm install redis
let redis = require('redis');
let freeuse_host, freeuse_port = '6379', client;
if(env==='production'||env==='gray'){
freeuse_host = '127.0.0.1';
}else{
freeuse_host = 'redis.xxxxxxx.cn'; // 一个配了本地hosts的IP
}
let freeuse_date = new Date();
let freeuse_year = freeuse_date.getFullYear();
let freeuse_month = freeuse_date.getMonth()+1;
let freeuse_timenow = freeuse_year + "" + freeuse_month; // 201812
let freeuse_timeused; // 已经使用的时间
let freeuse_eid; // eid
let _key; // redis的key
// 真机限时免费活动
app.get('/freeuse', function (req, res) {
console.log("freeuse~~~~~~~~~~~~~~~~~~~!");
console.log(req.query.eid);
client = redis.createClient(freeuse_port,freeuse_host, {connect_timeout: 5}); // 加一个超时时间,避免服务器一直请求redis
client.on('error', function(error) {
console.log("进入的时候无法连接到Redis" + error);
res.send("-1"); // 连接不上redis 直接不让使用 返回 -1; 提示:非法操作
});
client.on('connect',function() {
console.log("进入的时候可以连接到Redis");
freeuse_eid = req.query.eid; // eid
_key = "remote_freeuse_" + freeuse_eid ; // redis的key
console.log("_key", _key);
client.setnx(_key , freeuse_eid + "_" + freeuse_timenow, function(err, replies){
console.log("replies", replies);
if(replies == 0){ // 如果有redis
client.get(_key , function(err, res2){
console.log("res2", res2);
let _r2 = res2.split("_");
let timenow_redis = _r2[1]; // redis中的当前年月 清零用
freeuse_timeused = _r2[2]; // 已经使用的时间
console.log("freeuse_timenow", freeuse_timenow);
console.log("freeuse_timeused", freeuse_timeused);
if(Math.round(timenow_redis) === Math.round(freeuse_timenow)){ // 还在当前月份 判断使用时长有没有超过60分钟
if(freeuse_timeused > 60){
res.send("60");
}else if(freeuse_timeused <= -1){
res.send("-1");
}else{
// 只要打开真机 还有剩余时长 就开始扣一分钟
freeuse_timeused++;
client.set(_key , freeuse_eid + "_" + freeuse_timenow + "_" + freeuse_timeused ,function(err, res3){
console.log("只要打开真机就扣一分钟,已用时长:", freeuse_timeused);
res.send(freeuse_timeused + "");
});
}
}else{ // 不在当前月份 清零时长
client.set(_key, freeuse_eid + "_" + freeuse_timenow + "_" + 0 ,function(err, res4){
client.expire(_key, 60 * 24 * 60 * 60); // redis 60天过期时间
res.send("0");
});
}
});
}else{ // 没有redis 表示第一次使用, 已经使用0分钟传给前端
client.set(_key, freeuse_eid + "_" + freeuse_timenow + "_" + 0 ,function(err, res1){
client.expire(_key, 60 * 24 * 60 * 60); // redis 60天过期时间
res.send("0");
});
}
});
});
});
// 前端定时请求 改变已经使用的时间
app.get('/freeuseupdate', function (req, res) {
client = redis.createClient(freeuse_port,freeuse_host, {connect_timeout: 5}); // 加一个超时时间,避免服务器一直请求redis
client.on('error', function(error) {
console.log("前端定时刷新接口的时候无法连接到Redis" + error);
res.send("-1"); // 连接不上redis 返回 -1;
});
client.on('connect',function() {
client.get(_key , function(err, res2){
// 定时刷新时间 把用了多少时长传给前端 单位:分钟
let _r2 = res2.split("_");
freeuse_timeused = Math.round(_r2[2]); // 已经用完的时间
freeuse_timeused++;
console.log(freeuse_timeused);
client.set(_key, freeuse_eid + "_" + freeuse_timenow + "_" + freeuse_timeused ,function(err, res1){
res.send(freeuse_timeused + "");
});
});
});
});
临时学的拿来用,写得比较恶心,以后再补一下 redis 的知识…