2009-05-04 15 views
5

Domanda: Quali framework di caching sono disponibili per Delphi e quanto sono ben sviluppati? Se non ce ne sono, c'è un modo ampiamente accettato di raggiungere lo stesso obiettivo? Applicabile alle versioni di targeting di Win32 di Delphi.Esistono framework di caching per Delphi?

Domanda dettaglio: Il tipo di quadro che sto indagando su esiste in gran parte nel framework di sviluppo web che permette all'utente di:

  • Controllare la cache per i dati precedentemente memorizzato/Oggetto
  • Recupera Dati/Oggetto
  • Memorizza il nuovo Data/Oggetto
  • Opzionalmente, tag i Dati/Oggetto ed etichettalo.
  • Scadono dati/oggetti in base a determinati criteri (etichette, tag, limiti di tempo ecc.).

Comprendo che la mancanza di servizi di riflessione per Delphi Objects senza RTTI significa che probabilmente non esisteranno nello stesso modo ma esiste un modo simile di ottenere almeno una parte dello stesso risultato finale in un altro Via Delfi?

Approccio alternativo: In alternativa a una libreria Delphi nativa: Esiste ad esempio un buon set di collegamenti per memcached o qualcosa di simile?

risposta

4

Ho usato memcached su Linux (ci sono versioni su Windows e MacOS, così come quasi tutti gli altri sistemi operativi), è piuttosto semplice.

ho affrontato direttamente, usando TIDTelnet di Indy, leggendo il protocollo del documentation, ho usato solo set, ottenere, eliminare, e uscire.

Ho usato questo tipo di comandi (ho impostato e ottenere "nome", 14 è il numero di byte da memorizzare):

[email protected]:~$ telnet 127.0.0.1 11211 
Trying 127.0.0.1... 
Connected to 127.0.0.1. 
Escape character is '^]'. 
set name 0 0 14 
Osama Alassiry 
STORED 
get name 
VALUE name 0 14 
Osama Alassiry 
END 
quit 

memcached consente di memorizzare fino a 1 MB per ogni chiave di cache, I usato tasti compositi come 'Person | 17 | name', 'Person | 17 | picture', 'Employee | 7 | Salary | Basic' (questi sono nomi fittizi non correlati a quello che ho fatto realmente) ... Ho memorizzato alcuni file binari nella cache come base64 che consente di utilizzare fino a 768k di dati binari.

memcached può anche essere distribuito su diversi server tagliando le chiavi e selezionando uno dei diversi server in base all'hash.

+1

+1, penso che questo sia un buon consiglio. memcached è una soluzione stabile e ottimizzata, disponibile non solo per Linux, ma anche per Windows e Mac OS X. Se farlo a livello di protocollo sarebbe troppo difficile, ci sono librerie client (come libmemcached) che possono essere utilizzate come DLL dai programmi Delphi. – mghie

+1

è molto semplice, ho aggiunto un esempio. Ho usato solo set e get, delete e quit. Ho avuto la mia funzione per farlo. Non mi piace aggiungere DLL. –

+0

Sono d'accordo mghie - il miglior consiglio finora, guardando il protocollo non sarebbe stato troppo lavoro usare un wrapper esistente come DLL o creare un rapido wrapper Delphi io stesso. – jamiei

1

Il meccanismo di memorizzazione nella cache richiede il rotolamento manuale.

Splay Trees sono un meccanismo utile e diretto per la memorizzazione di oggetti memorizzati nella cache e anche per rilevare la loro stagnazione.

1

Questi framework forniscono qualche modo di caching oggetti

A seconda delle specifiche esigenze, questi potrebbero essere sopra le righe. Se si tenta di implementare una soluzione personalizzata, suggerirei di dare un'occhiata ai vari contenitori nello Jedi VCL come punto di partenza.

+0

Questi quadri potrebbero essere utili per un'applicazione già utilizzando uno di quanto sopra, ma in caso contrario, come lei ha giustamente, può essere un un po 'esagerato. – jamiei

+1

- kbmw, midware, la lista è infinita. –

1

Se vuoi creare il tuo, probabilmente lo vuoi fare in Freepascal, in quanto ha un supporto a 64 bit. Invece di alberi splay binari, suggerirei un k-ary.

1

Ok. Probabilmente finirò per sentirmi pazzo, ma qual è il problema con TStringList? Stavo usando una serie dinamica di dati abbastanza strutturati con una TStringList per trovare un elemento basato su un ID stringa. Recentemente, ho aggiornato TStringList su THashedStringList. Potrebbe essere un po 'più veloce, ma nulla di veramente notevole ancora. La disposizione di StringList/Array ha fornito prestazioni eccezionali per la mia applicazione fino ad ora.

Fino ad ora ho memorizzato solo da 100 a 150 record, ma mi aspetto che funzioni fino a forse un paio di migliaia. Nel business in cui mi trovo, questa è un'operazione piuttosto grande.

+3

Non scala. Hai 2 GB di RAM nella tua macchina (32 bit). Ciò rende alcuni milioni di dischi. In una stringlist ordinata con un milione di record, un inserto indica uno spostamento di blocco di mediamente 500000 puntatori (2 MByte). L'hashing di una stringa è O (lunghezza (s)). –

+0

I limiti pratici del kickboxing si aggirano intorno al 40000-200000 a seconda dei requisiti esatti e del modello di crescita e del codice. –

+0

Grazie per il commento. Come ho detto, sto memorizzando nella cache circa 150 record di dipendenti in un programma di buste paga. Se ottengo fino a 40.000 dipendenti, potrei dover considerare le alternative, ma una StringList crea un ottimo meccanismo di memorizzazione nella cache per il numero di record che penso che probabilmente vedrò. – jrodenhi

Problemi correlati