我想每小时存储用户花费的金额。但我不知道哪种方法最好或者使用最好的数据结构。
我想到了一个带有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$
答案 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$"
有关哈希的更多信息:
答案 2 :(得分:0)
另一种方法是使用ZSET
。
ZADD user:1000 2014040701 "<uniquefier> 10$"
ZADD user:1000 2014040701 "<uniquefier> 10$"
ZADD user:1000 2014040701 "<uniquefier> 20$"
对于<uniquefier>
(由于排序集中成员的单一性,需要),您可以使用以下几种方法:
HSET
和HINCRBY
此设置可以很好地扩展,通过ZRANGEBYSCORE
,您可以立即获得该时间戳小时的所有已排序的成员。
如果你将它与即将到来的ZRANGEBYLEX
结合使用,并交换uniquefier / amount $,你可以做各种疯狂的查找,天空(好吧,可能直到云端)是限制。
干杯,TW
注意事项:SCORE
使用超过15位的数字时要小心,以防您希望每分钟或每秒或每毫秒存储一次。你将失去精确度; SCORE是一个浮点数。更确切地说:IEEE 753 FP双倍。