2017-05-16 61 views
1

我试图在nodejs中使用其他Web服务并使用redis进行缓存以提高性能。我想保存为具有ID,商品名称和供应商的商品。如何将对象数据存储在nodejs restis中的redis中

我不想拥有不同的关键所有这些。单键操作的方法是什么?

app.get('/insertOffers', function(req, res) { 
    const {id, offerName, offerVendor} = req.query; 
    client.set('offers',) // client is my redis client 
}); 
+0

如果你真的想把它全部放在一个键里,可以考虑使用[哈希](https://redis.io/topics/data-types-intro#redis-hashes),并且[HGET '/'HSET'](https://redis.io/commands#hash))而不是'GET' /'SET'。但是,哈希项不能有独立的过期时间。通常在Redis中有很多密钥是非常有用的,所以使用''client.set('offer:{id}',JSON.stringify({name:offerName,vendor:offerVendor})) ''应该是要走的路。 – drdaeman

+0

@drdaeman我按照你的建议保存了'client.set('offer:{id}',JSON.stringify({name:offerName,vendor:offerVendor}));'它工作,但是当我试图获得offer offer id明智然后它不起作用。无论我传递什么ID,它总是返回相同的最后保存结果。不是明智的。你能提出建议,当我通过'client.get('offer:{id}',function(err,reply){console.log(reply); }')时,我应该如何实现这种方式。提供ID明智。我认为它是覆盖最后的数据在提供不保存id明智也 –

回答

1

正如@drdaeman说,在评论,使用Redis的哈希为您提供查询一个键,其中子键或哈希键是一个独特的密钥的能力。该命令将类似于以下内容:

HSET offerId offerJSONString 
HGET offerId offerJSONString 

因此,在你明确的功能,你可以这样做:

app.get('/insertOffers', function(req, res) { 
    let offer = { 
     id: req.query.id, 
     offerName: req.query.offerName, 
     offerVendor: req.query.offerVendor 
    } 

    client.hset('offers', offer.id, JSON.stringify(offer), yourCallbackFunction); 
}); 

注意,你当你的数据,你会需要JSON。解析它。

client.hget('offers', offerId, function(err, offer){ 
    let offer = JSON.parse(offer); 
    // do something with offer 
}) 

我想了一个关键的偏好可能是有效的,如果你想以后删除所有用一个命令中的报价,没有查找等。 Redis的速度确实很快,所以在Redis服务器上进行2次往返时,不应该付出沉重的性能成本。

+0

我们不能像'client.set('offer:{id}',JSON.stringify({name:offerName,vendor:offerVendor})); '和'client.get('offer:{id}',function(err,reply){console.log(reply);})' –

+0

@Williams当然,这是正常的方法。然而,在你原来的问题中,你说“我不想拥有不同的关键所有这些。”散列给你1键每个存储所有的报价。实际上它们是一样的,因为你需要'offer'前缀和一个键。 –

+0

也许检查您通过req.query得到的值/发送... –

相关问题