Questo problema è quasi identico a quello di sincronizzazione tra il suo codice e il database.
Di solito, il codice di back-end fa lo stesso flusso di lavoro:
- Richiedi database
- Crea (idrata) oggetto da dati grezzi
- Manipola i dati
- Se necessario, aggiorna il database.
- Alla successiva richiesta (nel caso di un'app Web), invalidi totalmente gli oggetti idratati che hai, e ricominci dal punto 1. di nuovo, quando riconosci il database come sorgente "a monte" dei dati.
Da lì, direi che hai 2 paradigmi:
Client - server come server - database
La sincronizzazione da client a server è praticamente la stessa, è necessario impostare un ciclo, in cui si consideri che i dati sono ancora "freschi", quindi alla successiva "azione" dell'utente, eseguire nuovamente la query sul server (come farebbe con un database), e creare i tuoi oggetti client da lì.
Invio da server a client
Un'altra soluzione è di fare in modo che il server "spinga" i nuovi stati oggetto al client, non appena sapranno di essere stati aggiornati. Tale paradigma è utilizzato da nuovi framework come Meteor : i server ascoltano il database, che emette un evento su ogni aggiornamento / inserimento / ecc. I server aggiornano quindi i loro oggetti interni e trasmettono l'evento ai client, che fanno lo stesso (sto semplificando per il gusto della risposta) .
Conclusione
In ogni caso, non esiste una soluzione universale che è necessario aggiungere come libreria al progetto. Il caching è difficile, come se fosse davvero difficile, e dovrai integrare il server - i vincoli del client con il tuo codice e gestirlo da solo.