Redis strategia per i dati del registro delle attività

4

La nostra applicazione richiede un registro delle attività delle azioni eseguite da un utente. Ad esempio:

2013/3/19

-------------

9:37 AM Chuck Norris scartati 3 robot.
9:15 AM Chuck Norris ha combattuto 3 robot.

Attualmente questo viene fatto con una gigantesca query che compila tutta l'attività di un utente in un dato giorno. La query è così lenta che quell'applicazione ti impedisce letteralmente di guardare più di un'attività di un giorno alla volta. Questi risultati potrebbero essere aggressivamente memorizzati nella cache in Redis.

La mia domanda è: qual è una buona strategia chiave di Redis per l'archiviazione di queste attività?

Devo essere in grado di eseguire una ricerca principalmente in base all'ID utente e all'intervallo di date. Ho giocato con le seguenti possibilità, ma nulla mi è saltato addosso come soluzione ottimale.

-- psuedo-code, obviously --
HMSET user:5345:activity date "3/19/2013" time "9:37 AM" action "Some action"
LPUSH user:5345:activity (json)
LPUSH user:5345:activity:2013:03:19 (json)

Tutti e tre hanno significativi compromessi. Supponiamo che un utente non abbia effettuato l'accesso per quattro mesi: in realtà potrebbero voler vedere la propria attività da quattro mesi in cima alla lista. La seconda opzione mi dà questo, ma ci sono anche trade-off in quella direzione (come non essere in grado di interrogare specificamente per data).

Qualche idea su un modo migliore per avvicinarti a questo?

    
posta Jarrod Nettles 20.03.2013 - 17:55
fonte

2 risposte

4

Interessante sfida (!) perché le date sono sparse.

Ecco un pensiero: se riesci a trovare un modo per rappresentare le date come numeri (minuti dopo l'anno 2000?), allora potresti provare un Sorted Set . Il set verrebbe inserito nell'ID utente. Il punteggio sarebbe la rappresentazione numerica della data. Il valore sarebbe la voce del registro.

Quindi puoi usare ZRANGEBYSCORE per ottenere le voci del registro all'interno di un intervallo di date. Inoltre, dovrebbe essere facile / efficiente "ottenere le N voci di registro più recenti".

Esempio: ZADD user:23432:activity 1363800946 data

    
risposta data 20.03.2013 - 19:55
fonte
1

Sono uno degli autori del pacchetto Feedly menzionato.

Abbiamo creato una soluzione per la seconda più grande community di moda online e abbiamo aperto il nostro approccio: link Attualmente è la più grande libreria open source per risolvere questo problema. Puoi utilizzare sia Redis che Cassandra come back-end di archiviazione.

Il nostro backend di archiviazione redis utilizza set ordinati per l'archiviazione dei dati. link Inoltre, utilizziamo le funzionalità di pubsub per i componenti in tempo reale.

Lo stesso team che ha creato Feedly offre anche un'API ospitata, che gestisce la complessità per te. Dai un'occhiata a getstream.io Esistono librerie client per Python, PHP, Node e Ruby. (Questo è basato su Cassandra e quindi sostanzialmente più economico da utilizzare rispetto al tuo sistema che usa Redis)

Inoltre, dai un'occhiata a questo post di scalabilità elevata spieghiamo alcune delle decisioni di progettazione coinvolte: link

Questo tutorial ti aiuterà a configurare un sistema come Pinterest feed usando Redis. È abbastanza semplice iniziare.

Per ulteriori informazioni sulla progettazione dei feed, ti consiglio vivamente di leggere alcuni degli articoli su cui abbiamo basato Feedly:

risposta data 30.05.2014 - 14:07
fonte

Leggi altre domande sui tag