2017-10-05 18 views
0

私はRedisを初めて使い、phpとredisを使って実装しようとしています。私はちょうどmysqlの状態を記述しています、私はmysqlからredisに何かを移行していません。MySQLのRedisの使用例を理解する

のは、私はすべての呼び出し

UPDATE `table` 
SET count = count + 12 
WHERE user_id = 123 AND date = 2017-06-06 
で、カウント列は次のように更新される

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

次のような構造で、私は、ユーザーの日々の消費量を格納する表を、持っているとしましょう

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 

が必要な正確なデータを取得することができます。しかしTHERです何かのようなものか何か類似のもの

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

このような種類のクエリやものについては、

すべてのヘルプはappreciated.Thanks を

(理由(あなたはいくつかの有用な文書を私に指示することができます場合は)、私は毎秒何インクリメントクエリがあるだろう、MySQLがあるRedisの中でそれを実装しておりませんでしょう何百回も、私はレディスがこれより優れていると思っていました。最大時間はINCRクエリだけで1-2回の検索です)

答えて

1

データをクエリに役立つように赤字で保存するには、いくつかの方法があります。

各ユーザーを独自のセットに保存した場合(例:

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

カウントをインクリメントすることは非常に簡単だろう:

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

しかし、より困難な範囲で日付を取得するには(あなたはそれが日付をチェックして全体のハッシュと、ループを取得する必要があるだろう。)

あなたが保存されている場合、各ユーザーはエポックの日付を使用してソートセットに日付:

ZADD userdates:1234 1507317704 123 

その後、ZRANGEBYSCOREを使用して日付範囲を取得するのは簡単ですが、現在のスコアを取得してそれを書き戻す必要があるため、スコアを増やすことは難しくなります。

また、ソートされたセットに日付を格納し、それを使ってハッシュの日付を検索するハイブリッドを使用することもできます。あなたのデータと、事前に日付を知っているかどうかによって異なります。

1

このような種類のクエリやものは作成されていませんか?それの要点ですが、あなたはどちらかのa)の検索のために、独自のインデックスを維持することができ

からhttps://redis.io/topics/indexesで続きを読む、またはb)それを行うにはhttp://redisearch.ioを使用しています。