Redis strategia per la dipendenza dalla cache

2

Sto implementando la struttura della cache usando Redis, il mio dominio è così:

  • Esistono più categorie (oltre 3000 categorie). Ogni categoria contiene più domande (circa 20-30 domande per categoria). Ogni domanda ha diverse proprietà come se è stata pubblicata, qual è il tipo, ecc.
  • Durante il caricamento delle domande, ho bisogno di caricare domande da diverse categorie e con alcuni filer di domande specificate dall'utente che corrispondono alle proprietà delle domande: è pubblicato, digita, ecc.
  • Lo implemento in Redis usando string e set:
    • Ogni domanda viene memorizzata come stringa in Redis (JSON serializzato) con la chiave: "domanda: [QuestionId]"
    • Ogni categoria ha un elenco di ID di domande ad esso appartenenti (insieme Redis) con la chiave: "categoria: [ID categoria]: domande"
    • Per ogni categoria, ogni proprietà filtrabile per utente ha il proprio set di ID domanda (Redis set) ad es. le domande pubblicate nella categoria 1 hanno la chiave: "categoria: 1: domande: pubblicate
    • Quando carichi le domande, ho solo bisogno di basarmi sui filtri forniti dall'utente, fare l'intersezione del set in Redis per trovare gli id delle domande rilevanti e caricare quelle domande
    • Quindi ogni categoria avrà diversi elementi della cache associati:
      1. Categoria: [CategoryId]: domande
      2. Categoria: [CategoryId]: domande: isPublished
      3. Categoria: [CategoryId]: domande: notpublished
      4. Categoria: [CategoryId]: domande: Tipo: 1
      5. Categoria: [CategoryId]: domande: Tipo: 2 etc

Funziona bene. Ma la sfida è mantenere la coerenza degli elementi della cache quando c'è sfratto. Diciamo che se la cache di Redis decide di sfrattare " categoria: [CategoryId]: domande: notpublished " elemento della cache, come faccio a essere sicuro che anche tutti gli altri elementi della cache relativi all'id della categoria vengano invalidati? Posso controllare tutti gli elementi della cache dei filtri per assicurarmi che esistano nella cache prima di caricare le domande, ma ciò richiederà molte richieste a Redis. O qualsiasi altra strategia / modo per risolvere il mio problema? Sono nuovo di Redis e questa è la prima volta che implemento questo tipo di struttura della cache in Redis

Al momento quello che faccio è controllare la chiave " category: [CategoryId]: questions ". Se non esiste, caricare i dati dal database e impostare tutti gli elementi della cache per quella categoria. Ma non può rilevare se mancano altri tasti

    
posta Phuong Nguyen 17.11.2014 - 03:09
fonte

1 risposta

3

Puoi attaccare questo problema da un paio di angoli:

  1. Puoi scegliere una politica di sfratto che non eliminerà quelle chiavi, ad esempio politica di sgombero volatile-lru e imposta quelle chiavi senza scadenza. ( altro sulle politiche di sfratto )
    Il problema qui è che potresti ottenere OOM se non ci sono chiavi che possono sfrattare.
  2. Il secondo approccio consiste nell'impostare un listener di sfratto, è possibile utilizzare notify-keyspace-events per fare in modo che redis pubblichi le notifiche keypace e keyevent. ( altro sulle notifiche chiave )
    Il seguente comando renderà redis pubblica gli sfratti sul canale di notifica keyspace redis-cli config set notify-keyspace-events Ke
    E il seguente comando stabilirà una connessione sottoscritta a tutte le notifiche redis: redis-cli --csv psubscribe '__key*__:*'
    Questo è chiaramente solo un esempio di come è stato fatto con redis-cli , dovresti implementarlo come un thread separato nella tua applicazione che cancella tutti i dati relativi alla chiave sfrattati dal tuo set di dati.
risposta data 17.11.2014 - 08:31
fonte

Leggi altre domande sui tag