1

Web アプリケーションのデータ ストアとして redis を使用しています。基本的な設計は、オブジェクトのハッシュとインデックスの zsets に基づいて構築されています。

user:<USER_ID> => hash(username: STRING, user_id: INTEGER, last_visit_date: FLOAT, create_date: FLOAT)
users:by_last_visit => zset( (last_visit_date, user_id) ...)
users:by_create_date => zset( (create_date, user_id) ... )

私の日付はエポックからの秒数として保存されます。これは、この時点まで非常にうまく機能しています。強力な zset 操作を使用して、関連する範囲をすばやく取得したり、ページネーションを実行したりできます。また、順序付けの要件は自然に浮動小数点空間にマップされます。

ただし、今はアルファベット順にソートする必要があります。zset が値のアルファベット順に並べ替えて、スコアが同点になることを私は知っています。これまでの私の最善の解決策は、文字列をスコア 0 の値として入れ、この機能に頼ることです。値として ID を持つセットと値として文字列を持つセットがいくつかあるため、これは好きではありません。特定の時間に使用しているセットのタイプを特定し、文字列を ID にマップするアプリケーション ロジックが必要です。また、自由にセットを結合/交差する能力を失います。

私の次善の策は、文字列を浮動小数点スコアにマップすることですが、文字列が任意に長くなる可能性があるため、これは非常に面倒でエラーが発生しやすいようです。

文字列をすべて同じスコアで zset に投入し、ID への逆マップを維持するよりも良いオプションはありますか? それが最善の解決策であると仮定すると、それは信頼できますか (つまり、副作用または実際の機能に依存していますか)?

4

0 に答える 0