Redis®*: Reitinguokite vartotojus realiu laiku
Sužinokite, kaip reitinguoti 2 milijonus vartotojų pagal balus realiu laiku naudojant Redis
👋 Sveiki atvykę į Stackhero dokumentaciją!
Stackhero siūlo paruoštą naudoti Redis cloud sprendimą, kuris suteikia daugybę privalumų, įskaitant:
- Įtraukta
Redis Commanderweb UI.- Neribotas žinučių dydis ir perdavimai.
- Paprasti atnaujinimai vienu spustelėjimu.
- Optimali veikla ir stiprus saugumas, užtikrinamas privačiu ir dedikuotu VM.
Taupykite laiką ir supaprastinkite savo gyvenimą: tereikia 5 minučių, kad išbandytumėte Stackhero Redis cloud hosting sprendimą!
Vienas iš mūsų klientų kreipėsi su įdomiu iššūkiu. Jis valdo sporto svetainę, kurioje vartotojai uždirba taškus laimėdami statymus arba atlikdami įvairius veiksmus.
Jo tikslas buvo parodyti kiekvieno vartotojo reitingą, parodyti vartotojus iš karto virš ir žemiau jų, ir sukurti 100 geriausiųjų sąrašą. Su 2 milijonų vartotojų bendruomene, duomenys turėjo būti apdorojami realiu laiku!
Stackhero mes mėgstame spręsti tokius iššūkius. Šiame straipsnyje mes žingsnis po žingsnio paaiškinsime mūsų sprendimą.
Kodėl pasirinkome Redis
Tradicinės duomenų bazės, tokios kaip MySQL, PostgreSQL ar Elasticsearch, nėra skirtos mažo delsos reitingavimo užduotims. Tai paskatino mus ieškoti kitos galimybės.
Mes pasirinkome Redis, itin greitą ir patikimą atminties duomenų bazę. Pagal DB-Engines, tai yra 7-oji dažniausiai naudojama duomenų bazė pasaulyje ir lyderė „Key-value store“ kategorijoje.
Redis siūlo kelis duomenų modelius. Šiam scenarijui išsiskiria vienas: „sorted sets“.
Techniniai patvirtinimai
Sorted sets sujungia raktą ir balą. Mūsų atveju, raktas yra vartotojo ID, o balas atspindi vartotojo taškus.
Pradėjome paleisdami Redis paslaugą Stackhero. Paslauga veikia vos per 2 minutes su naujausia stabilia versija, siūlo valandinį atsiskaitymą ir turi Redis Commander, patogią interneto sąsają. Mes patvirtinome koncepciją naudodami šią sąsają.
Pridėjome tris vartotojus su pavyzdiniais ID ir balais, kaip parodyta žemiau:
| Vartotojo vardas | Balas | | - | - | | userId1 | 11 | | userId2 | 54 | | userId3 | 24 |
Šie vartotojai buvo pridėti prie sorted set, vadinamo usersScores, naudojant šias Redis komandas:
ZADD usersScores 11 "userId1"
ZADD usersScores 54 "userId2"
ZADD usersScores 24 "userId3"
Redis Commander, interneto sąsaja, teikiama Stackhero su Redis instancijomis
Tada mes gavome userId1 balą:
ZSCORE usersScores "userId1"
> 11
Tai patvirtino, kad userId1 balas iš tiesų buvo 11. Po to mes patikrinome userId1 reitingą:
ZREVRANK usersScores "userId1"
> 2
Prisiminkite, reitingavimas prasideda nuo 0. Tai reiškia, kad reitingai yra tokie:
| Vartotojo vardas | Balas | Reitingas | | - | - | - | | userId1 | 11 | 2 | | userId2 | 54 | 0 | | userId3 | 24 | 1 |
Komanda ZREVRANK grąžino 2, kas yra būtent tai, ko tikėjomės userId1.
Taip pat galite gauti geriausius įrašus. Pavyzdžiui, norėdami gauti pirmuosius 2 vartotojus (nuo 0 iki 1 reitingo) vykdykite:
ZREVRANGE usersScores 0 1 WITHSCORES
> 1) userId2
> 2) 54
> 3) userId3
> 4) 24
Norėdami gauti 100 geriausių vartotojų, tiesiog vykdykite:
ZREVRANGE usersScores 0 99 WITHSCORES
Šis metodas yra efektyvus ir puikiai tinka aukštos kokybės realaus laiko reitingavimui.
Kitos naudingos komandos
Žemiau pateikiamos kelios papildomos Redis komandos, naudojamos mūsų kliento svetainėje:
- Gauti vartotojus, reitinguotus tarp 50 ir 100 pozicijų:
ZREVRANGE usersScores 50 100 WITHSCORES - Pridėti vartotoją:
ZADD usersScores 40 "userId4" - Atnaujinti vartotojo balą (tai pakeičia esamą
userId4įrašą):ZADD usersScores 42 "userId4" - Pašalinti vartotoją:
ZREM usersScores "userId4"
Redis kodo pavyzdys naudojant Node.js
Patvirtinus koncepciją Redis Commander, laikas integruoti Redis į realų kodą. Mūsų klientas naudoja Node.js ir žemiau pateikiamas pavyzdys naudojant ioredis kaip klientą:
const Redis = require('ioredis');
(async () => {
// Nustatyti Redis kredencialus
// Jei naudojate Stackhero, juos rasite Stackhero prietaisų skydelyje
const redis = new Redis({
host: '<redisServerHost>',
password: '<redisServerPassword>',
port: <PORT_TLS>, // <PORT_CLEAR> yra nesaugios jungtys, o <PORT_TLS> yra TLS. TLS turėtų būti naudojamas.
tls: {}, // Pateikite tuščią objektą, kad suaktyvintumėte TLS
lazyConnect: true
});
// Prisijungti prie Redis
await redis.connect();
// Pridėti vartotojus
await redis.zadd('usersScores', 11, 'userId1');
await redis.zadd('usersScores', 54, 'userId2');
await redis.zadd('usersScores', 24, 'userId3');
// Gauti userId1 balą
const score = await redis.zscore('usersScores', 'userId1');
console.log('userId1 turi ' + score + ' taškų');
// Gauti userId1 reitingo poziciją
const rankPosition = await redis.zrevrank('usersScores', 'userId1');
console.log('userId1 yra reitinguotas pozicijoje ' + rankPosition);
// Atsijungti nuo Redis
await redis.disconnect();
})();
Šis paprastas, bet galingas kodo fragmentas yra idealus realaus laiko reitingavimo duomenų valdymui.
Išvada
Šio iššūkio sprendimas buvo tiek įdomus, tiek sudėtingas. Mūsų atveju, Redis pasirodė esąs idealus sprendimas, nes jis yra lengvai naudojamas, galingas ir itin greitas.
Jei norėtumėte išbandyti Redis, galite pradėti instanciją Stackhero vos per 2 minutes. Mėgaukitės naujausia stabilia versija, interneto sąsaja, atsarginėmis kopijomis ir įspūdingu našumu tiesiog po ranka.
Stackhero prietaisų skydelis, rodantis Node.js ir Redis paslaugas veikiančias