Caching is one of the ways to achieve performance gains by serving request from a temporary location instead of calling backend resources for consequential requests. It is especially critical when considering most of the response times –throughput – take place during backend processes. In this post, I will explain how-to caching for cloud services with demonstration of a sample application.
Base Solution
I will be using the solution that I have used for the previous post as base for this exercise. The demonstration will include very simple case - caching the to-do list retrieved from Azure SQL database and responding all the list queries from there.
Steps
Step 1: Enable Cache
| |
Step 2: Add reference to Azure Caching assembly
| |
| |
| |
|
Step 3: Implementing Caching
- Update task controller utilizing Windows Azure Caching
1:using System.Collections.Generic;
2:using System.Diagnostics;
3:using System.Linq;
4:using System.Web.Mvc;
5:using Microsoft.ApplicationServer.Caching;
6:using ToDoData.Models;
7:
8:namespace ToDoListWeb2.Controllers
9: {
10://[Authorize]
11://[InitializeSimpleMembership]
12:publicclass TaskController : Controller
13: {
14:privateconststring CacheKey = "CachedTasks";
15:readonly DataCache _dataCache = new DataCache("default");
16:
17://
18:// GET: /Home/
19:
20:public ActionResult Index()
21: {
22:return View(GetDataList());
23://Util.TestTrace2();
24://using (var context = new ToDoContext())
25:// return View(context.ToDoItems.ToList());
26: }
27:
28:private List<ToDoItem> GetDataList()
29: {
30:if (_dataCache.Get(CacheKey) == null)
31: {
32: Trace.TraceInformation("Cache with key '{0}' getting filled.", CacheKey);
33:using (var context = new ToDoContext())
34: {
35: _dataCache.Add(CacheKey, context.ToDoItems.ToList());
36: }
37: }
38:else
39: Trace.TraceInformation("Serving the request from the Cache with key '{0}'.", CacheKey);
40:
41:return (List<ToDoItem>)_dataCache[CacheKey];
42: }
43:
44://
45:// GET: /Home/Details/5
46:
47:public ActionResult Details(int id = 0)
48: {
49:using (var context = new ToDoContext())
50:return View(context.ToDoItems.Find(id));
51: }
52: }
53: }
Deployment Preparation
Before deployment we need to modify these (at least)
- Modify instance count to 2+.
- Update Microsoft.WindowsAzure.Plugins.Caching.ConfigStoreConnectionString key with the storage (blob, table) account you have
- Make sure Diagnostics level is set to Information in order to see the tracing outputs written above
- Update identifier attribute of autoDiscover tag with the name of the role you set caching. That would be “ToDoListWeb2” in my case.
1:<dataCacheClients>
2:<dataCacheClient name="default">
3:<autoDiscover isEnabled="true" identifier="ToDoListWeb2" />
4:<!--<localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" />-->
5:</dataCacheClient>
6:</dataCacheClients>
The Result
As you can see, from the image below, first the cache is filled with data (1st request), then cache data used (consequential requests) directly.