what if you want to update a single item in object that is in distributed cache,as with default functinality of
Azure Caching you have to get whole object from the cache and updating its subItem and again store it back in cache.
when stored object is small it doesn't make a sence,but what is object contain 1000000 items and you want to update only
single item of them,it create performance issue.
Because azure caching not pass the reference of particular object,We have to reference it and updating it by referece.In this post i am going to explain how to reference caching object by simple CRUD example using MVC3 And Azure Distributed Cache Velocity.
you can download example code here.AppFabricCachingDemo
Let's start by creating a Simple Cache using velocity Powershell Administration Tool.
start administration tool and Type this Command: New-Cache -N peoples -TTL 30 -Notif . We are going to use peoples Cache for storing data for our example with Notification nable,and with lifetime 30 minutes.
Step-1:Create new MVC3 Empty Web Application.Select empty template from project dialog.with Razor view engine and Html5 markup support enable.
Step-2:Add Cache library Dll reference to your application.
add below Azure caching configuration settings to configuration Section on first Web.config file relative to your project.
<!--configSections must be the FIRST element --> <configSections> <!-- required to read the <dataCacheClient> element --> <section name="dataCacheClient" type="Microsoft.Data.Caching.DataCacheClientSection, CacheBaseLibrary" allowLocation="true" allowDefinition="Everywhere"/> <!-- required to read the <fabric> element, when present --> <section name="fabric" type="System.Data.Fabric.Common.ConfigFile, FabricCommon" allowLocation="true" allowDefinition="Everywhere"/> </configSections> <!-- routing client--> <dataCacheClient deployment="routing"> <!-- (optional) specify local cache --> <localCache isEnabled="true" sync="notificationbased" objectCount="100000" ttlValue="300"/> <!--(optional) specify cache notifications poll interval,pollinterval parameter(in second) --> <clientNotification pollInterval="10"/> <!-- cache host(s) --> <hosts> <host name="OM" cachePort="22233" cacheHostName="DistributedCacheService"/> </hosts> </dataCacheClient>
Step-3: Right Click on Controller folder on solution explorer -> Add -> Controller.(Give name CacheTest ,Select empty controller template.)
Step-4: Create Three Classes in model folder,one is CacheHelper.vb,second is PeopleInfo.vb,and third is for Shared DataCacheFactory Dcf.vb .
Copy this code in CacheHelper.vb
Imports Microsoft.Data.Caching
Public Class CacheHelper
Private peoples As DataCache
Private Shared z As Integer
Sub New()
peoples = Dcf.instance.GetCache("peoples")
End Sub
Public Property PeoplesInfo As List(Of PeopleInfo)
Get
Return CType(peoples.Get("peopleinfo"), List(Of PeopleInfo))
End Get
Set(ByVal value As List(Of PeopleInfo))
peoples.Put("peopleinfo", value)
End Set
End Property
Sub Delete(ByVal id As Integer)
Delete2(PeoplesInfo, id)
End Sub
Private Sub Delete2(ByRef cache As IList(Of PeopleInfo), ByVal id As Integer)
Dim pi As PeopleInfo = cache.Where(Function(x) x.PeopleID = id).FirstOrDefault
cache.Remove(pi)
End Sub
Function GetPeoples() As IEnumerable(Of PeopleInfo)
If PeoplesInfo Is Nothing OrElse PeoplesInfo.Count < 1 Then
CacheHelper.z = 0
PeoplesInfo = CreatePeoples()
End If
Return PeoplesInfo
End Function
Sub ClearCache()
Clear(PeoplesInfo)
End Sub
Private Sub Clear(ByRef cache As IList(Of PeopleInfo))
cache.Clear()
CacheHelper.z = 0
End Sub
Public Sub addSomePeoples()
Dim tempPeoples As List(Of PeopleInfo) = PeoplesInfo
tempPeoples.AddRange(CreatePeoples())
PeoplesInfo = tempPeoples
End Sub
Private Function CreatePeoples() As List(Of PeopleInfo)
Dim peoplesInfo As New List(Of PeopleInfo)
Dim p As PeopleInfo
For i = CacheHelper.z + 1 To CacheHelper.z + 4
p = New PeopleInfo With {.PeopleID = i, .Name = "pravin" & i, .Address = "madhapar", .ContactNo = "254321221"}
peoplesInfo.Add(p)
Next
CacheHelper.z += 4
Return peoplesInfo
End Function
Function GetInfoByID(ByVal id As Integer) As PeopleInfo
Return PeoplesInfo.Where(Function(x) x.PeopleID = id).FirstOrDefault()
End Function
Sub update(ByVal pi As PeopleInfo)
update2(PeoplesInfo, pi)
End Sub
Private Sub update2(ByRef cache As List(Of PeopleInfo), ByVal pi As PeopleInfo)
Dim index As Integer = cache.FindIndex(Function(x) x.PeopleID = pi.PeopleID)
If index >= 0 Then
cache.Item(index) = pi
End If
End Sub
Sub AddOne()
AddOneTocache(PeoplesInfo)
End Sub
Private Sub AddOneTocache(ByRef cache As IList(Of PeopleInfo))
cache.Add(New PeopleInfo With {.PeopleID = CacheHelper.z + 1, .Name = "people-N", .Gender = 2, .Address = "madhapar", .ContactNo = 5252552})
CacheHelper.z += 1
End Sub
End Class
Copy this code in PeopleInfo.vb
Public Class PeopleInfo
Public Property PeopleID As Integer
Public Property Name As String
Public Property Address As String
Public Property ContactNo As String
Public Property Gender As Int16
Public Property Occupations As String
End Class
Copy this code in Dcf.vb
Imports Microsoft.Data.Caching
Public Class Dcf
Public Shared instance As New DataCacheFactory
End Class
Copy this code in CacheTestController.vb
Public Class CacheTestController
Inherits System.Web.Mvc.Controller
'
' GET: /CacheTest
Private ph As CacheHelper
Sub New()
ph = New CacheHelper
End Sub
Function Index() As ActionResult
Return RedirectToAction("GetPeoples")
End Function
Function addSomePeoples() As ActionResult
ph.addSomePeoples()
Return RedirectToAction("GetPeoples")
End Function
Function GetPeoples() As ViewResult
Return View("PeoplesList", ph.GetPeoples)
End Function
Function Details(ByVal id As Integer) As ActionResult
Return View(ph.GetInfoByID(id))
End Function
Function ClearCache() As ActionResult
ph.ClearCache()
Return RedirectToAction("GetPeoples")
End Function
Function Addone() As ActionResult
ph.AddOne()
Return RedirectToAction("GetPeoples")
End Function
_
Function update(ByVal id As Integer) As ViewResult
Return View(ph.GetInfoByID(id))
End Function
_
Function update(ByVal pi As PeopleInfo) As RedirectToRouteResult
ph.update(pi)
Return (RedirectToAction("GetPeoples"))
End Function
Function Delete(ByVal id As Integer) As RedirectToRouteResult
ph.Delete(id)
Return RedirectToAction("GetPeoples")
End Function
End Class
Step-5: Open CacheTestController.vb -> Right Click on GetPeoples Action Method and Select Add View and set option showen in below image.
This will create one subfolder in View folder with the same name as controller(CacheTest) and add your view to that folder.
Step-6: -> Right Click on Update Action Method and Select add view and set option as shown in below image.Step-7: -> Right Click on Details Action Method and Select add view and set option as shown in below image.
Step-8: -> Open PeopleList.vbhtml View and add below code at start of the body tag.
@Html.ActionLink("Add some peoples Cache", "addSomePeoples") |
@Html.ActionLink("Clear Cache","ClearCache") |
@Html.ActionLink("Add one people to cache", "Addone") |
