Generic MemoryCache revisited


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)

First load from database (Single Record)

Subsequent lookup from Memory Cache

 

Load from memory cache (Single Record)

Load from memory cache (Single Record)

Benchmark – DB Load

 

5000 records loaded from database

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

Benchmark – From Cache

 

5000 records loaded from memorycache - 26 ms

5000 records loaded from memorycache – 26 ms

Article Rating:
1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5.00 out of 5)
Loading...