2014-04-07 75 views
1

我想每小时存储用户花费的金额。但是我不知道哪个是最好的方法或者使用最好的数据结构。使用redis存储每小时数据的最佳方法

我想和user_ID的哈希:年月日,然后小时元素融入,如下所示:

Bsjdyebs8yb58b:2014:04:07 
-- 01 : 215$ 
-- 02 : 8719$ 
-- 03 : 942$ 
-- ... 
-- 23 : 100$ 

Jsbjub75458b:2014:04:07 
-- 01 : 5$ 
-- 02 : 89$ 
-- 03 : 42$ 
-- ... 
-- 23 : 10$ 
+0

对不起,每一个 - 应该在一个新的林e显示每个散列的内容。 – Pepeluis

+0

你想如何使用存储的数据? –

+0

我想不断更新所花费的钱,然后在一天结束时获取所有数据。 – Pepeluis

回答

0

相信哈希是这样做的好方法。你可以建立类似的东西:

HSET user:1000 2014-04-07:01 "10$" 
HSET user:1000 2014-04-07:02 "50$" 
HSET user:1000 2014-04-07:03 "40$" 

更多有关哈希:

http://redis.io/commands#hash

+0

你为什么写用户:? – Pepeluis

+0

这仅仅是一个例子。您可以用您的user_id或任何其他标识替换您的用户:xxxx。 – Sefa

+0

为什么说格式2014-04-07:03? – Pepeluis

0

另一种方法是使用一个ZSET

ZADD user:1000 2014040701 "<uniquefier> 10$" 
ZADD user:1000 2014040701 "<uniquefier> 10$" 
ZADD user:1000 2014040701 "<uniquefier> 20$" 

对于<uniquefier>(你,因为一个成员的有序集合唯一性的需要),你可以使用几件事情:

  1. 通过HSETHINCRBY
  2. 每个用户的序列
  3. 您可能手头已有的会话ID +会话序列
  4. 'ticks'中的时间戳(如果这足够精确,请注意)
  5. 一个GUID

这种设置很好地进行扩展,并通过ZRANGEBYSCORE你可以立即获得该时间戳小时的所有排序集成员。

如果结合这与即将推出的ZRANGEBYLEX,并交换uniquefier /金额$,你可以做各种疯狂的查找,天空(好吧,也许直到云)是极限。

干杯,TW

谨慎

字:使用15位以上的SCORE时要小心,如果你想每分钟或每秒或每毫秒存储。你会失去精确性; SCORE是一个浮点数。更确切地说:IEEE 753 FP双。

1

有一个命令来自动递增散列值。它叫做HINCRBYFLOAT

用户每次花费,你应该执行这样的:

HINCRBYFLOAT usr.dailySpending.user_id YYYMMDDHH moneyAmount 

这是你的程序,当用户Bsjdyebs8yb58b花费今天$ 20.50在下午4点应执行以下命令:

HINCRBYFLOAT usr.dailySpending.Bsjdyebs8yb58b 2014040816 20.50 

当你想要读取的值,命令将是:

HMGET usr.dailySpending.Bsjdyebs8yb58b 2014040816 
+0

好,OP只对累积量感兴趣,所以这可能是最好的答案。 OP可能不得不按货币分割,但如果需要的话,这是微不足道的。微小的添加:用户要求YYYMMDDHH。再次,微不足道。 +1 –

+0

谢谢,我改变了小时费用的答案。 – sscarduzio

相关问题