Ayende @ Rahien

My name is Oren Eini
Founder of Hibernating Rhinos LTD and RavenDB.
You can reach me by phone or email:


+972 52-548-6969

, @ Q c

Posts: 6,130 | Comments: 45,558

filter by tags archive

Aggressive caching: Pacified

time to read 2 min | 360 words

RavenDB’s aggressive caching allows RavenDB Clients to skip going to the server and  serve requests directly off the client cache. That means that you can answer queries very  quickly, because you never even have to leave your process memory space.

The downside to that was, of course, that you might be showing information that have changed behind your back.

That is why we usually wrote aggressive caching code like this:

using (session.Advanced.DocumentStore.AggressivelyCacheFor(TimeSpan.FromMinutes(5)))
   var user =  session.Load<User>("users/1");

We gave it some duration in which it was okay to skip going to the server. So we had a maximum of 5 minutes when we had the cached information in place.

That was nice, but it was awkward. And not really nice thing to do in general. In particular, it meant that you had to wait 5 minutes for things to actually show up in the application. That can be... frustrating, because it looks like the system isn’t really doing something. On the other hand, it also means that you still have to query the server when the duration is over, and by necessity, the durations are relatively short.

We decided to change that. Now, when you are using aggressive caching, RavenDB will automatically subscribe to changes from the server. When that happens, we will be able to use the notifications to know when we need to re-check on the server.

That means that you can set an aggressive cache duration of much longer period, and that we will know, automatically and without you needing to do anything.

It is a small touch, but an important one. Things just get better Smile.



Why there is no 'evict'?

Harry McIntyre

Now that sounds good. If the client is disconnected, is the cache cleared automatically? (i.e. is there any way the client could miss the notification?)

Ayende Rahien

Harry, No, the client will try to reconnect automatically. But it is a possibility, that is why it is still an active decision on your part.

Māris Krivtežs

If server sends notifications about changes, why cache duration is needed? If cache is expired application will be notified.

Ayende Rahien

Māris, For cases where you have actual disconnection. Note that we also have just AggressiveCache() method.

Harry McIntyre

Is there some way you can hook into the disconnection event so you could opt in to invalidate-on-disconnect?

Ayende Rahien

Harry, Yes, that is available in the API.


Lol, why the word aggressive? :) It doesn't add anything, it's still just normal caching. I'd go with simpler using (session.Advanced.DocumentStore.CacheFor.Minutes(5))

or smth similar.

David Boike

@Darius Because Raven also includes automatic caching of all documents. If you request a document that already exists in cache, Raven will tell the server "I would like this document, but I already have version X in my cache" using the standard HTTP mechanics of passing the last modified date. If the document has not been modified, the server will send back a 304 Not Modified, and the client will give you back the cached version. So that is the "normal" caching, and the "aggressive" caching is the additional choice to skip talking to the server at all.

@Ayende, this is AWESOME by the way, thank you!

John Clayton

So is the API for using aggressive caching still the same with the exception of being able to use a longer timeout?


Awesome feature. It really sounds like it should be smarter about disconnects, with at least an option to automatically clear the cache - or possibly a smarter way to find out what needs to be cleared.

But really, awesome feature.

Catalin Pop

One definition for "aggressive" is : "deliberately unfriendly behavior involving forcing, constraining or overruling"

There's no overruling here being done by the client if the server can invalidate the caches, which means "Aggressive" doesn't seem to be appropriate name in this case.

My 2c

Ayende Rahien

Catalin, But the aggressive caching ISN'T talking to the server.


Since the functionality being called through store, is cache attached to store or to session? and if we close the session, will it clear the cache?

Ayende Rahien

Shifatullah, This is attached to the store, not the session. Session are very short lived, and caching stuff on them makes very little sense.

Jean Pierre

I am working on an application using RavenDB, using the latest packages from nuget. I haven't seen this functionality working. Is there anything special that needs to be set for this to work? Thanks.

Ayende Rahien

Jean, This is only available on 2.5.

Comment preview

Comments have been closed on this topic.


  1. How to waste CPU and kill your disk by scaling 100 million inefficiently - 7 hours from now
  2. RavenDB Conference 2016–Slides - about one day from now

There are posts all the way to Jun 01, 2016


  1. The design of RavenDB 4.0 (14):
    26 May 2016 - The client side
  2. RavenDB 3.5 whirl wind tour (14):
    25 May 2016 - Got anything to declare, ya smuggler?
  3. Tasks for the new comer (2):
    15 Apr 2016 - Quartz.NET with RavenDB
  4. Code through the looking glass (5):
    18 Mar 2016 - And a linear search to rule them
  5. Find the bug (8):
    29 Feb 2016 - When you can't rely on your own identity
View all series


Main feed Feed Stats
Comments feed   Comments Feed Stats