从 MySQL 个用例了解 Redis

Understanding Redis from MySQL use case

我是 Redis 的新手,正在尝试用 PHP 和 Redis 实现一个东西。

我只是在描述 MySQL 中的场景,我不会将任何内容从 MySQL 迁移到 Redis。

假设我有一个table,我将在其中存储用户的日常消费,具有以下结构

 +-----------+------------+---------+
 |  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 中没有 tables 的概念,要存储此类数据,我应该使用以下格式的键:

(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

但是有没有类似的东西

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

或者 Redis 不是为这种类型的查询而设计的吗?

如有任何帮助,我们将不胜感激。谢谢 (或者如果你可以指导我一些有用的文档)

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

Or is redis not made for such type of queries and thing?

这就是它的要点,但您可以 a) 维护自己的搜索索引 - 在 https://redis.io/topics/indexes, or b) use http://redisearch.io 阅读更多内容。

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

如果您将每个用户存储在他们自己的集合中,例如

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

那么增加计数就很容易了:

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

但更难按范围获取日期(您需要检索整个散列,然后遍历它来检查日期。)

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

ZADD userdates:1234 1507317704 123

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

您也可以混合使用两者,将日期存储在排序集中,然后使用它在散列中查找日期。这取决于您的数据以及您是否提前知道日期。