2011-03-06 15 views
5

Desidero rimuovere la dipendenza sql di piccoli blocchi di dati su cui carico (quasi) ogni richiesta su un'applicazione Web. La maggior parte dei dati è strutturata su valori-chiave/documento, ma una soluzione relazionale non è esclusa. I dati non sono troppo grandi quindi voglio tenerlo in memoria per una maggiore disponibilità.Raccomandazione per un database in memoria

Quale soluzione consiglieresti?

+0

Puoi condividere lo stack Web che stai utilizzando? LAMP o .NET o? – DuckMaestro

risposta

6

La memoria di valore chiave più semplice e più utilizzata in memoria è MemcacheD. Nella pagina Introduzione reitera ciò che si sta chiedendo:

Memcached è un negozio di valori-chiave in memoria per i piccoli pezzi di dati arbitrari (stringhe, oggetti) dai risultati di chiamate al database, chiamate API, o pagina il rendering.

L'elenco dei clienti è impressionante. È stato per molto tempo. Buona documentazione Ha API per quasi tutti i linguaggi di programmazione. Il ridimensionamento orizzontale è piuttosto semplice. Come la mia esperienza va a Memcached va bene.

Si potrebbe anche voler esaminare MemBase.

1

Non sono sicuro che questo sia quello che stai cercando, ma dovresti esaminare un framework di caching (qualcosa che potrebbe essere incluso negli strumenti che stai usando ora). Con un modello di repository chiedi i dati, lì controlli se ce l'hai in cache per chiave. Io no, lo si preleva dal database, se lo si fa, lo si preleva dalla cache.

Dipenderà dal tipo di dati che si sta gestendo, quindi spetta a te decidere per quanto tempo conservare i dati nella cache. Forse un timeout scorrevole è la cosa migliore in quanto manterrai i dati finché la chiave continua a essere richiesta. Il che significa che se la cache ha dati per un utente, una volta che l'utente se ne va, i dati scadranno dalla cache.

6

Redis è perfetto per questo tipo di dati. Supporta anche alcune strutture dati fondamentali e fornisce operazioni su di esse.

Recentemente ho convertito la mia app del forum Django per usarla per tutti i dati di tracciamento in tempo reale - è così bello non avere più la sensazione odiosa che si ottiene quando si fa questo genere di cose (SET views = views + 1 e altre scritture su ogni pagina vista) con un database relazionale.

Ecco un esempio di utilizzo di Redis per memorizzare i dati necessari per il monitoraggio delle attività degli utenti, tra cui mantenere un insieme ordinato di ultimi utenti che hanno visitato fino ad oggi, in Python:

def seen_user(user, doing, item=None): 
    """ 
    Stores what a User was doing when they were last seen and updates 
    their last seen time in the active users sorted set. 
    """ 
    last_seen = int(time.mktime(datetime.datetime.now().timetuple())) 
    redis.zadd(ACTIVE_USERS, user.pk, last_seen) 
    redis.setnx(USER_USERNAME % user.pk, user.username) 
    redis.set(USER_LAST_SEEN % user.pk, last_seen) 
    if item: 
     doing = '%s <a href="%s">%s</a>' % (
      doing, item.get_absolute_url(), escape(str(item))) 
    redis.set(USER_DOING % user.pk, doing) 
3

Se non ti dispiace lo sql ma vuoi mantenere il db in memoria, potresti voler controllare sqlite (vedi http://www.sqlite.org/inmemorydb.html).

Se non si desidera lo sql e si hanno solo coppie chiave-valore, perché non archiviarle in una mappa/hash/array associativo e terminarle?

2

Se si ha bisogno di un database in memoria, H2 è un'opzione molto buona.

2

Un altro database da considerare: Berkeley DB. Berkeley DB consente di configurare il database in memoria, su disco o entrambi. Supporta sia un valore chiave (NoSQL) che un'API SQL. Berkeley DB viene spesso utilizzato in combinazione con applicazioni Web perché è incorporato, facilmente implementabile (distribuisce con l'applicazione), altamente configurabile e molto affidabile.Esistono diversi siti Web di e-Retail che si basano su Berkeley DB per le loro applicazioni di e-Commerce, incluso Amazon.com.

+2

In questa risposta dovresti divulgare la tua relazione con BDB. – user7116

+1

Un altro problema con BerkeleyDB è la licenza AGPL, nel senso che se si desidera utilizzarlo nella propria applicazione, è necessario acquistare una licenza proprietaria o open source la propria app. – user1876508

0

Puoi suddividere questi dati? Il modello di accesso ai dati è semplice e stabile (non cambia con i requisiti aziendali in evoluzione)? Quanto sono importanti questi dati (il contesto di sessione, per esempio, non è troppo difficile da ripristinare, mentre alcune preferenze che un utente ha inserito in una pagina delle impostazioni non vanno perse)?

In genere, a condizione che sia possibile frammentare e che i propri schemi di accesso ai dati siano semplici e non si modifichino troppo, si sceglie Redis. Se cerchi qualcosa di più affidabile e supporta schemi di accesso ai dati più avanzati, Tarantool è una buona opzione.

0

Si prega di controllare questo:

http://www.mongodb.org/

La sua davvero un buon database di No-SQL con i driver e supporto per tutte le principali lingue.