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