从 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 获取日期范围会很容易,但很难增加分数,因为您需要检索当前分数然后将其写回。
您也可以混合使用两者,将日期存储在排序集中,然后使用它在散列中查找日期。这取决于您的数据以及您是否提前知道日期。
我是 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 获取日期范围会很容易,但很难增加分数,因为您需要检索当前分数然后将其写回。
您也可以混合使用两者,将日期存储在排序集中,然后使用它在散列中查找日期。这取决于您的数据以及您是否提前知道日期。