Redis è solo una cache?


255

Ho letto alcuni documenti Redis e ho provato il tutorial su http://try.redis-db.com/ . Finora, non riesco a vedere alcuna differenza tra Redis e le tecnologie di cache come Velocity o Enterprise Library Caching Framework

Stai effettivamente aggiungendo oggetti a un archivio dati in memoria usando una chiave univoca. Non sembra esserci alcuna semantica relazionale ...

Cosa mi sto perdendo?


3
Da redis.io : Redis è un archivio di valori-chiave avanzato open source. Viene spesso definito server della struttura dei dati poiché le chiavi possono contenere stringhe, hash, elenchi, set e set ordinati. Detto questo, ho votato per chiudere la tua domanda in quanto non si adatta al formato StackOverflow.
Linus Thiel,

29
Sono d'accordo che non è un formato SO. Dove pensi che sarebbe più appropriato?
Matt Evans,

Risposte:


631

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 zrevrangee 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 subscribeutenti a un determinato canale. Quando viene aggiunta una nuova domanda, si invia publishun 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


15
È anche un bus di servizio estremamente semplice che utilizza i comandi relativi a PUB / SUB.
Jim Dennis,

3
Come posso recuperare la domanda per utente? Devo creare un elenco per ogni utente con le tue domande, come domande: utente: 1 o dovrei usare i tag?
Diogo Alves,

2
spiegazione molto utile e dettagliata che ho visto su SO
Trong Vu

5

Non solo una cache.

  • Nella memoria dei valori-chiave di archiviazione
  • Supporta più tipi di dati (stringhe, hash, elenchi, set, set ordinati, bitmap e hyperloglog)
  • Offre la possibilità di archiviare i dati della cache nell'archivio fisico (se necessario).
  • Supporta il modello pub-sub
  • La cache Redis fornisce la replica per l'alta disponibilità (master / slave)

4

Redis ha abilità uniche come lua-script ultraveloci. Il suo tempo di esecuzione equivale all'esecuzione dei comandi C. Questo porta anche atomicità per la sofisticata manipolazione dei dati Redis necessaria per il lavoro di molti oggetti avanzati come lucchetti e semafori.

Esiste un Redis basato sulla griglia di dati di memoria chiamato Redisson che consente di creare facilmente applicazioni distribuite su Java . Grazie alla distribuiti Lock, Semaphore, ReadWriteLock, CountDownLatch, ConcurrentMapoggetti e molti altri.

Funziona perfettamente nel cloud e supporta AWS Elasticache , AWS Elasticache Cluster e il supporto Azure Redis Cache


1

In realtà non vi è alcuna dipendenza tra la rappresentazione relativa dei dati (o qualsiasi tipo di rappresentazione dei dati) e il ruolo del database (cache, persistenza permanente ecc.).

Redis è buono per la cache è vero, ma è molto più di una semplice cache. È un database completamente in memoria ad alta velocità. Conserva i dati sul disco. Non è relazionale, è un archivio di valori-chiave.

Lo usiamo in produzione. Redis ci aiuta a creare software in grado di gestire migliaia di richieste al secondo e conservare i dati aziendali dei clienti durante l'intero ciclo di vita naturale.


0

Redis è una cache che si adatta meglio all'architettura distribuita / architettura di microservizi.

È veloce, affidabile, fornisce atomicità e coerenza e ha una gamma di tipi di dati come set, hash, elenco ecc.

Lo sto usando dall'ultimo anno e arriva davvero come un salvatore quando devi fornire una soluzione pronta per la produzione molto velocemente e per qualsiasi problema relativo alle prestazioni come puoi sempre usarlo per memorizzare nella cache i dati.


0

Oltre ad essere un server cache, Redis è in particolare un server di strutture dati. Essere una cache sotto forma di un server di strutture dati significa molto, perché le strutture dati sono fondamenti di programmi o applicazioni . Considera che stai usando database SQL come tecnologia di archiviazione e devi costruire un elenco, una mappa hash, un set di classificazione o cose del genere, è una specie di dolore al collo. Redis può fornire queste funzionalità direttamente in un modo molto semplice, semplificando così notevolmente lo sviluppo.

D'altra parte, un server di struttura dati non deve essere nella forma di una cache. Esistono progetti compatibili con Redis ma hanno motori di archiviazione persistenti.


0

Redis supporta strutture dati come stringhe, hash, elenchi, set, set ordinati con query di intervallo, bitmap, hyperloglog, indici geospaziali con query e stream di raggio. Redis dispone di replica integrata, script Lua, sfratto LRU, transazioni e diversi livelli di persistenza su disco e offre elevata disponibilità tramite Redis Sentinel e partizionamento automatico con Redis Cluster.

implementaion con python

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.