Generic MemoryCache Class
<div style="font-family:Consolas;font-size:13px;color:gainsboro;background:#1e1e1e;padding:1.5em;"><span style="color:#569cd6;">Imports</span> System<span style="color:#b4b4b4;">.</span>Collections<span style="color:#b4b4b4;">.</span>Specialized<br/><span style="color:#569cd6;">Imports</span> System<span style="color:#b4b4b4;">.</span>Runtime<span style="color:#b4b4b4;">.</span>Caching<br/> <br/> <br/><span style="color:#569cd6;">Namespace</span> Caching<span style="color:#b4b4b4;">.</span>Generic<br/> <br/> <span style="color:#569cd6;">Public</span> <span style="color:#569cd6;">Class</span> <span style="color:#4ec9b0;">MyMemoryCache</span><br/> <span style="color:#569cd6;">Private</span> MyCache <span style="color:#569cd6;">As</span> <span style="color:#4ec9b0;">MemoryCache</span><br/> <span style="color:#569cd6;">Public</span> <span style="color:#569cd6;">ReadOnly</span> <span style="color:#569cd6;">Property</span> Count <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">Integer</span><br/> <span style="color:#569cd6;">Get</span><br/> <span style="color:#569cd6;">Return</span> MyCache<span style="color:#b4b4b4;">.</span>Count<br/> <span style="color:#569cd6;">End</span> <span style="color:#569cd6;">Get</span><br/> <span style="color:#569cd6;">End</span> <span style="color:#569cd6;">Property</span><br/> <br/> <span style="color:#569cd6;">Public</span> <span style="color:#569cd6;">ReadOnly</span> <span style="color:#569cd6;">Property</span> Cache <span style="color:#569cd6;">As</span> <span style="color:#4ec9b0;">MemoryCache</span><br/> <span style="color:#569cd6;">Get</span><br/> <span style="color:#569cd6;">Return</span> MyCache<br/> <span style="color:#569cd6;">End</span> <span style="color:#569cd6;">Get</span><br/> <span style="color:#569cd6;">End</span> <span style="color:#569cd6;">Property</span><br/> <br/> <span style="color:#569cd6;">Public</span> <span style="color:#569cd6;">Sub</span> <span style="color:#569cd6;">New</span>(Domain <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">String</span>, <span style="color:#569cd6;">Optional</span> CacheMemory <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">Integer</span> <span style="color:#b4b4b4;">=</span> <span style="color:#b5cea8;">0</span>, <span style="color:#569cd6;">Optional</span> PhysicalMemoryLimit <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">Long</span> <span style="color:#b4b4b4;">=</span> <span style="color:#b5cea8;">0</span>, <span style="color:#569cd6;">Optional</span> PollingIntervalMinutes <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">Integer</span> <span style="color:#b4b4b4;">=</span> <span style="color:#b5cea8;">2</span>)<br/> <span style="color:#569cd6;">If</span> PhysicalMemoryLimit <span style="color:#b4b4b4;">></span> <span style="color:#b5cea8;">100</span> <span style="color:#569cd6;">Then</span> PhysicalMemoryLimit <span style="color:#b4b4b4;">=</span> <span style="color:#b5cea8;">100</span><br/> <span style="color:#569cd6;">Dim</span> cachesetting <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">New</span> <span style="color:#4ec9b0;">NameValueCollection</span><br/> cachesetting<span style="color:#b4b4b4;">.</span>Add(<span style="color:#d69d85;">"CacheMemoryLimitMegabytes"</span>, CacheMemory)<br/> cachesetting<span style="color:#b4b4b4;">.</span>Add(<span style="color:#d69d85;">"physicalMemoryLimitPercentage"</span>, PhysicalMemoryLimit)<br/> cachesetting<span style="color:#b4b4b4;">.</span>Add(<span style="color:#d69d85;">"pollingInterval"</span>, <span style="color:#4ec9b0;">TimeSpan</span><span style="color:#b4b4b4;">.</span>FromMinutes(PollingIntervalMinutes)<span style="color:#b4b4b4;">.</span>ToString())<br/> cachesetting<span style="color:#b4b4b4;">.</span>Add(<span style="color:#d69d85;">"Name"</span>, Domain)<br/> MyCache <span style="color:#b4b4b4;">=</span> <span style="color:#569cd6;">New</span> <span style="color:#4ec9b0;">MemoryCache</span>(Domain, cachesetting)<br/> <span style="color:#569cd6;">End</span> <span style="color:#569cd6;">Sub</span><br/> <br/> <span style="color:#569cd6;">Public</span> <span style="color:#569cd6;">Function</span> GetObjectFromCache(<span style="color:#569cd6;">Of</span> <span style="color:#b8d7a3;">T</span>)(<span style="color:#569cd6;">ByVal</span> cacheItemName <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">String</span>, <span style="color:#569cd6;">ByVal</span> cacheTimeInMinutes <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">Integer</span>, <span style="color:#569cd6;">ByVal</span> objectSettingFunction <span style="color:#569cd6;">As</span> <span style="color:#4ec9b0;">Func</span>(<span style="color:#569cd6;">Of</span> <span style="color:#569cd6;">String</span>, <span style="color:#b8d7a3;">T</span>), <span style="color:#569cd6;">ByRef</span> isCached <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">Boolean</span>, <span style="color:#569cd6;">ByRef</span> AccessTime <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">Long</span>) <span style="color:#569cd6;">As</span> <span style="color:#b8d7a3;">T</span><br/> <span style="color:#569cd6;">Dim</span> sw <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">New</span> <span style="color:#4ec9b0;">Stopwatch</span><br/> sw<span style="color:#b4b4b4;">.</span>Start()<br/> <span style="color:#569cd6;">Dim</span> cachedObject <span style="color:#b4b4b4;">=</span> <span style="color:#569cd6;">CType</span>(MyCache(cacheItemName), <span style="color:#b8d7a3;">T</span>)<br/> <span style="color:#569cd6;">If</span> cachedObject <span style="color:#569cd6;">Is</span> <span style="color:#569cd6;">Nothing</span> <span style="color:#569cd6;">Then</span><br/> <span style="color:#569cd6;">Dim</span> policy <span style="color:#569cd6;">As</span> <span style="color:#4ec9b0;">CacheItemPolicy</span> <span style="color:#b4b4b4;">=</span> <span style="color:#569cd6;">New</span> <span style="color:#4ec9b0;">CacheItemPolicy</span>()<br/> <span style="color:#57a64a;">'policy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(cacheTimeInMinutes) ' Fixed Timeout</span><br/> policy<span style="color:#b4b4b4;">.</span>SlidingExpiration <span style="color:#b4b4b4;">=</span> <span style="color:#4ec9b0;">TimeSpan</span><span style="color:#b4b4b4;">.</span>FromMinutes(cacheTimeInMinutes) <span style="color:#57a64a;">' Sliding timeout</span><br/> cachedObject <span style="color:#b4b4b4;">=</span> objectSettingFunction(cacheItemName)<br/> isCached <span style="color:#b4b4b4;">=</span> <span style="color:#569cd6;">False</span><br/> MyCache<span style="color:#b4b4b4;">.</span>[Set](cacheItemName, cachedObject, policy)<br/> <span style="color:#569cd6;">Else</span><br/> isCached <span style="color:#b4b4b4;">=</span> <span style="color:#569cd6;">True</span><br/> <span style="color:#569cd6;">End</span> <span style="color:#569cd6;">If</span><br/> sw<span style="color:#b4b4b4;">.</span>Stop()<br/> AccessTime <span style="color:#b4b4b4;">=</span> sw<span style="color:#b4b4b4;">.</span>ElapsedMilliseconds<br/> <span style="color:#569cd6;">Return</span> cachedObject<br/> <span style="color:#569cd6;">End</span> <span style="color:#569cd6;">Function</span><br/> <span style="color:#569cd6;">End</span> <span style="color:#569cd6;">Class</span><br/> <br/><span style="color:#569cd6;">End</span> <span style="color:#569cd6;">Namespace</span><br/></div>
Using Generic MemoryCache
<div style="font-family:Consolas;font-size:13px;color:gainsboro;background:#1e1e1e;padding:1.5em;"><span style="color:#569cd6;">Imports</span> TechnicaOne<span style="color:#b4b4b4;">.</span>Caching<span style="color:#b4b4b4;">.</span>Generic<br/></div>
<div style="font-family:Consolas;font-size:13px;color:gainsboro;background:#1e1e1e;padding:1.5em;"><span style="color:#569cd6;">Dim</span> IPAddressCache <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">New</span> TechnicaOne<span style="color:#b4b4b4;">.</span>Caching<span style="color:#b4b4b4;">.</span>Generic<span style="color:#b4b4b4;">.</span><span style="color:#4ec9b0;">MyMemoryCache</span>(<span style="color:#d69d85;">"IPAddressCache"</span>)<br/></div>
<div style="font-family:Consolas;font-size:13px;color:gainsboro;background:#1e1e1e;padding:1.5em;"><span style="color:#569cd6;">Dim</span> FetchfromDatabase <span style="color:#569cd6;">As</span> <span style="color:#4ec9b0;">Func</span>(<span style="color:#569cd6;">Of</span> <span style="color:#569cd6;">String</span>, <span style="color:#4ec9b0;">IPAddressLookup</span>) <span style="color:#b4b4b4;">=</span> <span style="color:#569cd6;">AddressOf</span> dbFetch<br/></div>
<div style="font-family:Consolas;font-size:13px;color:gainsboro;background:#1e1e1e;padding:1.5em;"><span style="color:#569cd6;">Private</span> <span style="color:#569cd6;">Function</span> dbFetch(key <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">String</span>) <span style="color:#569cd6;">As</span> <span style="color:#4ec9b0;">IPAddressLookup</span><br/> <span style="color:#569cd6;">Dim</span> results <span style="color:#569cd6;">As</span> <span style="color:#4ec9b0;">IPAddressLookup</span><br/> <span style="color:#569cd6;">Using</span> db <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">New</span> <span style="color:#4ec9b0;">ServerDefenderDBDataContext</span><br/> results <span style="color:#b4b4b4;">=</span> (<span style="color:#569cd6;">From</span> this <span style="color:#569cd6;">In</span> db<span style="color:#b4b4b4;">.</span>IPAddressLookups <span style="color:#569cd6;">Where</span> this<span style="color:#b4b4b4;">.</span>IPAddress <span style="color:#b4b4b4;">=</span> key <span style="color:#569cd6;">Take</span> <span style="color:#b5cea8;">1</span>)<span style="color:#b4b4b4;">.</span>SingleOrDefault<br/> <span style="color:#569cd6;">End</span> <span style="color:#569cd6;">Using</span><br/> <span style="color:#569cd6;">Return</span> results<br/><span style="color:#569cd6;">End</span> <span style="color:#569cd6;">Function</span></div>
<div style="font-family:Consolas;font-size:13px;color:gainsboro;background:#1e1e1e;padding:1.5em;"><span style="color:#569cd6;">Dim</span> isCached <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">Boolean</span> <span style="color:#b4b4b4;">=</span> <span style="color:#569cd6;">False</span><br/> <span style="color:#569cd6;">Dim</span> AccessTime <span style="color:#569cd6;">As</span> <span style="color:#569cd6;">Long</span><br/> <br/> <br/> <span style="color:#569cd6;">Dim</span> IPAddressResult <span style="color:#569cd6;">As</span> <span style="color:#4ec9b0;">IPAddressLookup</span> <span style="color:#b4b4b4;">=</span> IPAddressCache<span style="color:#b4b4b4;">.</span>GetObjectFromCache(<span style="color:#569cd6;">Of</span> <span style="color:#4ec9b0;">IPAddressLookup</span>)(ComboBox1<span style="color:#b4b4b4;">.</span>SelectedItem, <span style="color:#b5cea8;">10</span>, FetchfromDatabase, isCached, AccessTime)</div>
First lookup from database

First load from database (Single Record)
Subsequent lookup from Memory Cache

Load from memory cache (Single Record)
Benchmark – DB Load

5000 records loaded from database – 1 m 9s 73ms
Benchmark – From Cache

5000 records loaded from memorycache – 26 ms
Article Rating: 



(1 votes, average: 5.00 out of 5)
Loading...





