我是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查询,并且一次或两次搜索)
答案 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很容易获得日期范围,但是更难以增加分数,因为您需要检索当前分数然后将其写回。
您还可以使用两者的混合,将日期存储在已排序的集合中,并使用它来查找散列中的日期。这取决于您的数据以及您是否事先知道日期。