sql >> Database >  >> NoSQL >> Redis

Beste manier om redis-sleutels op te slaan

Het hangt allemaal af van hoe je het gaat gebruiken. Als elke byte telt, bijvoorbeeld wanneer je moet betalen voor elke kB die naar een clouddienst wordt overgebracht, kun je de kosten berekenen. De wiskunde is eenvoudig; een byte is een byte 'op de draad'. Binnen redis, voor grotere waarden is het even eenvoudig. Voor kleinere waarden voert Redis wat geheugenoptimalisatie uit.

In uw HSET je splitst bijvoorbeeld de leden, wat alleen zinvol is als je ze meestal gescheiden van elkaar nodig hebt. Een betere aanpak -misschien- be:HSET user:data 987654321 '{"loc": "123456", "time": "2014-01-01T13:00:00"}' . Afzonderlijke toetsen/leden 'kosten' veel meer dan langere snaren, qua prestaties. U kunt zelfs een hele tabel of dataset in één lid plaatsen als deze alleen als één volledige semi-statische entiteit wordt gebruikt.

Snelheid en grootte:er is een opmerkelijk verschil tussen toetsen en waarden .

Sleutels: Korter is over het algemeen meer geheugen- en snelheidsefficiënt. Als je een redis Sorted Set gebruikt, kun je zelfs 'getallen' als sleutels gebruiken (gesorteerde set 'leden' plus 'partituren'). Ik zeg 'getallen' omdat een score technisch gezien een float64 is, maar om als ID te worden gebruikt, moet deze tussen -999999999999999 en 999999999999999 inclusief (dat zijn 15 cijfers) zijn, zonder een fractioneel deel. Dit kan erg handig zijn, aangezien Redis snel en schaalbaar O(log(n)) on-the-fly sortering van gesorteerde sets uitvoert (met behulp van skiplists, vereenvoudigd).

Waarden: Het MsgPack-formaat (ongecomprimeerd) neemt de minste ruimte in beslag, vooral als u de definities één keer opslaat en de waarden veel. JSON is wat minder geheugen-efficiënt, maar is natuurlijk zo'n gangbaar IPC-formaat dat het niet mag ontbreken. Ruwe strings, karakter gescheiden, vaste lengte (ugh), wat je ook wenst, het is mogelijk om te gebruiken. U kunt uw gegevens altijd comprimeren voordat u ze in Redis opslaat. Tot nu toe geheugenefficiëntie . Als het gaat om snelheid , het is minder eenvoudig. Als u Lua server-side scripting wilt gebruiken (wat u zou moeten doen), kunt u niets doen met gecomprimeerde gegevens. JSON en MsgPack kunnen worden gedeserialiseerd, maar alleen 'als geheel'. Wat in de meeste scenario's prima is. Het meest flexibel is het opslaan van afzonderlijke waarden (bijvoorbeeld als lid van een HSET), maar dit heeft ook een prijs (meestal:een te hoge prijs). Je kunt dit ook allemaal combineren. Wat we het meest gebruiken:een voorvoegsel van twee of drie door scheidingstekens gescheiden waarden, gevolgd door een MsgPack-payload.

Mijn algemene advies is:begin met het gebruik van alleen HSET's en ZSET's, splits geen gegevens op die bij elkaar horen, gebruik beschrijvende PascalCased-namen voor uw sleutels tussen 10-25 tekens, gebruik ':' als u scheidingstekens in uw sleutels nodig heeft (naamruimten) , serialiseer als JSON (voor de eenvoud, maar code voor eenvoudig overschakelen naar MsgPack), gebruik Lua-scripting (zelfs als je Lua niet kent, is de subset die je in Redis gebruikt klein).

Ik zou me er in de opstartfase van je project niet al te veel zorgen over maken, je kunt het later altijd nog wijzigen en wat A/B-vergelijkingen doen zodra je wat interpoleerbare gegevens hebt.

Ik hoop dat dit helpt, TW



  1. mongodb/mongoose findMany - vind alle documenten met ID's in array

  2. Zoek op id met mgo

  3. Redis:retourneert alle waarden die zijn opgeslagen in een database

  4. Hoe spoel ik redis db van python redis?