public static void Run()
        {
            int totalCallbacks = 0;
            var cacheClient    = new CacheClient();

            // 502 chars = 1 kb
            string value = "asdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasas";

            int itemsToAdd = 1000;

            Console.WriteLine("***** BEGIN REMOVED ITEM CALLBACK TEST *****");
            Console.WriteLine();

            cacheClient.HostDisconnected += (sender, e) => { Console.WriteLine("*** Host disconnected"); };
            cacheClient.HostReconnected  += (sender, e) => { Console.WriteLine("*** Host reconnected"); };
            cacheClient.CacheItemExpired += (sender, e) => { Interlocked.Increment(ref totalCallbacks); Console.WriteLine(string.Format("Cache key expired: {1}, Total Removed: {1}", e.CacheKey, totalCallbacks)); };

            // Add items
            for (int i = 0; i < itemsToAdd; i++)
            {
                cacheClient.AddOrUpdate("test" + i, value, notifyRemoved: true);
            }

            Console.WriteLine("***** " + itemsToAdd + " ITEMS ADDED *****");
            Console.WriteLine("***** BEGIN REMOVING " + itemsToAdd + " ITEMS AFTER 2000 MS PAUSE *****");
            Thread.Sleep(2000);

            // Remove items
            for (int i = 0; i < itemsToAdd; i++)
            {
                cacheClient.Remove("test" + i);
            }

            Console.ReadKey();
        }
示例#2
0
        public static void Run()
        {
            var cacheClient = new CacheClient();

            // 502 chars = 1 kb
            string value = "asdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasas";

            Console.WriteLine("***** BEGIN INFINITE ADD TEST (WILL NEVER END) *****");
            Console.WriteLine();

            cacheClient.HostDisconnected += (sender, e) => { Console.WriteLine("*** Host disconnected"); };
            cacheClient.HostReconnected += (sender, e) => { Console.WriteLine("*** Host reconnected"); };

            // Add test1 to test1000
            int i = 1;
            while (true)
            {
                cacheClient.AddOrUpdate("test" + i, value);
                i++;
                if (i == 1001)
                {
                    i = 1;
                }
            }
        }
示例#3
0
        public static void Run()
        {
            var cacheClient = new CacheClient();

            // 502 chars = 1 kb
            string value = "asdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasas";

            int itemsToAdd = 1000;

            Console.WriteLine("***** BEGIN INFINITE ADD " + itemsToAdd + " ITEMS TEST (WILL NEVER END) *****");
            Console.WriteLine();

            cacheClient.HostDisconnected += (sender, e) => { Console.WriteLine("*** Host disconnected"); };
            cacheClient.HostReconnected  += (sender, e) => { Console.WriteLine("*** Host reconnected"); };

            // Add items
            int i = 0;

            while (true)
            {
                cacheClient.AddOrUpdate("test" + i, value);
                i++;
                if (i == itemsToAdd)
                {
                    i = 0;
                }
            }
        }
示例#4
0
        public static void Run()
        {
            var cacheClient = new CacheClient();

            // 502 chars = ~1 kb
            string value = "asdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasas";

            int itemsToAdd = 1000;

            Console.WriteLine("***** BEGIN INFINITE ADD " + itemsToAdd + " 1 KB STRING OBJECTS TEST (WILL NEVER END) *****");
            Console.WriteLine();

            cacheClient.HostDisconnected += (sender, e) => { Console.WriteLine("*** Host disconnected"); };
            cacheClient.HostReconnected  += (sender, e) => { Console.WriteLine("*** Host reconnected"); };

            // Add items
            var cts = new CancellationTokenSource();

            Task.Factory.StartNew(() => {
                int i = 0;
                while (!cts.Token.IsCancellationRequested)
                {
                    try
                    {
                        cacheClient.AddOrUpdate(string.Intern("test" + i), value);
                    }
                    catch (NoCacheHostsAvailableException)
                    {
                        Thread.Sleep(1000);
                        continue;
                    }

                    i = ++i % itemsToAdd;

                    if (i == 0)
                    {
                        Thread.Sleep(1);
                    }
                }
            }, cts.Token);

            var key = Console.ReadKey();

            // Graceful shutdown option
            if (key.KeyChar == 'q')
            {
                cts.Cancel();
                cacheClient.Shutdown();
            }
        }
示例#5
0
        public DacheCacheProvider()
        {
            List <CacheEntry> relationships = null;

            if (!_client.TryGet <List <CacheEntry> >(_entitySetRelationsKey, out relationships))
            {
                relationships = new List <CacheEntry>();
                _client.AddOrUpdate(_entitySetRelationsKey, relationships);
            }
        }
示例#6
0
        public virtual void Set(string key, object data, DateTimeOffset?absoluteExpiration = null)
        {
            if (string.IsNullOrEmpty(key))
            {
                throw new ArgumentNullException("key");
            }
            if (data == null)
            {
                return;
            }
            if (IsSet(key))
            {
                Remove(key);
            }

            _cache.AddOrUpdate(key, data, absoluteExpiration: absoluteExpiration);
        }
示例#7
0
        public static void Run()
        {
            var cacheClient = new CacheClient();

            // 502 chars = ~1 kb
            string value = "asdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasas";

            int itemsToAdd = 1000;

            Console.WriteLine("***** BEGIN INFINITE ADD " + itemsToAdd + " 1 KB STRING OBJECTS TEST (WILL NEVER END) *****");
            Console.WriteLine();

            cacheClient.HostDisconnected += (sender, e) => { Console.WriteLine("*** Host disconnected"); };
            cacheClient.HostReconnected += (sender, e) => { Console.WriteLine("*** Host reconnected"); };

            // Add items
            Task.Factory.StartNew(() => {
                int i = 0;
                while (true)
                {
                    try
                    {
                        cacheClient.AddOrUpdate("test" + i, value);
                    }
                    catch (NoCacheHostsAvailableException)
                    {
                        Thread.Sleep(1000);
                        continue;
                    }

                    i++;
                    if (i == itemsToAdd)
                    {
                        i = 0;
                    }
                }
            });

            var key = Console.ReadKey();
            // Graceful shutdown option
            if (key.KeyChar == 'q')
            {
                cacheClient.Shutdown();
            }
        }
        public static void Run()
        {
            int totalCallbacks = 0;
            var cacheClient = new CacheClient();

            // 502 chars = ~1 kb
            string value = "asdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasas";

            int itemsToAdd = 10;
            var pause = 2000;

            Console.WriteLine("***** BEGIN REMOVED ITEM CALLBACK TEST *****");
            Console.WriteLine();

            cacheClient.HostDisconnected += (sender, e) => { Console.WriteLine("*** Host disconnected"); };
            cacheClient.HostReconnected += (sender, e) => { Console.WriteLine("*** Host reconnected"); };
            cacheClient.CacheItemExpired += (sender, e) => { Interlocked.Increment(ref totalCallbacks); Console.WriteLine(string.Format("Cache key expired: {0}, Total Removed: {1}", e.CacheKey, totalCallbacks)); };

            // Add items
            for (int i = 1; i <= itemsToAdd; i++)
            {
                cacheClient.AddOrUpdate("test" + i, value, notifyRemoved: true);
            }

            Console.WriteLine("***** " + itemsToAdd + " ITEMS ADDED *****");
            Console.WriteLine("***** BEGIN REMOVING " + itemsToAdd + " ITEMS AFTER " + pause + " MS PAUSE *****");
            Thread.Sleep(pause);

            // Remove items
            for (int i = 1; i <= itemsToAdd; i++)
            {
                cacheClient.Remove("test" + i);
            }

            var key = Console.ReadKey();
            // Graceful shutdown option
            if (key.KeyChar == 'q')
            {
                cacheClient.Shutdown();
            }
        }
示例#9
0
 /// <summary>
 /// Adds or updates an item in the cache.
 /// </summary>
 /// <param name="key">The cache key.</param>
 /// <param name="value">The object to add to the cache.</param>
 public void AddOrUpdate(string key, object value)
 {
     _cacheClient.AddOrUpdate(key, value);
 }
示例#10
0
        public static void Run()
        {
            var cacheClient = new CacheClient();

            var stopwatch = new Stopwatch();

            var overallStopwatch = new Stopwatch();

            overallStopwatch.Start();

            // 502 chars = ~1 kb
            const string value = "asdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasas";

            CustomObject myObject = new CustomObject();

            Console.WriteLine("***** BEGIN ADD 10000 TESTS *****");
            Console.WriteLine();

            #region Regular Add 10000 strings
            stopwatch.Start();
            for (int i = 1; i <= 10000; i++)
            {
                cacheClient.AddOrUpdate("test" + i, value);
            }
            stopwatch.Stop();

            Console.WriteLine("Add time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            #region Bulk Add 10000 strings
            var list = new List <KeyValuePair <string, object> >(10000);
            for (int i = 1; i <= 10000; i++)
            {
                list.Add(new KeyValuePair <string, object>("bulktest" + i, value));
            }

            stopwatch.Restart();
            cacheClient.AddOrUpdate(list);
            stopwatch.Stop();

            Console.WriteLine("Add Many time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            #region Tagged Add 10000 strings
            stopwatch.Restart();
            for (int i = 1; i <= 10000; i++)
            {
                cacheClient.AddOrUpdate("tagtest" + i, value, tagName: "demotag");
            }
            stopwatch.Stop();

            Console.WriteLine("Add Tagged time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            Console.WriteLine();
            Console.WriteLine("***** BEGIN SINGLE KEY GET TEST *****");
            Console.WriteLine();

            #region Regular Get 1 string proof
            string resultString = null;
            stopwatch.Restart();
            var result = cacheClient.TryGet("test5", out resultString) && string.Equals(resultString, value);
            stopwatch.Stop();

            Console.WriteLine("Get cache key \"test5\": time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            Console.WriteLine("Get cache key \"test5\": successful = " + result);
            Console.WriteLine("Get cache key \"test5\": result length: " + (resultString == null ? 0 : resultString.Length) + ", original length: " + value.Length);
            if (resultString != null)
            {
                var origHash   = value.GetHashCode();
                var resultHash = resultString.GetHashCode();
                Console.WriteLine("Original String Hash Code: " + origHash + ", Result String Hash Code: " + resultHash);
            }
            #endregion

            Console.WriteLine();
            Console.WriteLine("***** BEGIN GET 10000 TESTS *****");
            Console.WriteLine();

            string otherValue = null;

            #region Regular Get 10000 strings
            stopwatch.Restart();
            var failedKeyCount = 0;
            for (int i = 1; i <= 10000; i++)
            {
                if (!cacheClient.TryGet("test" + i, out otherValue))
                {
                    failedKeyCount++;
                }
            }
            stopwatch.Stop();

            Console.WriteLine("Failed Key Count: " + failedKeyCount + (failedKeyCount > 0 ? ", NOTE: network is probably slow" : ""));

            Console.WriteLine("Get time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            #region Bulk Get 10000 strings
            var list2 = new List <string>(10000);
            for (int i = 1; i <= 10000; i++)
            {
                list2.Add("bulktest" + i);
            }

            stopwatch.Restart();
            var getManyResults = cacheClient.Get <string>(list2);
            stopwatch.Stop();

            Console.WriteLine("Get Many time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            var getManyResultsCount = getManyResults != null ? getManyResults.Count : 0;
            Console.WriteLine("Get Many object count: " + getManyResultsCount + (getManyResultsCount < 10000 ? ", NOTE: network is probably slow" : ""));
            #endregion

            #region Tagged Get 10000 strings
            stopwatch.Restart();
            var getTaggedResults = cacheClient.GetTagged <string>("demotag");
            stopwatch.Stop();

            Console.WriteLine("Get Tagged time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            getManyResultsCount = getManyResults != null ? getManyResults.Count : 0;
            Console.WriteLine("Get Tagged object count: " + getManyResultsCount + (getManyResultsCount < 10000 ? ", NOTE: network is probably slow" : ""));
            #endregion

            Console.WriteLine();
            Console.WriteLine("***** BEGIN REMOVE 10000 TESTS *****");
            Console.WriteLine();

            #region Regular Remove 10000 strings
            stopwatch.Restart();
            for (int i = 1; i <= 10000; i++)
            {
                cacheClient.Remove("test" + i);
            }
            stopwatch.Stop();

            Console.WriteLine("Remove time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            #region Bulk Remove 10000 strings
            stopwatch.Restart();
            cacheClient.Remove(list2);
            stopwatch.Stop();

            Console.WriteLine("Remove Many time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            #region Tagged Remove 10000 strings
            stopwatch.Restart();
            cacheClient.RemoveTagged("demotag");
            stopwatch.Stop();

            Console.WriteLine("Remove Tagged time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            Console.WriteLine();
            Console.WriteLine("***** BEGIN ABSOLUTE EXPIRATION TEST *****");
            Console.WriteLine();

            #region Regular Add 10000 strings with absolute expiration
            var absoluteExpiration = DateTime.Now.AddMinutes(1);
            stopwatch.Restart();
            for (int i = 1; i <= 10000; i++)
            {
                cacheClient.AddOrUpdate("testabsolute" + i, value, absoluteExpiration: absoluteExpiration);
            }
            stopwatch.Stop();

            Console.WriteLine("Add absolute expiration time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            Console.WriteLine();
            Console.WriteLine("***** BEGIN 10000 COMPLEX OBJECT ADD TEST *****");
            Console.WriteLine();

            #region Regular Add 10000 complex objects with sliding expiration
            var slidingExpiration = new TimeSpan(0, 2, 0);
            stopwatch.Restart();
            for (int i = 1; i <= 10000; i++)
            {
                cacheClient.AddOrUpdate("testabsolutecomplex" + i, myObject, slidingExpiration: slidingExpiration);
            }
            stopwatch.Stop();

            Console.WriteLine("Add complex object time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            Console.WriteLine();
            Console.WriteLine("***** BEGIN 10000 COMPLEX OBJECT GET TEST *****");
            Console.WriteLine();

            #region Regular Get 10000 complex objects with sliding expiration
            stopwatch.Restart();
            failedKeyCount = 0;
            for (int i = 1; i <= 10000; i++)
            {
                if (!cacheClient.TryGet("testabsolutecomplex" + i, out myObject))
                {
                    failedKeyCount++;
                }
            }
            stopwatch.Stop();

            Console.WriteLine("Failed Key Count: " + failedKeyCount + (failedKeyCount > 0 ? ", NOTE: network is probably slow" : ""));

            Console.WriteLine("Get complex object time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            overallStopwatch.Stop();

            Console.WriteLine();
            Console.WriteLine("***** END TESTS *****");
            Console.WriteLine();

            Console.WriteLine("Total time taken: " + overallStopwatch.ElapsedMilliseconds + " ms, " + overallStopwatch.ElapsedTicks + " ticks");

            var key = Console.ReadKey();
            // Graceful shutdown option
            if (key.KeyChar == 'q')
            {
                cacheClient.Shutdown();
            }
        }
示例#11
0
        public static void Run()
        {
            var cacheClient = new CacheClient();

            var stopwatch = new Stopwatch();

            var overallStopwatch = new Stopwatch();
            overallStopwatch.Start();

            // 502 chars = ~1 kb
            const string value = "asdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasasdfasdfasas";

            CustomObject myObject = new CustomObject();

            Console.WriteLine("***** BEGIN ADD 10000 TESTS *****");
            Console.WriteLine();

            #region Regular Add 10000 strings
            stopwatch.Start();
            for (int i = 1; i <= 10000; i++)
            {
                cacheClient.AddOrUpdate("test" + i, value);
            }
            stopwatch.Stop();

            Console.WriteLine("Add time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            #region Bulk Add 10000 strings
            var list = new List<KeyValuePair<string, object>>(10000);
            for (int i = 1; i <= 10000; i++)
            {
                list.Add(new KeyValuePair<string, object>("bulktest" + i, value));
            }

            stopwatch.Restart();
            cacheClient.AddOrUpdate(list);
            stopwatch.Stop();

            Console.WriteLine("Add Many time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            #region Tagged Add 10000 strings
            stopwatch.Restart();
            for (int i = 1; i <= 10000; i++)
            {
                cacheClient.AddOrUpdate("tagtest" + i, value, tagName: "demotag");
            }
            stopwatch.Stop();

            Console.WriteLine("Add Tagged time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            Console.WriteLine();
            Console.WriteLine("***** BEGIN SINGLE KEY GET TEST *****");
            Console.WriteLine();

            #region Regular Get 1 string proof
            string resultString = null;
            stopwatch.Restart();
            var result = cacheClient.TryGet("test5", out resultString) && string.Equals(resultString, value);
            stopwatch.Stop();

            Console.WriteLine("Get cache key \"test5\": time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            Console.WriteLine("Get cache key \"test5\": successful = " + result);
            Console.WriteLine("Get cache key \"test5\": result length: " + (resultString == null ? 0 : resultString.Length) + ", original length: " + value.Length);
            if (resultString != null)
            {
                var origHash = value.GetHashCode();
                var resultHash = resultString.GetHashCode();
                Console.WriteLine("Original String Hash Code: " + origHash + ", Result String Hash Code: " + resultHash);
            }
            #endregion

            Console.WriteLine();
            Console.WriteLine("***** BEGIN GET 10000 TESTS *****");
            Console.WriteLine();

            string otherValue = null;

            #region Regular Get 10000 strings
            stopwatch.Restart();
            for (int i = 1; i <= 10000; i++)
            {
                if (!cacheClient.TryGet("test" + i, out otherValue))
                {
                    Console.WriteLine("Get failed for cache key: " + "test" + i);
                }
            }
            stopwatch.Stop();

            Console.WriteLine("Get time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            #region Bulk Get 10000 strings
            var list2 = new List<string>(10000);
            for (int i = 1; i <= 10000; i++)
            {
                list2.Add("bulktest" + i);
            }

            stopwatch.Restart();
            var getManyResults = cacheClient.Get<string>(list2);
            stopwatch.Stop();

            Console.WriteLine("Get Many time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            Console.WriteLine("Get Many object count: " + getManyResults.Count);
            #endregion

            #region Tagged Get 10000 strings
            stopwatch.Restart();
            var getTaggedResults = cacheClient.GetTagged<string>("demotag");
            stopwatch.Stop();

            Console.WriteLine("Get Tagged time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            Console.WriteLine("Get Tagged object count: " + getManyResults.Count);
            #endregion

            Console.WriteLine();
            Console.WriteLine("***** BEGIN REMOVE 10000 TESTS *****");
            Console.WriteLine();

            #region Regular Remove 10000 strings
            stopwatch.Restart();
            for (int i = 1; i <= 10000; i++)
            {
                cacheClient.Remove("test" + i);
            }
            stopwatch.Stop();

            Console.WriteLine("Remove time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            #region Bulk Remove 10000 strings
            stopwatch.Restart();
            cacheClient.Remove(list2);
            stopwatch.Stop();

            Console.WriteLine("Remove Many time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            #region Tagged Remove 10000 strings
            stopwatch.Restart();
            cacheClient.RemoveTagged("demotag");
            stopwatch.Stop();

            Console.WriteLine("Remove Tagged time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            Console.WriteLine();
            Console.WriteLine("***** BEGIN ABSOLUTE EXPIRATION TEST *****");
            Console.WriteLine();

            #region Regular Add 10000 strings with absolute expiration
            var absoluteExpiration = DateTime.Now.AddMinutes(1);
            stopwatch.Restart();
            for (int i = 1; i <= 10000; i++)
            {
                cacheClient.AddOrUpdate("testabsolute" + i, value, absoluteExpiration: absoluteExpiration);
            }
            stopwatch.Stop();

            Console.WriteLine("Add absolute expiration time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            Console.WriteLine();
            Console.WriteLine("***** BEGIN 10000 COMPLEX OBJECT ADD TEST *****");
            Console.WriteLine();

            #region Regular Add 10000 complex objects with sliding expiration
            var slidingExpiration = new TimeSpan(0, 2, 0);
            stopwatch.Restart();
            for (int i = 1; i <= 10000; i++)
            {
                cacheClient.AddOrUpdate("testabsolutecomplex" + i, myObject, slidingExpiration: slidingExpiration);
            }
            stopwatch.Stop();

            Console.WriteLine("Add complex object time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            Console.WriteLine();
            Console.WriteLine("***** BEGIN 10000 COMPLEX OBJECT GET TEST *****");
            Console.WriteLine();

            #region Regular Get 10000 complex objects with sliding expiration
            stopwatch.Restart();
            for (int i = 1; i <= 10000; i++)
            {
                cacheClient.TryGet("testabsolutecomplex" + i, out myObject);
            }
            stopwatch.Stop();

            Console.WriteLine("Get complex object time taken: " + stopwatch.ElapsedMilliseconds + " ms, " + stopwatch.ElapsedTicks + " ticks");
            #endregion

            overallStopwatch.Stop();

            Console.WriteLine();
            Console.WriteLine("***** END TESTS *****");
            Console.WriteLine();

            Console.WriteLine("Total time taken: " + overallStopwatch.ElapsedMilliseconds + " ms, " + overallStopwatch.ElapsedTicks + " ticks");

            var key = Console.ReadKey();
            // Graceful shutdown option
            if (key.KeyChar == 'q')
            {
                cacheClient.Shutdown();
            }
        }