Redis でリーダーボードを構築し、トップX
スコアを取得して user のランクを取得できるようにしようとしていますY
。
Redis のソートされたリストは、1 つの問題を除いて簡単に適合するように見えます。実際のスコアだけでなく、日付でもスコアをソートする必要があります (そのため、以前に同じスコアを取得した人が一番上に表示されます)。SQL クエリは次のようになります。
select * from scores order by score desc, date asc
zrevrange
Redis でソート済みセットを実行するには、次のようなものを使用します。
select * from scores order by score desc, key desc
これにより、辞書編集的に大きなキーを持つユーザーが上に配置されます。
私が考えることができる 1 つの解決策は、スコアとタイムスタンプで構成される結合された数値を生成するために、並べ替えられたセット内のスコア フィールドを操作することです。
たとえば555
、タイムスタンプ付きのスコアの場合111222333
、最終的なスコアは、555.111222333
新しいスコアを古いスコアの上に置くようなものになる可能性があります (正確には必要なものではありませんが、さらに調整することができます)。
これは機能しますが、ソートされたセットのスコアには有効数字が 16 桁しかないため、そのうちの 10 桁がタイムスタンプですぐに無駄になり、実際のスコアの余地があまり残らないため、小さな数字でのみ機能します。
ソートされたセットに正しい順序で値を配置する方法はありますか? そのようなセットを構築するためにいくつかの一時的な構造と並べ替えが必要な場合でも、最終結果を並べ替えられたセット (ユーザーのランクを簡単に取得するため) にしたいと思います。