Redis zrevrangebyscore, sortowanie inne niż porządek leksykograficzny

Zaimplementowałem tabelę liderów przy użyciu posortowanych zestawów w redis. Chcę, aby użytkownicy z tymi samymi wynikami byli zamawiani w porządku chronologicznym, tj. Użytkownik, który był pierwszy, powinien zostać oceniony wyżej. Obecnie redis obsługuje porządek leksykograficzny. Czy istnieje sposób, aby to zmienić. Numery telefonów są używane jako członkowie w posortowanym zestawie.

Jedynym rozwiązaniem, o którym myślałem, jest dołączenie znacznika czasu przed numerami komórkowymi i zachowanie skrótu do mapowania numeru telefonu komórkowego i znacznika czasu.

$redis.hset('mobile_time', '1234567890', "#{Time.now.strftime('%y%m%d%H%M%S')}")
pref = $redis.hget('mobile_time, '1234567890'')
$redis.zadd('myleaderboard', "1234567890:#{pref}")

W ten sposób mogę uzyskać rangę dla danego użytkownika w dowolnym przypadku, dodając prefiks z hasha.

Teraz to nie jest dokładnie to, czego chcę. Spowoduje to odwrotność tego, co chcę. Użytkownik, który przyjdzie wcześniej, zostanie umieszczony poniżej użytkownika, który pojawi się później (oba z tym samym wynikiem).

Key for user1 = 201210121953**23**01234567890    score: 400
key for user2 = 201210121253**26**09313123523    score: 400 (3 seconds later)

jeśli użyję zrevrangebyscore, użytkownik2 zostanie umieszczony wyżej niż użytkownik1.

Istnieje jednak sposób na uzyskanie pożądanej rangi:

users_with_higher_score_count = $redis.zcount("mysset", "(400", "+inf")
users_with_same_score = $redis.zrangebyscore("mysset", "400", "400")

Teraz mam listęusers_with_same_score z prawidłowym zamówieniem. Patrząc na indeks mogę obliczyć rangę użytkownika.

Aby uzyskać tablicę liderów. Mogę zdobyć członków w odstępach 50 i zamówić je za pomocą kodu ruby. Ale to nie wydaje się być dobrym sposobem.

Chcę wiedzieć, czy jest na to lepsze podejście. Lub jakiekolwiek ulepszenia, które można wprowadzić w rozwiązaniu, które zamierzałem.

Z góry dziękuje za twoją pomoc.

P.S.Wyniki są wielokrotnościami 50

questionAnswers(3)

yourAnswerToTheQuestion