title: Storing Data In Memory: Session vs Cache vs Static
body: <p>A bit of backstory:  I am working on an web application that requires quite a bit of time to prep / crunch data before giving it to the user to edit / manipulate.  The data request task ~ 15 / 20 secs to complete and a couple secs to process.  Once there, the user can manipulate vaules on the fly.  Any manipulation of values will require the data to be reprocessed completely.</p>
  
  <p>Update:  To avoid confusion, I am only making the data call 1 time (the 15 sec hit) and then wanting to keep the results in memory so that I will not have to call it again until the user is 100% done working with it.  So, the first pull will take a while, but, using Ajax, I am going to hit the in-memory data to constantly update and keep the response time to around 2 secs or so (I hope).</p>
  
  <p>In order to make this efficient, I am moving the intial data into memory and using Ajax calls back to the server so that I can reduce processing time to handle the recalculation that occurs w/ this user's updates.</p>
  
  <p>Here is my question, with performance in mind, what would be the best way to storing this data, assuming that only 1 user will be working w/ this data at any given moment.  </p>
  
  <p>Also, the user could potentially be working in this process for a few hours.  When the user is working w/ the data, I will need some kind of failsafe to save the user's current data (either in a db or in a serialized binary file) should their session be interrupted in some way. In other words, I will need a solution that has an appropriate hook to allow me to dump out the memory object's data in the case that the user gets disconnected / distracted for too long.</p>
  
  <p>So far, here are my musings:</p>
  
  <p>Session State - Pros:  Locked to one user.  Has the Session End event which will meet my failsafe requirements.  Cons: Slowest perf of the my current options.  The Session End event is sometimes tricky to ensure it fires properly.</p>
  
  <p>Caching - Pros: Good Perf.  Has access to dependencies which could be a bonus later down the line but not really useful in current scope.  Cons:  No easy failsafe step other than a write based on time intervals.  Global in scope - will have to ensure that users do not collide w/ each other's work.</p>
  
  <p>Static - Pros:  Best Perf.  Easies to maintain as I can directly leverage my current class structures.  Cons:  No easy failsafe step other than a write based on time intervals.  Global in scope - will have to ensure that users do not collide w/ each other's work.</p>
  
  <p>Does anyone have any suggestions / comments on what I option I should choose?</p>
  
  <p>Thanks!</p>
  
  <p>Update:  Forgot to mention, I am using VB.Net, Asp.Net, and Sql Server 2005 to perform this task. </p>