sql >> Database >  >> NoSQL >> Redis

Is dit een goede use-case voor Redis op een ServiceStack REST API?

Waar moet u aan denken bij het ontwerpen van een NoSQL Redis-toepassing

1) Om je correct te ontwikkelen in Redis, zou je meer moeten nadenken over hoe je de relaties in je C#-programma zou structureren, d.w.z. met de C#-verzamelingsklassen in plaats van een relationeel model bedoeld voor een RDBMS. Het zou beter zijn om meer na te denken over gegevensopslag zoals een documentdatabase in plaats van RDBMS-tabellen. In wezen wordt alles in Redis geblobbed via een sleutel (index), dus je hoeft alleen maar uit te zoeken wat je primaire entiteiten zijn (d.w.z. geaggregeerde wortels) die in zijn eigen 'sleutelnaamruimte' zouden worden bewaard of dat het een niet-primaire entiteit is, dat wil zeggen eenvoudigweg metagegevens die gewoon bij de bovenliggende entiteit zouden moeten worden bewaard.

Voorbeelden van Redis als primaire gegevensopslag

Hier is een goed artikel waarin wordt uitgelegd hoe u een eenvoudige blogtoepassing kunt maken met Redis:

http://www.servicestack.net/docs/redis-client/designing-nosql-database

Je kunt ook de broncode van RedisStackOverflow bekijken voor een ander voorbeeld uit de echte wereld met Redis.

In principe zou je de items van elk type apart moeten opslaan en ophalen.

var redisUsers = redis.As<User>();
var user = redisUsers.GetById(1);
var userIsWatching = redisUsers.GetRelatedEntities<Watching>(user.Id);

De manier waarop u de relatie tussen entiteiten opslaat, is door gebruik te maken van Redis's Sets, bijvoorbeeld:u kunt de Users/Watchers-relatie conceptueel opslaan met:

SET["ids:User>Watcher:{UserId}"] = [{watcherId1},{watcherId2},...]

Redis is schemaloos en idempotent

Het opslaan van id's in redis-sets is idempotent, d.w.z. u kunt watcherId1 toevoegen meerdere keren naar dezelfde set en het zal er maar één keer van voorkomen. Dit is leuk omdat het betekent dat je nooit het bestaan ​​van de relatie hoeft te controleren en vrijelijk gerelateerde id's kunt blijven toevoegen alsof ze nooit hebben bestaan.

Gerelateerd:schrijven of lezen naar een Redis-verzameling (bijv. Lijst) die niet bestaat, is hetzelfde als schrijven naar een lege verzameling, d.w.z. er wordt on-the-fly een lijst gemaakt wanneer u een item aan een lijst toevoegt terwijl u een niet- bestaande lijst zal gewoon 0 resultaten opleveren. Dit is een wrijvingsloze en productiviteitswinst, omdat u uw schema's niet vooraf hoeft te definiëren om ze te gebruiken. Mocht u dat toch nodig hebben, dan biedt Redis de EXISTS-bewerking om te bepalen of een sleutel bestaat of een TYPE-bewerking, zodat u het type kunt bepalen.

Maak uw relaties/indexen op uw schrijfwerk

Een ding om te onthouden is dat, omdat er geen impliciete indexen in Redis zijn, u over het algemeen uw indexen/relaties moet instellen die nodig zijn om uzelf te kunnen lezen tijdens het schrijven. In principe moet u van tevoren nadenken over al uw vraagvereisten en ervoor zorgen dat u tijdens het schrijven de nodige relaties opzet. De bovenstaande RedisStackOverflow-broncode is een goed voorbeeld dat dit laat zien.

Opmerking:de ServiceStack.Redis C#-provider gaat ervan uit dat u een uniek veld heeft met de naam Id dat is de primaire sleutel. U kunt het configureren om een ​​ander veld te gebruiken met de ModelConfig.Id() configuratietoewijzing.

Redis-persistentie

2) Redis ondersteunt 2 soorten persistentiemodi, out-of-the-box RDB en Append Only File (AOF). RDB schrijft routine-snapshots terwijl het Append Only File fungeert als een transactiejournaal waarin alle wijzigingen tussen snapshots worden vastgelegd - ik raad aan om beide toe te voegen totdat u vertrouwd bent met wat elk doet en wat uw toepassing nodig heeft. Je kunt alle Redis-persistentie lezen op http://redis.io/topics/persistence.

Opmerking Redis ondersteunt ook triviale replicatie waar u meer over kunt lezen op:http://redis.io/topics/replication

Redis houdt van RAM

3) Aangezien Redis voornamelijk in het geheugen werkt, is de belangrijkste bron dat je genoeg RAM hebt om je hele dataset in het geheugen te bewaren + een buffer voor wanneer het snapshots naar schijf maakt. Redis is zeer efficiënt, dus zelfs een kleine AWS-instantie kan veel belasting aan - waar u naar op zoek bent, is voldoende RAM.

Uw gegevens visualiseren met de Redis Admin UI

Tot slot, als u de ServiceStack C# Redis Client gebruikt, raad ik aan om de Redis Admin UI te installeren die een mooi visueel beeld geeft van uw entiteiten. Je kunt er een live demo van zien op:http://servicestack.net/RedisAdminUI/AjaxClient/




  1. Automatisch verwijzende objecten verwijderen bij verwijdering in MongoDB

  2. NodeJS en MongoDB FindAndModify() moeten worden verwijderd of bijgewerkt

  3. Push to Laravel wachtrij van buiten Laravel (NodeJS)

  4. Is het de moeite waard om MongoDB-eigenschapsnamen in te korten?