Node.js + Redis多次查找

时间:2014-10-20 14:40:12

标签: node.js redis node-redis

我是关键价值商店的新手,但我想学习。作为个人项目,我尝试使用Node.js和Redis构建库存管理系统。让我们假设这是目前使用的正确技术。

如果我有一个简单的系统,需要跟踪特定位置的小部件数量,能够按小部件或按位置查找详细信息,我根据https://matt.sh/thinking-in-redis-part-one的理解是存储单独的& #34;自定义索引"按地点和项目查询。

在node.js中保存一个新条目然后,我们将使用hmset创建条目,使用sadd将条目添加到2个索引中:

redis.hmset([
    key,
    'attr1', entry.attr1,
    'attr2', entry.attr2,
    'attr3', entry.attr3,
  ],
  function(err) {        
    // add entry to location set
    var locationKey = 'location:' + entry.location;
    redis.sadd(locationKey, key, function(err) {
      redis.expire(locationKey, 900);
    });

    // add entry to widget set
    var widgetKey = 'widget:' + widget.id;
    redis.sadd(widgetKey, key, function(err) {
      redis.expire(widgetKey, 900);
    });

    redis.expire(key, 900);
  }
);

现在,如果我们想将所有小部件从一个位置移动到另一个位置,我们需要从小部件集中获取所有条目,将条目添加到新位置索引,并将其从旧索引中删除:< / p>

// move all widgets to another location
redis.smembers('widget:' + widget.id, function(err, entryKeys) {
  entryKeys.forEach(function(entryKey) {
    // get entry for rebroadcast
    redis.hgetall(entryKey, function(err, result) {
      if (result) {
        // add entry to new location's index
        var locationKey = 'location:' + location;
        redis.sadd(locationKey, entryKey, function(err) {
          redis.expire(locationKey, 900);
        });
        // remove entry from old location's index
        redis.srem('location:' + result.location, entryKey);
      }
    });
  });
});

我担心的是需要为每个命令提出的请求数。添加条目将花费3个数据插入本身,另外3个假设我们想要使数据到期。移动所有小部件将需要1 + n次插入,n次读取和n次删除。

如果这是针对每秒有数百或数千个请求的实时游戏,那么每个命令都可以要求这么多次呼叫吗?这对redis实现是否正常?

1 个答案:

答案 0 :(得分:1)

Redis就是那么快。但是在你的机器或类似的生产机器上做一个运行redis的基准测试。 It is included in redis itself.。 (在此发布回来,我也感兴趣。)

Redis有很多commands可供您使用,而您的数据组织可能会允许更便宜的通话或更少的通话。这取决于您如何布置数据模型。实际上没有&#34;查询语言&#34;像SQL一样可以在查询中做很多事情或者将查询组合成一个查询。 你打算经常使用redis,这是一种与SQL 不同的哲学(在某种程度上)。

这个个人项目将让您了解哪些方面有效,哪些方面可以做得更好,所以对此努力的赞誉。祝你好运!