No, Redis è molto più di una cache.
Come una cache, Redis memorizza coppie chiave = valore. Ma a differenza di una cache, Redis ti consente di operare sui valori. Esistono 5 tipi di dati in Redis: stringhe, set, hash, elenchi e set ordinati. Ogni tipo di dati espone varie operazioni.
Il modo migliore per capire Redis è modellare un'applicazione senza pensare a come la memorizzerai in un database.
Diciamo che vogliamo costruire StackOverflow.com. Per semplificare, abbiamo bisogno di domande, risposte, tag e utenti.
Domande, utenti e risposte sulla modellazione
Ogni oggetto può essere modellato come una mappa. Ad esempio, una domanda è una mappa con campi {id, titolo, data_misita, voti, ask_by, stato}. Allo stesso modo, una risposta è una mappa con campi {id, question_id, answer_text, reply_by, voti, stato}. Allo stesso modo, possiamo modellare un oggetto utente.
Ognuno di questi oggetti può essere archiviato direttamente in Redis come hash. Per generare ID univoci, è possibile utilizzare il comando di incremento atomico. Qualcosa come questo -
$ 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 archiviare le domande più recenti da visualizzare nella home page. Se stavi scrivendo un programma .NET o Java, le domande verranno archiviate in un elenco. Si scopre che è 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 homepage, 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 il pipelining e mostrali all'utente.
Domande per tag, ordinate per voto
Successivamente, vogliamo recuperare le domande per ciascun 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, usiamo la funzione Set Ordinato di Redis. Un set ordinato consente di associare un punteggio a ciascun elemento. È quindi possibile recuperare 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 taggate Redis, ordinate in base ai voti", facciamo semplicemente una zrevrange
e ricambiamo le domande principali.
Domande in tempo reale senza pagina di aggiornamento
E infine, una funzione bonus. Se mantieni aperta la pagina delle domande, SO ti avviserà quando viene aggiunta una nuova domanda. Come può aiutare Redis qui?
Redis ha un modello pub-sub. Puoi creare canali, ad esempio "channel_questions_tagged_redis". Quindi gli subscribe
utenti a un determinato canale. Quando viene aggiunta una nuova domanda, si invia publish
un messaggio a quel canale. Tutti gli utenti riceveranno quindi il messaggio. Dovrai utilizzare una tecnologia web come i socket web o la cometa per consegnare effettivamente il messaggio al browser, ma Redis ti aiuta con tutto l'impianto idraulico sul lato server.
Persistenza, affidabilità ecc.
A differenza di una cache, Redis persiste i dati sul disco rigido. È possibile disporre di 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