Memorizzare le chiavi primarie degli oggetti in Redis e quindi interrogarli in Postgres tramite Django

1

Questa è probabilmente la mia seconda volta postata nei programmatori. Di solito sono su stackoverflow ma questa domanda è più adatta per la community qui.

Tutti i suggerimenti, i consigli e le opinioni su questo argomento sono estremamente apprezzati. Ti chiedo anche la tua brutale onestà. Se pensi che quello che sto facendo in termini di design è davvero stupido, RACCONTA! perché sono un software engineer back-end autodidatta e posso usare tutti i consigli che posso ottenere.

Uso Django, Redis e amp; PostgreSQL. Diciamo per esempio che ho un utente, post e amp; Modello di posizione.

#models.py
from django.db import models
from django.contrib.auth.models import User

class Post(models.Model):
        user = models.ForeignKey(User)
        media_url = models.CharField(max_length=255, blank=True)
        related_location = models.ForeignKey('Location')

class Location(models.Model):
        name = models.CharField(max_length=200, blank=True)
        address = models.CharField(max_length=255, blank=True)
        city = models.CharField(max_length=140, blank=True)

Grande, ora che è fuori strada, diciamo che gli utenti volevano vedere tutti i post taggati in una certa posizione. Questa posizione ha un ID di 1812. Il modo normale per farlo è quello di creare una query semplice e restituire post in cui related_location ha un ID di 1812. Devo impaginare i risultati in modo che l'utente veda 10 oggetti alla volta. Se vogliono vedere di più, devono fare un'altra richiesta.

In passato facevo cose così, fino a poco tempo fa avevo la paura che i database diventassero potenzialmente grandi e le query diventassero molto lente. Così ho deciso di creare indici su Redis per ogni oggetto Location. Ad esempio, supponiamo che i post 7, 33, 18, 12, 89, 56500, 34000, 30 vengano tutti taggati nella posizione 1812. Creerei un elenco Redis chiamato "posizione: 1812" e in tale elenco, conterrebbe gli ID di tutti i post in cui siamo taggati lì, in questo caso redislist = [7, 33, 18, 12, 89, 56500, 34000, 30].

Vorrei quindi prendere questo elenco e interrogarlo in proposito:

queryset = Post.objects.filter(pk__in = redislist).order_by('-pk')

È una cosa intelligente da fare? Immediatamente ho iniziato a pensare ai pro e ai contro dell'approccio. Per uno, le query al DB sarebbero più veloci poiché so già quali oggetti devo catturare. Tuttavia, in termini di design, ne vale la pena? Per qualcosa come oggetti di posizione unici, quella tabella in postgres da sola può crescere infinitamente grande (può avere più di un miliardo di righe). Memorizzare un elenco per ciascun oggetto posizione in Redis può essere costoso (memoria esaurita).

Quindi tutto si riduce a questo. Il DB è abbastanza buono, o dovrei continuare a fare quello che sto facendo?

    
posta noahandthewhale 29.05.2014 - 05:23
fonte

1 risposta

1

Ci sono molte cose per cui Redis è la scelta migliore disponibile. Sostituire la funzionalità RDBMS di base non è uno di questi.

Non solo PostgreSQL è molto più veloce della tua app Python per fare ciò, ha un lotto di debug dietro alle sue spalle. Gestisce anche la coerenza indipendentemente dal codice client utilizzato per accedere / aggiornare i dati.

Tieni Redis per ciò che sa fare meglio, come un sistema di cache, o per mantenere un'analisi dei dati che è troppo lenta o richiederebbe la denormalizzazione se fatta direttamente sul datastore.

Un tipico esempio è mantenere un tabellone. La normalizzazione dei dati rende complesso il calcolo e potrebbe essere eccessivamente lento. Denormalizzare su tabelle DB può renderlo leggermente migliore, ma farlo in Redis è un enorme miglioramento negli algoritmi che puoi applicare.

In breve, mantieni il database pulito e normalizzato come pratico, e fai cose extra in Redis, non perché sia "migliore" del DB (non lo è), ma perché è diverso , quindi si applica meglio all'attività in corso.

Potrai anche risparmiare un sacco di grattacapi se dichiarerai uno storage come archivio dati "autorevole" e tutto il resto potrebbe essere ricostruito da lì in una singola operazione.

    
risposta data 29.05.2014 - 16:40
fonte

Leggi altre domande sui tag