1

redis にスコアリング システムを実装しようとしています。私はこれまでに経験したことがありません。

私のアプリがすべきことは、ユーザーがまだ投票していない場合にのみ値を増やすことです。そのため、次のようなことを考えていました:

INCR voteme

ただし、これがまだ増加していない場合にのみ、次のことを行いたいと考えています。

SET voteme:voterip 1

だから私は要素を数えます。問題は、これは redis では実行できないと思い、別のアプローチを考えなければならないことです。

何か案は?


追加の質問:

結果のカウント(例:24)をmongodbの対応するユーザーに書き込むことにより、このデータを永続的にしたいと考えています。いくつかの疑似コードは非常に役立ちます

4

1 に答える 1

1

カウンターは保存しませんが、すでに投票したすべてのユーザーを含むセットを直接保存します。

ユーザー1に投票が行われると仮定します。ユーザーXがユーザー1に投票するたびに、次の操作を実行できます。

 SADD user:1:votes X

ユーザー1の投票数は簡単に取得できます。

 SCARD user:1:votes

これで、このカウントを別のストアと同期させる必要がある場合は、次のように実行できます(ユーザーXがユーザー1に投票したと仮定します)。

 MULTI
 SADD users:1:votes X
 SCARD user:1:votes
 EXEC

秘訣は、SADDコマンドがセットに効果的に追加されたアイテムの数を返すことです。アイテムがすでに存在する場合は0を返します。したがって、このmulti / execブロックを実行し、SADDの結果を確認し、セットのカーディナリティ(投票数)を取得し、カーディナリティを別のストアにプッシュするのは非常に簡単です。セットはトランザクションによって変更されました。

このようにして、不要な投票イベントをフィルタリングしながら、永続ストアでカウンターを(リアルタイムで)最新の状態に保ちます。

于 2012-07-11T08:22:20.423 に答える