Redis
 sql >> Database >  >> NoSQL >> Redis

Redis è solo una cache?

No, Redis è molto più di una cache.

Come una cache, Redis memorizza le coppie chiave=valore. Ma a differenza di una cache, Redis ti consente di operare sui valori. Esistono 5 tipi di dati in Redis:stringhe, insiemi, hash, elenchi e insiemi ordinati. Ogni tipo di dati espone varie operazioni.

Il modo migliore per comprendere Redis è modellare un'applicazione senza pensare a come archiviarla in un database.

Diciamo che vogliamo costruire StackOverflow.com. Per semplificare, abbiamo bisogno di Domande, Risposte, Tag e Utenti.

Modello di domande, utenti e risposte

Ogni oggetto può essere modellato come una mappa. Ad esempio, una domanda è una mappa con i campi {id, titolo, date_asked, voti, ask_by, stato}. Allo stesso modo, una risposta è una mappa con i campi {id, question_id, answer_text, answer_by, voti, stato}. Allo stesso modo, possiamo modellare un oggetto utente.

Ciascuno di questi oggetti può essere archiviato direttamente in Redis come hash. Per generare ID univoci, puoi utilizzare il comando di incremento atomico. Qualcosa del genere -

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

Gestione dei voti

Ora, ogni volta che qualcuno vota una domanda o una risposta, devi solo farlo

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

Elenco di domande per la home page

Successivamente, vogliamo memorizzare le domande più recenti da visualizzare nella home page. Se stavi scrivendo un programma .NET o Java, memorizzeresti le domande in un elenco. Si scopre che questo è il modo migliore per archiviarlo anche in Redis.

Ogni volta che qualcuno fa una domanda, aggiungiamo il suo ID all'elenco.

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

Ora, quando vuoi rendere la tua home page, chiedi a Redis le 25 domande più recenti.

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

Ora che hai gli ID, recupera gli elementi da Redis usando la pipeline e mostrali all'utente.

Domande per tag, ordinate per voti

Successivamente, vogliamo recuperare le domande per ogni tag. Ma SO ti consente di vedere le domande più votate, le nuove domande o le domande senza risposta sotto ogni tag.

Per modellare questo, utilizziamo la funzione Set ordinato di Redis. Un set ordinato consente di associare un punteggio a ciascun elemento. È quindi possibile recuperare gli elementi in base ai loro punteggi.

Andiamo avanti e facciamo questo per il tag Redis

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

Cosa abbiamo fatto qui? Abbiamo aggiunto domande a un set ordinato e associato un punteggio (numero di voti) a ciascuna domanda. Ogni volta che una domanda viene votata, aumenteremo il suo punteggio. E quando un utente fa clic su "Domande con tag Redis, ordinate per voti", eseguiamo semplicemente un zrevrange e torna alle domande principali.

Domande in tempo reale senza aggiornare la pagina

E infine, una caratteristica bonus. Se tieni aperta la pagina delle domande, SO ti avviserà quando viene aggiunta una nuova domanda. In che modo Redis può aiutare qui?

Redis ha un modello pub-sub. Puoi creare canali, ad esempio "channel_questions_tagged_redis". Quindi subscribe utenti a un determinato canale. Quando viene aggiunta una nuova domanda, publish un messaggio a quel canale. Tutti gli utenti riceverebbero quindi il messaggio. Dovrai utilizzare una tecnologia web come prese web o cometa per inviare effettivamente il messaggio al browser, ma Redis ti aiuta con tutte le tubature lato server.

Persistenza, Affidabilità ecc.

A differenza di una cache, Redis mantiene i dati sul disco rigido. È possibile avere una configurazione master-slave per fornire una migliore affidabilità. Per saperne di più, consulta gli argomenti di Persistenza e Replica qui:http://redis.io/documentation