2015-08-18 7 views
6

TL; DR: quale delle tre opzioni seguenti è la più efficace per la paginazione con Redis?Pro/contro delle strategie di impaginazione di Redis

Sto implementando un sito Web con più post generati dall'utente, che vengono salvati in un DB relazionale e quindi copiati in Redis in formato Hashes con chiavi come site:{site_id}:post:{post_id}.

Voglio eseguire semplici query di impaginazione su Redis, al fine di implementare l'impaginazione a carico lento (cioè l'utente scorre verso il basso, inviamo una richiesta Ajax al server che richiede il prossimo gruppo di post) in stile Pinterest interfaccia.

Quindi ho creato un Set per tenere traccia degli ID dei post pubblicati, con chiavi come site:{site_id}:posts. Ho scelto Set perché non voglio avere ID duplicati nella raccolta e posso farlo velocemente con un semplice SADD (non c'è bisogno di verificare se esiste l'id) su ogni aggiornamento del DB.

Beh, come insiemi non sono ordinati, sto wheighting i pro ei contro delle opzioni che ho da impaginare:

1) Utilizzando SSCAN comando per impaginare i miei set già attuate

in questo caso, ho potuto persistere il cursore di scansione restituito nella sessione dell'utente , poi rinviarlo al server su richiesta successiva (non sembra affidabile con più utenti l'accesso e l'aggiornamento del database: in po 'di tempo il cursore sarebbe non valido e restituisce risultati strani - a meno che non ci sia qualche avvertenza che mi manca).

2) refactoring miei set di utilizzare Lists o Sorted Sets invece

Poi ho potuto impaginare utilizzando LRANGE o ZRANGE. L'elenco sembra essere l'opzione più performante e naturale per il mio caso d'uso. È perfetto per l'impaginazione e l'ordinamento per data, ma non posso semplicemente controllare per un singolo elemento di esistenza senza eseguire il ciclo di tutte le liste. I set ordinati sembrano unire i vantaggi di entrambi gli insiemi e gli elenchi, ma consumano più risorse del server .

3) Mantenere utilizzando set regolari e memorizzare il numero di pagina, come parte della chiave

Sarebbe qualcosa di simile site:{site_id}:{page_number}:posts. Lo era il recommended way prima che i comandi di scansione fossero implementati.

Quindi, la domanda è: quale è l'approccio più efficiente/più semplice? C'è qualche altra opzione raccomandata non elencata qui?

+2

"best" è totalmente soggettivo. Ciò che è meglio per me non è necessariamente un bene per te. –

+2

+1 re "migliore". Utilizzare una lista non è una buona scelta perché LRANGE è O (N). Vai con set ordinati - il più semplice e pulito. –

+0

@SergioTulentsev Sì, forse "migliore" non è la ... migliore parola. Penserò a qualcosa di meno soggettivo e modificherò la domanda. Grazie –

risposta

4

"Best" è meglio servito soggettivo :)

vi consiglio di andare con il 2 ° approccio, ma sicuramente uso Ordinati Imposta sulle liste.Non solo hanno senso per questo tipo di lavoro (vedi ZRANGE), sono anche più efficienti in termini di complessità rispetto a LRANGE -ing una lista.

+0

Il tuo commento (e la risposta) mi ha fatto studiare più profondamente la differenza tra LRANGE [O (S + N)] e ZRANGE [O (log (N) + M)], e capire che può essere enorme! Inoltre, mi ha portato a questo [vecchio ma gold post da Reddit] (https://www.reddit.com/r/programming/comments/1f2ml3/what_does_olog_n_mean_exactly/), che spiega O (log n) in modo molto chiaro modo. I commenti ci sono dannatamente divertenti !! Bene, rispondi accettato. Saluti. –