2013-06-11 22 views
5

Sto lavorando a un sito di throughput molto elevato con molti elementi, sto cercando di implementare la funzionalità di tipo "trend adesso", che consentirebbe agli utenti di ottenere rapidamente un elenco di priorità N oggetti che sono stati visti di recente da molte persone, che gradualmente svaniscono man mano che ottengono meno visualizzazioni.Utilizzo di Redis per la funzionalità "trend adesso"

Un'idea su come fare questo è dare più peso alle viste recenti di un oggetto, qualcosa come un peso di 16 per ogni vista di un oggetto negli ultimi 15 minuti, un peso di 8 per ogni vista di un oggetto nell'ultima ora, un peso di 4 per le cose nelle ultime 4 ore, ecc., ma non so se questo sia il modo giusto per affrontarlo.

Mi piacerebbe farlo in Redis, abbiamo avuto un buon successo con Redis in passato per altri progetti.

Qual è il modo migliore per eseguire questa operazione, sia dal punto di vista tecnologico sia dalla determinazione di ciò che è in trend?

La prima risposta suggerisce una soluzione, ma sto cercando ulteriori dettagli, a partire da una taglia.

Queste sono entrambe idee decenti, ma non abbastanza dettagliate. Uno ha ottenuto metà della taglia ma ha lasciato aperta la domanda.

risposta

6

Quindi, vorrei iniziare con un ordine orario di base (zset di item_id segnato da timestamp, ad esempio), e quindi fluttuare le cose in base alle interazioni. Quindi potresti decidere che una singola interazione vale 10 minuti di "freschezza", quindi ogni interazione aggiunge molto tempo al punteggio dell'articolo pertinente. Se tutte le interazioni sono valutate allo stesso modo, puoi farlo con un set di z e incrementare i punteggi man mano che si verificano interazioni.

Se si desidera ottenere una sorta di back-off, ad esempio, il punteggio della radice quadrata del conteggio delle interazioni anziché il conteggio delle interazioni direttamente, è possibile creare un secondo zset con il punteggio per le interazioni e utilizzare zunionstore per combina questo con il tuo indice timestamp. Per questo, probabilmente vorrai tirare fuori lo spartito esistente, fare alcuni calcoli e mettere un nuovo punteggio (zadd ti permetterà di sovrascrivere un punteggio)

Lo zunionstore è potenzialmente costoso, e per abbastanza grande imposta anche lo zadd/zincrby diventa costoso. A tal fine, potresti voler mantenere solo gli elementi con il punteggio più alto, per N = 10.000, a seconda delle esigenze dell'applicazione.

2

considera un set ordinato con il numero di visualizzazioni come punteggi. ogni volta che si accede a un oggetto, incrementarne il punteggio (http://redis.io/commands/zincrby). in questo modo puoi ottenere gli articoli migliori dal set ordinati per punteggio.

sarà necessario "sbiadire" anche gli elementi, magari con un processo esterno che ridurrebbe i punteggi.

+0

grazie, utilizzando questo approccio, come sarebbero le voci mai diventato meno "caldo"? – OneSolitaryNoob

+0

Ho aggiornato la risposta. – akonsu

+0

grazie mille, ZINCRBY sembra davvero utile.ulteriori dettagli sulla struttura? qual è il massimo che potrei aspettarmi di mettere in questo set? alcuni milioni sarebbero troppi? l'approccio cron di "fade" cron è un modo ragionevole di fare le cose? – OneSolitaryNoob

4
+1

La pubblicazione di soli collegamenti è generalmente rischiosa; rimarrai sospeso se i link non diventeranno mai validi. –

+0

Grazie Bill. Ho guardato nel dimenticatoio. Sembra che non scala molto. L'esempio è un insieme ordinato di ~ 260 paesi che viene letto nella sua interezza. Con solo 260 elementi va bene, ma non funzionerebbe con 10s di milioni. Potrebbe esserci un modo per suddividere i loro dati in molte chiavi Redis e usare il loro approccio di decadenza, ma rende noioso trovare gli elementi "trend attuali" in cima. (e Bill è corretto, i collegamenti potrebbero diventare obsoleti) – OneSolitaryNoob

+2

Sembra che il primo link sia morto. È lo stesso articolo http://qwerjk.com/posts/surfacing-interesting-content? – smilledge