node.js下操作redis问题窜库问题

SnailCoder 发布于 2013/08/08 11:20
阅读 1K+
收藏 0

Node.js开发环境下,从MySQL读取数据,将MySQL不同表中的数据缓存至redis中不同的库中,代码如下:

// 初始化应用信息
var init_app_info = function(mysql, redis, config) {
    mysql.query('select * from bg_app_info', null, {logging:false, plain:false, raw:true}).success(function(res){
        if(res.length > 0) {
            res.forEach(function(app){
                var redis_app_info = 'AppInfo:' + app.id;
                var redis_app_key  = 'AppKey:' + app.appkey;
                redis.select('1', function(){
                    redis.hmset(redis_app_info, app);
                    redis.del(redis_app_key, function(){
                        redis.set(redis_app_key, app.id);
                    });
                });
            });
        }
    });
}
// 初始化广告投放关键字
var init_ad_keyword = function(mysql, redis, config) {
    mysql.query('select * from bg_ad_keyword', null, {logging:false, plain:false, raw:true}).success(function(res){
        if(res.length > 0) {
            res.forEach(function(info){
                redis.select('2', function(){
                    var redisKey = 'adkeywordadid:' + info.ad_id;
                    redis.lpush(redisKey, info.keyword);
                });
            });
        }
    });
}
以上代码在同一个脚本中,运行该脚本,发现数据并没有按要求写入指定的redis库中,而是出现交叉存放。现在想请教如何解决以实现最初的要求。

加载中
0
zhangshine
zhangshine
交叉存放什么意思?
0
SnailCoder
SnailCoder

@zhangshine

交叉的意思就是原本希望将bg_app_info数据存放在redis的1数据库中,将bg_ad_keyword数据存放在redis的2数据库中,但是发现bg_app_info的部分数据出现在了redis的2数据库中。所以想问,有什么解决方法实现最初的想法。

0
zhangshine
zhangshine
是不是你这2个函数共用一个redis对象?
0
SnailCoder
SnailCoder

@zhangshine

是的呀

var Redis   = require('redis');
var redis  = Redis.createClient(config.redis.port, config.redis.host);

0
zhangshine
zhangshine
调用redis的方法也是要异步进行的,楼主的res.forEach部分可以用async库重写,而且2个函数也要有callback,总之就是流程有问题
0
打杂程序猿
打杂程序猿
.....流程问题你的redis 是全局变量..
你目前的情况是:
同步的过程:
redis  1 <-> redis 2

异步回调使用的对象:
callback -> redis 2 or redis1 ?(没有维护好对象状态)

要解决这个问题,最简单就是建两个redis 选择不同的库..要不就是,先set好redis1 再去set redis2

对了,查mysql的是异步的,根据回调的情况,全局redis的状态是在不断的变化..
0
打杂程序猿
打杂程序猿
补充一点,单线程,异步,多考虑全局对象的状态变化..
返回顶部
顶部