从MySQL用例

时间:2017-10-05 08:26:37

标签: mysql redis data-migration querying

我是Redis的新手,并试图用php和redis实现一个东西。我只是在mysql中描述条件,我没有从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中执行此操作,如果我想为单个用户计算,那么很容易因为我知道key的格式并且有user_id,所以我可以创建密钥并获取精确数据我需要

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

但是有类似的东西吗?

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

或者redis不是为了这类查询而做的吗?

任何帮助都将不胜感激。谢谢 (或者如果你能指导我一些有用的文件)

(原因,我在Redis中实现它而不是MySQL,每秒会有很多增量查询,大约有数百个,我认为Redis对此更好。作为最大时间,它只会是INCR查询,并且一次或两次搜索)

2 个答案:

答案 0 :(得分:1)

  

或者redis不是为了这类查询而做的吗?

这是它的要点,但你可以a)维护自己的搜索索引 - 在https://redis.io/topics/indexes阅读更多内容,或b)使用http://redisearch.io来执行此操作。

答案 1 :(得分:1)

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

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

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

然后增加计数非常容易:

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

但更难以按范围获取日期(您需要检索整个哈希,然后循环检查日期。)

如果您使用纪元日期将每个用户日期存储在已排序的集合中:

ZADD userdates:1234 1507317704 123

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

您还可以使用两者的混合,将日期存储在已排序的集合中,并使用它来查找散列中的日期。这取决于您的数据以及您是否事先知道日期。