2016-06-18 37 views
1

我正在寻找使用模式。对于每一个请求,我将采取相应的第二天,并标记一个条目。最后我会看到这个使用模式。在redis中执行此操作的最佳结构是什么?如何在redis中存储每秒数据

回答

2

你可以将其存储在三个方面:

1)setbit操作在一个关键

存储可以使用setbit操作如果频率是非常高的。这就是说,如果你标记几乎所有秒,那么你必须在那里存储86400个值。但这很难以0.1 Mb来存储。 即使您在第86400秒只存储一个条目,那么您也必须忽略该0.1 Mb。但它总是固定的大小为0.1 Mb。另外要注意的是,你可以把整个东西当作一个字符串,并且你必须将它们转换为一些位。

setbit date second 
get date 

2)设置

您可以使用组如果频率有点低。所以只有请求出现的秒数才会在你的设置中。

Sadd date second 
smembers date 

3)散列

您可以使用哈希值,如果想知道每一秒计数。

Hincrby date second 1 
hgetall date 

还对所有这些做一个样本测试,并比较大小和效率。

+0

感谢您的回答。我想我会选择第一个解决方案。在如何在redis中一次获取所有位值之间。我看到的只是getbit命令。 –

+0

http://grantmuller.com/be-careful-with-your-redis-bitsets-and-java/ –

+0

您必须获得结果作为日期,并且必须将它们转换为应用程序逻辑中的相应位。以上链接将帮助您达到相同的效果。 –

0

我会使用一个哈希组按天。

// Set the counter to 0 if it doesn't exist. 
HSETNX [DAY] [SECOND] 0 

// Increment the counter by 1 each request 
HINCRBY [DAY] [SECOND] 1 

然后使用HKEYSHSCAN,让您的结果。

+0

如果我没有在第二次进入请求,我该如何做hsetnx? Hincrby本身就足以进行这项手术吗? –