2017-05-16 4 views
2

Je voudrais utiliser un ensemble trié par redis comme tableau de classement. Mais en utilisant ZREVRANGE 0 x, je ne peux obtenir le haut x de la partition (la fin de la partition à base croissante Selon set), avec le départage par défaut qui est de la documentation Redis officielle:Redis a trié l'ensemble basé sur le score et l'heure de la date comme briseur de cravate?

ordre lexicographique est utilisé pour les éléments avec un score égal.

Le disjoncteur dont j'ai besoin est l'heure de la saisie du score.

par exemple.

submits (in order)  redis sorts it as  I need 
User1 -- Score 50  User1     User1 
User3 -- Score 40  User2     User3 
User2 -- Score 40  User3     User2 

La seule solution que je vois est de stocker l'heure de la date de la dernière mise à jour sur l'entrée, mais toujours utiliser ZREVRANGE key 0 x pour obtenir des scores max et min des meilleurs utilisateurs x. Ensuite, faites un ZREVRANGEBYSCORE key max min. Si la longueur du résultat est supérieure à x, il y a au moins une cravate donc je trie cette liste plus petite dans Lua en utilisant 2 clés.

Cette méthode semble très lente et je dois la faire fonctionner pour des centaines de milliers d'utilisateurs. Je n'aime pas les 2 appels et le traitement avec Lua (du côté des redis, pour rester atomique) et aimerais savoir s'il y a une meilleure façon d'utiliser 2 clés pour les ensembles triés ou de configurer un autre tie breaker?

Mon code est déjà écrit, donc je ne peux pas changer mon type de base de données. Si vous avez une idée intéressante, je suis intéressé de les entendre, car je ne suis pas un expert de Redis.

Répondre

5

Le score d'ensemble trié est une valeur à virgule flottante. Votre score et datetime du score peuvent tous deux s'intégrer dans cela.

  1. Le score serait un nombre entier dans une plage, par exemple de 0 à 2^10, aura besoin 10 bits seulement
  2. Le score peut être secondes timestamp unix depuis Jan'2010 (pour réduire la taille de l'horodatage , pour plus de simplicité, vous pouvez même prendre un timestamp unix simple en entier)

Appelons maintenant le score redis en tant que RScore. Vous pouvez placer le score de la personne dans les 10 bits les plus à gauche du numéro et l'horodatage dans les x bits les plus à droite. Les bits au milieu peuvent être zéro. Donc, chaque fois que vous triez Rscore, il sera d'abord trié par score, et s'il y a une égalité, il sera trié par un timestamp unix présent dans les bons bits. Pour trouver le score et l'horodatage du score de RScore, il vous suffit d'analyser le bon ensemble de bits. Un exemple d'utilitaire qui le fait en python est here.