Nodejs请求redis

工作中遇到的一个问题,之前没接触过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 的知识…

猜你喜欢

发表评论

最新发布