Imparerai due tecniche per l’archiviazione e il recupero dei dati. Quando scegli il metodo da utilizzare nella tua applicazione, seleziona quello che semplifica la tua architettura in base ai tuoi modelli di accesso ai dati.

Per prima cosa, assicurati di poterti connettere a Redis.

Tempo necessario per completare il modulo: 60 minuti



Fase 4.1

(Fai clic per ingrandire l'immagine)

Fase 4.1
Fase 4.2

(Fai clic per ingrandire l'immagine)

Fase 4.2

Negli esempi, ogni volta che si cita un endpoint devi utilizzare il nome host del tuo endpoint nella configurazione.

Fase 4.3

(Fai clic per ingrandire l'immagine)

Fase 4.3

sintassi: shell

$ python

Se i comandi si bloccano, consulta la nota che segue l’esempio. 

sintassi: python

syntax: python
>>> import redis
>>> client = redis.Redis.from_url('redis://endpoint:6379')
>>> client.ping()

True

Nota: se si blocca, significa che sei stato bloccato dalle impostazioni del gruppo di sicurezza. Verifica che la tua istanza EC2 abbia accesso al gruppo di sicurezza assegnato alla tua istanza ElastiCache. Per esempio, supponiamo che la tua istanza EC2 sia stata assegnata al gruppo di sicurezza predefinito. Ora puoi modificare il gruppo di sicurezza della tua istanza Amazon ElastiCache e aggiungi una regola TCP personalizzata che consente connessioni sulla porta 6379 da qualsiasi istanza del gruppo di sicurezza predefinito:

In Origine, puoi iniziare a digitare il nome del gruppo di sicurezza e potrai cliccare sull'ID del gruppo di sicurezza. Se hai bisogno di saperne di più sui gruppi di sicurezza, puoi consultare la documentazione o il Riferimento alle regole del gruppo di sicurezza.

Fase 4.5

(Fai clic per ingrandire l'immagine)

Fase 4.5

Nel repository troverai del codice Python che puoi eseguire nella tua istanza EC2. Per prima cosa, devi configurare alcune variabili di ambiente:

sintassi: shell

$ export REDIS_URL=redis://your_redis_endpoint:6379/
$ export DB_HOST=your_mysql_endpoint
$ export DB_USER=admin
$ export DB_PASS=your_admin_password
$ export DB_NAME=tutorial

I valori per mysql_endpoint, redis_endpoint e per la password sono quelli che hai salvato nella fase precedente.


Il primo dei due metodi implementati nel campione di codice funziona tramite l’inserimento nella cache di una rappresentazione serializzata del risultato della query SQL. Il seguente snippet Pythin illustra la logica:

sintassi: python

def fetch(sql):

  result = cache.get(sql)
  if result:
    return deserialize(result)
  else:
    result = db.query(sql)
    cache.setex(sql, ttl, serialize(result))
    return result

Per prima cosa, l’istruzione SQL viene utilizzata come chiave in Redis e la cache viene esaminata per verificare se sia presente un valore. Se non è presente un valore, l’istruzione SQL viene utilizzata per eseguire una query del database. Il risultato della query del database è archiviato in Redis. La variabile ttl deve essere impostata su un valore ragionevole, basato sulla natura della tua applicazione. Quando la variabile ttl scade, Redis espelle la chiave e libera la memoria associata. Questo codice è disponibile nel repository dei tutorial e puoi eseguirlo così com’è, ma sentiti libero di aggiungere istruzioni di stampa qui e lì se desideri vedere il valore di una variabile in un certo momento temporale.

In termini di strategia, il lato negativo di questo approccio è che quando i dati vengono modificati nel database, le modifiche non vengono rispecchiate automaticamente nell’utente se è stato inserito nella cache un risultato precedente e la sua variabile ttl non è ancora scaduta.

Un esempio di come utilizzeresti la funzione di recupero:

sintassi: python

print(fetch("SELECT * FROM planet"))

Il risultato sarebbe:

sintassi: python

[{'id': 10, 'name': 'Mercury'},
 {'id': 11, 'name': 'Venus'},
 {'id': 12, 'name': 'Earth'},
 {'id': 13, 'name': 'Mars'},
 {'id': 14, 'name': 'Jupiter'},
 {'id': 15, 'name': 'Saturn'},
 {'id': 16, 'name': 'Uranus'},
 {'id': 17, 'name': 'Neptune'}]

Naturalmente questo è un esempio molto basilare, ma la tua applicazione può beneficiare enormemente dall’implementazione di questo modello di inserimento nella cache dove non vi è alcuna differenza tra un risultato che proviene dalla cache e un risultato che proviene direttamente dal database.


Il secondo esempio che implementerai collega un record di database a un hash Redis:

sintassi: python

def planet(id):

  key = "planet:" + str(id)
  result = cache.hgetall(key)

  if result:
      return result

  else:
      sql = "SELECT `id`, `name` FROM `planet` WHERE `id`=%s"
      result = db_record(sql, (id,))

      if result:
          cache.hmset(key, result)
          cache.expire(key, ttl)
      return result

Il keyspace in Redis è piatto, ma esiste una convenzione per simulare la struttura utilizzando stringhe separate da punto e virgola. Nell’esempio, la chiave per il record con ID 1 sarà con “pianeta:1”. Mentre lo snippet è sufficientemente valido per mostrare un pattern comune, è possibile una maggiore astrazione: un modulo potrebbe essere responsabile della generazione delle chiavi, un altro potrebbe occuparsi di creare la stringa SQL ecc. Inoltre, è molto probabile che esistano strumenti creati a tale scopo nel linguaggio di programmazione che utilizzi.
L'esempio recupera record dalla cache o dal database; anche in questo caso, potrebbe esistere una funzione incaricata della persistenza di un oggetto nel database.


Nei due esempi, hai utilizzato un Time To Live o ttl, dopo di che Redis espelle la chiave. Anche se ciò è generalmente sufficiente, potrebbe essere consigliabile rimuovere i dati obsoleti dalal cache non appena possibile. Se questo è il tuo caso d'uso, assicurati di verificare altre opzioni tra cui la strategia di caching write-through. I link per accedere a ulteriori informazioni sono riportati alla fine del tutorial. Se sei curioso, vale la pena notare che mentre gli esempi utilizzano il comando EXPIRE, Redis fornisce anche il comando EXPIREAT, che ti consente di specificate una data e ora precise di quando è necessario espellere una chiave. Esso utilizza come parametro un time stamp Unix univoco (ad es. secondi trascorsi dal 1° gennaio 1970).


Quando la quantità di dati supera l'impostazione maxmemory configurata, Redis ha diverse modalità di risposta a seconda della policy di espulsione selezionata. Per impostazione predefinita, ElastiCache for Redis è configurato per rimuovere dalla memoria le chiavi utilizzate meno di recente con un insieme ttl. Il parametro della policy di espulsione è denominato maxmemory-policy e il valore predefinito in ElastiCache è volatile-lru. Un'altra interessante opzione per questo caso d'uso è la policy volatile-ttl, che indica a Redis di riacquisire memoria rimuovendo queste chiavi con il ttl più breve.


Una volta implementata questa strategia, assicurati di testare la tua applicazione per trovare il miglior valore per il ttl e la migliore strategia di espulsione. Verifica la prestazione della tua applicazione con una cache vuota e con una cache piena.