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 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 5 (1 votes, average: 5.00 out of 5)
You need to be a registered member to rate this.
Loading...