2017-10-05 46 views
0

我是Redis的新手,尝试使用php和redis实现一件事情。我只是在mysql中描述条件,我不会从mysql迁移任何东西到redis。从MySQL使用案例中了解Redis

比方说,我有一个表,其中我将存储用户的日常消费,用以下结构

+-----------+------------+---------+ 
| user_id | date | count | 
+-----------+------------+---------+ 
| 123  | 2017-06-06 | 231 | 
| 123  | 2017-06-07 | 456 | 
| 124  | 2017-06-06 | 433 | 
| 124  | 2017-06-07 | 188 | 
+-----------+------------+---------+ 

计列将在下列方式更新,每一个电话

UPDATE `table` 
SET count = count + 12 
WHERE user_id = 123 AND date = 2017-06-06 

在了解Redis之后,我了解Redis中没有表格的概念并且存储这些数据,我应该使用以下格式的密钥:

(e.g. key user:123:date:2017-06-06) 

127.0.0.1:6379> INCRBY user:123:date:2017-06-06 12 
(integer) 12 
127.0.0.1:6379> INCRBY user:123:date:2017-06-06 32 
(integer) 44 

到目前为止好。

现在我面临的问题是查询。 在MySQL中,在每月结束时,我可以简单地使用下面的查询用户展示他们的消费和结算:

SELECT `date`,`count` FROM `table` WHERE `date` > 'some_date' AND `user_id` = 123 

SELECT SUM(`count`),`user_id`,MONTH(date) GROUP BY `user_id`,MONTH(`date`) 

但我不知道如何在Redis的做到这一点,如果我想计算单个用户,那么很容易,因为我知道关键的格式,并user_id说明,这样我就可以创建密钥,并获取准确的数据,我需要

127.0.0.1:6379> GET user:123:date:2017-06-06 32 

但就是疗法e类似的东西或类似的东西

127.0.0.1:6379> GET user:*:date:* 

或者redis不是为这种类型的查询和东西?

任何帮助将是appreciated.Thanks (或者,如果你能告诉我一些有用的文档)

(原因,我实现它在Redis的,而不是MySQL的是,将会有每秒许多增量查询,约数百我认为Redis的将是这将是唯一INCR查询this.As最大的时间提供更好,一次或两次搜索)

回答

1

有几种不同的方式可以将数据存储在redis中,这有助于查询。

如果您将每个用户存储在自己的设置中,例如

HSET user:1234 date:2017-06-06 231 

那么这将是很容易的递增数:

HINCRBY user:1234 date:2017-06-06) 

但更难以得到的日期范围(你需要通过它检查日期检索整个哈希,然后循环。)

如果你使用存储时代日期的有序集合每个用户日期:

ZADD userdates:1234 1507317704 123 

然后使用ZRANGEBYSCORE可以轻松获得日期范围,但难以增加分数,因为您需要检索当前分数然后将其写回。

您也可以使用这两者的混合,将日期存储在有序集合中,然后使用它在哈希中查找日期。这取决于你的数据,如果你事先知道日期。