使用redis存储每小时数据的最佳方法

时间:2014-04-07 19:19:17

标签: database redis statistics

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

我想到了一个带有user_id的哈希:YYYYMMDD,然后是几小时的元素,如下所示:

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

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

3 个答案:

答案 0 :(得分:1)

有一个命令以原子方式递增哈希值。它被称为 HINCRBYFLOAT

每次用户花费时,您都应该执行此操作:

HINCRBYFLOAT usr.dailySpending.user_id YYYMMDDHH moneyAmount 

当用户Bsjdyebs8yb58b今天下午4点花费20.50美元时,这是您的程序应该执行的命令:

HINCRBYFLOAT usr.dailySpending.Bsjdyebs8yb58b 2014040816 20.50

如果要读取值,则命令为:

HMGET usr.dailySpending.Bsjdyebs8yb58b 2014040816

答案 1 :(得分: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

答案 2 :(得分: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. &#39;刻度线中的时间戳&#39; (如果这足够精确,请小心)
  5. 指导
  6. 此设置可以很好地扩展,通过ZRANGEBYSCORE,您可以立即获得该时间戳小时的所有已排序的成员。

    如果你将它与即将到来的ZRANGEBYLEX结合使用,并交换uniquefier / amount $,你可以做各种疯狂的查找,天空(好吧,可能直到云端)是限制。

    干杯,TW

    注意事项:SCORE使用超过15位的数字时要小心,以防您希望每分钟或每秒或每毫秒存储一次。你将失去精确度; SCORE是一个浮点数。更确切地说:IEEE 753 FP双倍。