Dictionary实现的缓存类Cache

最近用到缓存,所以就自己动手写了一个简单的Cache.

命名空间JChen.Ext有这个方法:

        /// <summary>
        /// 是否为NULL或者空
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static bool IsNullOrEmpty(this string str)
        {
            if (str == null || str.Trim() == "")
            {
                return true;
            }

            return false;
        }

IsNullOrEmpty

using System;
using System.Collections.Generic;
using JChen.Ext;

namespace JChen.Caching
{
    /// <summary>
    /// 缓存
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class Cache<T>
    {
        /// <summary>
        /// 锁
        /// </summary>
        private static object lockObj = new object();

        /// <summary>
        /// 默认Cache
        /// </summary>
        private static Cache<T> _default = new Cache<T>(true);

        /// <summary>
        /// 每个实例的缓存
        /// </summary>
        private Dictionary<string, T> instanceCache = null;

        /// <summary>
        /// 默认的缓存
        /// </summary>
        private static Dictionary<string, T> defaultCache = new Dictionary<string, T>();

        /// <summary>
        /// 缓存
        /// </summary>
        public Cache()
        {
            instanceCache = new Dictionary<string, T>();
        }

        /// <summary>
        /// 私有构造,区别于Cache(),只是为了实例化_default;
        /// 对于默认的缓存,不需要且不能实例化instanceCache
        /// </summary>
        /// <param name="isDefualt"></param>
        private Cache(bool isDefualt)
        {
        }

        /// <summary>
        /// 相对于T的默认缓存实例
        /// 特别注意:对于相同的类型T,Default是同一个对象
        /// </summary>
        public static Cache<T> Default { get { return _default; } }

        /// <summary>
        /// 设置或获取缓存数据
        /// </summary>
        /// <param name="key">键,不能为空</param>
        /// <returns>如果键为空,返回值为类型T的默认值</returns>
        public T this[string key]
        {
            get
            {
                if (instanceCache != null)
                {
                    if (instanceCache.ContainsKey(key))
                    {
                        return instanceCache[key];
                    }
                }
                else
                {
                    if (defaultCache.ContainsKey(key))
                    {
                        return defaultCache[key];
                    }
                }

                return default(T);
            }

            set
            {
                if (key.IsNullOrEmpty())
                {
                    throw new ArgumentNullException("key", "键不能为空!");
                }

                if (instanceCache != null)
                {
                    if (instanceCache.ContainsKey(key))
                    {
                        instanceCache[key] = value;
                    }
                    else
                    {
                        lock (lockObj)
                        {
                            instanceCache.Add(key, value);
                        }
                    }
                }
                else
                {
                    if (defaultCache.ContainsKey(key))
                    {
                        defaultCache[key] = value;
                    }
                    else
                    {
                        lock (lockObj)
                        {
                            defaultCache.Add(key, value);
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 缓存数量
        /// </summary>
        public int Count
        {
            get
            {
                if (instanceCache != null)
                {
                    return instanceCache.Count;
                }
                else
                {
                    return defaultCache.Count;
                }
            }
        }

        /// <summary>
        /// 移除指定键的缓存值
        /// </summary>
        /// <param name="key">键,不能为空</param>
        /// <returns></returns>
        public bool Remove(string key)
        {
            if (key.IsNullOrEmpty())
            {
                return false;
            }

            if (instanceCache != null)
            {
                if (instanceCache.ContainsKey(key))
                {
                    return instanceCache.Remove(key);
                }
            }
            else
            {
                if (defaultCache.ContainsKey(key))
                {
                    return defaultCache.Remove(key);
                }
            }

            return false;
        }

        /// <summary>
        /// 清空缓存
        /// </summary>
        public void Clear()
        {
            if (instanceCache != null)
            {
                instanceCache.Clear();
            }
            else
            {
                defaultCache.Clear();
            }
        }
    }
}

Cache

时间: 2024-08-24 20:57:32

Dictionary实现的缓存类Cache的相关文章

一个不错的PHP文件页面缓存类

在php中缓存分类数据库缓存,文件缓存和内存缓存,下面我来给各位同学详细介绍PHP文件缓存类实现代码,有需要了解的朋友可参考. 页面缓存类  代码如下 复制代码 <?php    /*    * 缓存类    cache   * 作    者:多菜鸟   * 实    例:   */   /*include( "cache.php" );       $cache = new cache(30);   $cache->cacheCheck();       echo dat

ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供,不过该内存类我看了一下,并没有支持文件的缓存依赖. 因此,在此前提下,预计.NET Core明年出来2.0版本时,可能也没支持文件的缓存依赖,因此,有必要提前准备实现. 在写此文前,我扫了一下园子里关于自定义缓存类的相关文章. 发现很多自定义的缓存类文章都简单停留在对字典的增删改查. 因此,决定补充

ASP.NET HttpRuntime.Cache缓存类使用总结

1.高性能文件缓存key-value存储—Redis 2.高性能文件缓存key-value存储—Memcached 1.前言 a.在Web开发中,我们经常能够使用到缓存对象(Cache),在ASP.NET中提供了两种缓存对象,HttpContext.Current.Cache和HttpRuntime.Cache,那么他们有什么区别呢?下面简单描述一下: (1):HttpContext.Current.Cache 为当前Http请求获取Cache对象,通俗来说就是由于此缓存封装在了HttpCont

转 一个弱引用缓存类

在优化性能时,经常会使用到缓存类..NET Framework在System.Web.dll中,提供了一个Cache类.它在Web开发中非常有用,但是如果是WinForm开发,它就用不上了.  在.NET中,由于垃圾回收机制的存在,使得开发人员不用关心内存的分配.不用的对象GC会自动当成垃圾回收.如果能将这些垃圾废品利用的话,很容易节约开销,提升性能.下面提供一个WeakReferenceCachePool<TKey, TItem>类: using System;using System.Co

第十一篇 自定义一个缓存类(甚用~)

1 //自定义缓存类 2 public class CacheHelper<T> where T:class 3 { 4 private class Entity 5 { 6 public T Value{get;set;} 7 public DateTime Expiretime { get; set; } 8 } 9 private static readonly Dictionary<string, Entity> Dic=new Dictionary<string,E

缓存类

1 /// <summary> 2 /// .net自带缓存类 3 /// </summary> 4 public class Cache : Interface.ICache 5 { 6 public static object LockObject = new object(); 7 private System.Web.Caching.Cache cache = HttpContext.Current.Cache; 8 /// <summary> 9 /// 插入

Java缓存类的实际应用场景

不要着迷于技术,应把注意力放到问题上. 一个普通的后台管理系统,一定会有参数配置.参数配置数据表和其他的数据表是不同的,它的操作基本都是查的操作.参数配置的这些数据信息是贯穿在整个项目中,那么把他们放到哪里可以方便类或者jsp的调用? spring的配置文件有支持缓存类,它的配置如下: <!-- 启用用户的缓存功能 --> <bean id="userCache" class="org.springframework.security.core.userde

【cocos2d-x游戏开发】cocos中的三种缓存类

Cocos中有三种缓存类: (1):纹理缓存:TextureCache (2):精灵帧缓存:SpriteFrameCache (3):动画缓存:AnimationCache 游戏最要重要的就是流畅度,如果我们的游戏经常因为加载资源出现卡顿的情况,那么这个游戏就没有很好地游戏体验.所以,为了解决这个问题,缓存就应运而生了. 缓存的目的就是:现将所需资源加载到内存中,之后再次使用该资源的时候,就可以直接从内存中读出,而不需要重新加载,从而减少了CPU和GPU的内存占用. TextureCache 在

cocos2dx[3.2](22)——三种缓存类

[唠叨] Cocos引擎主要有三种缓存类: > 纹理缓存     : TextureCache > 精灵帧缓存 : SpriteFrameCache > 动画缓存     : AnimationCache 缓存的目的就是:先将所需资源(如纹理图片)加载到内存中,之后再次使用该资源的时候,就可以直接从内存中取出,而不需要重新加载.从而减少了CPU和GPU的内存占用. 本文对参考文献的内容进行了整理与整合,并加入一些自己的观点. [致谢] http://www.cocoachina.com/