Design caching system

0

Sto pensando di creare il mio sistema di caching, principalmente per C #, ma questa è più una domanda di design, quindi la lingua non ha molta importanza.

Iniziamo dall'inizio, ho una API di base, che usa l'intestazione ETag per verificare se qualcosa è cambiato.

Questo è ICachingProvider, è l'interfaccia di base per tutti i provider di memorizzazione nella cache.

public interface ICachingProvider {
    // Writes a caching entry
    void WriteCachingEntry<T>(string uri, string md5, T data);
    // Reads a caching entry sync
    Tuple<string, T> ReadCachingEntry<T>(string uri);
    // Reads a caching entry async
    Task<Tuple<string, T>> ReadCachingEntryAsync<T>(string uri);
    // Clears the cache
    void ClearCache();
    // The current storage size
    long Size { get; }
    // How much can be stored maximum
    long MaxSize { get; }
}

Attualmente, ho creato un MemoryCahingProvider e un FileSystemCachingProvider in cui l'ultimo è solo in fase di archiviazione dei file JSON nella memoria isolata.

Ora il mio piano è, per implementare anche un sistema di memorizzazione nella cache del database, spero in una migliore velocità e in un minore utilizzo dello spazio, forse mi sbaglio.

Per arrivare al punto della domanda, non sono sicuro del tipo di database che dovrei usare. Per prima cosa ho pensato solo a un database SQLlite, ma non sarebbe stato molto efficiente, perché ho più di un tipo di elemento, simile all'API di Facebook. Il prossimo colpo sarebbe CouchDB o MongoDB, ma non voglio installare più software sul sistema client del necessario.

Qualcuno ha esperienza con quel tipo di cache o qualcuno ha un'idea su come costruire qualcosa di simile e con quale tipo di database?

    
posta Knerd 12.02.2015 - 23:19
fonte

1 risposta

1

Potresti dare un'occhiata al System.Web.Caching documentazione su MSDN. Esistono alcune buone idee astratte sui dati di Caching pertinenti a qualsiasi sistema, anche al di fuori di un sito Web.

Ad esempio, CacheDependency classe:

Establishes a dependency relationship between an item stored in an ASP.NET application's Cache object and a file, cache key, an array of either, or another CacheDependency object. The CacheDependency class monitors the dependency relationships so that when any of them changes, the cached item will be automatically removed.

E anche se la cache sembra non avere nulla a che fare con la cache di ASP.Net, seguire questo esempio nella creazione del proprio dovrebbe essere utile.

Per quanto riguarda il ICachingProvider OutputCacheProvider afferma:

Notes to Inheritors When you inherit from OutputCacheProvider, you must override the following members:

• Add

• Get

• Remove

• Set

Trovo che sia una buona pratica vedere quali sono le convenzioni create da Microsoft e le convenzioni di denominazione che usano per oggetti simili e quindi riutilizzare quelle idee per le mie classi. È vantaggioso perché altri programmatori che potrebbero utilizzare le tue classi e avere esperienza con classi simili di Microsoft dovrebbero avere un tempo più semplice per implementare la tua soluzione.

The next shot would be CouchDB or MongoDB, but I don't want to install more software on the client system than needed.

Se stai costruendo una cache di database, non dovrebbe preoccuparsi di cosa sia il back-end (a meno che non sia lì dove stai memorizzando la cache, ma poi ho chiesto come sarebbe più veloce di un database in generale).

    
risposta data 12.02.2015 - 23:58
fonte

Leggi altre domande sui tag