• 我的缓存实例—工作记录


          缓存使用记录。

          在平时的开发中,我想缓存是极其重要的,他能很大程度上提高程序的效率,所以这里我记录下来我在盛大使用缓存的情况。

          1、这是缓存的原始类Webcache,其中有缓存的时间设置

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Configuration;
    using System.Collections;

    namespace Shanda.Utility
    {
        
    /// <summary>
        
    /// WebCache
        
    /// </summary>
        public static class WebCache
        {
            
    /// <summary>
            
    /// 一般配置Chche过期时间,秒钟计
            
    /// </summary>
            
    /// <value>The common cache time out.</value>
            public static int CommonCacheTimeOut
            {
                
    get
                {
                    
    if (_CommonCacheTimeOut == null)
                    {
                        
    string settings = ConfigurationManager.AppSettings["CommonCacheTimeOut"];
                        
    int timeOut;
                        
    if (!int.TryParse(settings, out timeOut))
                            timeOut 
    = 3600;   //默认1小时过期
                        _CommonCacheTimeOut = timeOut;
                    }

                    
    return _CommonCacheTimeOut.Value;
                }
            }
            
    private static int? _CommonCacheTimeOut;

            
    /// <summary>
            
    /// 查询配置Chche过期时间,秒钟计
            
    /// </summary>
            
    /// <value>The query cache time out.</value>
            public static int QueryCacheTimeOut
            {
                
    get
                {
                    
    if (_QueryCacheTimeOut == null)
                    {
                        
    string settings = ConfigurationManager.AppSettings["QueryCacheTimeOut"];
                        
    int timeOut;
                        
    if (!int.TryParse(settings, out timeOut))
                            timeOut 
    = 10;   //默认10秒钟过期
                        _QueryCacheTimeOut = timeOut;
                    }

                    
    return _QueryCacheTimeOut.Value;
                }
            }
            
    private static int? _QueryCacheTimeOut;

            
    /// <summary>
            
    /// Cache插入锁
            
    /// </summary>
            private static object CacheLocker = new object();

            
    /// <summary>
            
    /// Sql数据库缓存依赖项
            
    /// </summary>
            private static List<string> SqlCacheDependencyItems = new List<string>();

            
    /// <summary>
            
    /// 获取缓存的对象。当没有缓存的时候,自动创建对象并进行缓存。只支持引用类型的缓存。
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="key">The key.</param>
            
    /// <param name="timeOutSeconds">单位:秒</param>
            
    /// <param name="onCreateInstance">The on create instance.</param>
            
    /// <returns></returns>
            public static T GetCachedObject<T>(string key, int timeOutSeconds, Func<T> onCreateInstance)
            {
                
    return GetCachedObject<T>(key, null, timeOutSeconds, onCreateInstance);
            }

            
    /// <summary>
            
    /// 获取缓存的对象。当没有缓存的时候,自动创建对象并进行缓存。只支持引用类型的缓存。
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="key">The key.</param>
            
    /// <param name="onCreateInstance">The on create instance.</param>
            
    /// <returns></returns>
            public static T GetCachedObject<T>(string key, Func<T> onCreateInstance)
            {
                
    return GetCachedObject<T>(key, null, CommonCacheTimeOut, onCreateInstance);
            }

            
    /// <summary>
            
    /// 获取二级缓存的对象。当没有缓存的时候,自动创建对象并进行缓存。只支持引用类型的缓存。
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="key1">第一级缓存健</param>
            
    /// <param name="key2">第二级缓存健</param>
            
    /// <param name="onCreateInstance"></param>
            
    /// <returns></returns>
            public static T GetCachedObject<T>(string key1, string key2, Func<T> onCreateInstance) where T : classnew()
            {
                Dictionary
    <string, T> dictionary = GetCachedObject<Dictionary<string, T>>(key1, null, CommonCacheTimeOut,
                    
    delegate
                    {
                        
    return new Dictionary<string, T>();
                    });

                
    return Singleton<T>.GetInstance(dictionary, key2, onCreateInstance);
            }

            
    /// <summary>
            
    /// 获取缓存的对象。当没有缓存的时候,自动创建对象并进行缓存。只支持引用类型的缓存。
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="key"></param>
            
    /// <param name="databaseEntryName"></param>
            
    /// <param name="tableName"></param>
            
    /// <param name="onCreateInstance"></param>
            
    /// <returns></returns>
            public static T GetCachedObject<T>(string key, string databaseEntryName, string tableName, Func<T> onCreateInstance)
            {
                
    if (!SqlCacheDependencyItems.Contains(databaseEntryName))
                {
                    System.Web.Caching.SqlCacheDependencyAdmin.EnableNotifications(GetConnectionString(databaseEntryName));
                    SqlCacheDependencyItems.Add(databaseEntryName);
                    SqlCacheDependencyItems.Sort();
                }
                
    if (!SqlCacheDependencyItems.Contains(databaseEntryName + '#' + tableName))
                {
                    System.Web.Caching.SqlCacheDependencyAdmin.EnableTableForNotifications(GetConnectionString(databaseEntryName), tableName);
                    SqlCacheDependencyItems.Add(databaseEntryName 
    + '#' + tableName);
                    SqlCacheDependencyItems.Sort();
                }

                System.Web.Caching.SqlCacheDependency dependency 
    = new System.Web.Caching.SqlCacheDependency(databaseEntryName, tableName);
                
    return GetCachedObject<T>(key, dependency, 0, onCreateInstance);
            }

            
    /// <summary>
            
    /// 获取缓存的查询。当没有缓存的时候,自动创建对象并进行缓存。只支持引用类型的缓存。
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="key">The key.</param>
            
    /// <param name="onCreateInstance">The on create instance.</param>
            
    /// <returns></returns>
            public static T GetCachedQuery<T>(string key, Func<T> onCreateInstance)
            {
                
    return GetCachedObject<T>(key, null, QueryCacheTimeOut, onCreateInstance);
            }

            
    /// <summary>
            
    /// 移除缓存的对象
            
    /// </summary>
            
    /// <param name="key">The key.</param>
            
    /// <returns></returns>
            public static object Remove(string key)
            {
                
    //当前Cache对象
                System.Web.Caching.Cache webCache = System.Web.HttpRuntime.Cache;

                
    lock (CacheLocker)
                {
                    
    return webCache.Remove(key);
                }
            }

            
    /// <summary>
            
    /// 清除所有缓存
            
    /// </summary>
            public static void RemoveAll()
            {
                
    //当前Cache对象           
                var cache = System.Web.HttpRuntime.Cache;
                
    foreach (DictionaryEntry de in cache.Cast<DictionaryEntry>())
                {
                    
    string key = de.Key as string;
                    cache.Remove(key);
                }
            }

            
    /// <summary>
            
    /// 获取缓存的对象。当没有缓存的时候,自动创建对象并进行缓存。只支持引用类型的缓存。
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="key"></param>
            
    /// <param name="dependency"></param>
            
    /// <param name="timeOutSeconds">单位:秒</param>
            
    /// <param name="onCreateInstance"></param>
            
    /// <returns></returns>
            private static T GetCachedObject<T>(string key, System.Web.Caching.CacheDependency dependency, int timeOutSeconds, Func<T> onCreateInstance)
            {
                
    if (timeOutSeconds > 0 || dependency != null)
                {
                    
    //当前Cache对象
                    System.Web.Caching.Cache webCache = System.Web.HttpRuntime.Cache;
                    
    if (webCache == null)
                        
    return onCreateInstance();

                    
    //获取缓存的对象
                    T cachedObject = (T)webCache.Get(key);

                    
    if (cachedObject == null)
                    {
                        
    //加锁确保多线程安全
                        lock (CacheLocker)
                        {
                            cachedObject 
    = (T)webCache.Get(key);
                            
    if (cachedObject == null)
                            {
                                
    //创建新的对象
                                cachedObject = onCreateInstance();
                                
    //将创建的对象进行缓存
                                if (cachedObject != null)
                                    webCache.Insert(key, cachedObject, dependency, System.Web.Caching.Cache.NoAbsoluteExpiration, 
    new TimeSpan(00, timeOutSeconds));
                            }
                        }
                    }
                    
    return cachedObject;
                }
                
    else
                {
                    
    //不设置缓存,则创建新的对象
                    return onCreateInstance();
                }
            }

            
    /// <summary>
            
    /// 获取数据库连接字符串
            
    /// </summary>
            
    /// <param name="connectionEntryName"></param>
            
    /// <returns></returns>
            private static string GetConnectionString(string connectionEntryName)
            {
                
    string connString = System.Configuration.ConfigurationManager.AppSettings[connectionEntryName];
                
    if (!string.IsNullOrEmpty(connString))
                {
                    
    if (System.Configuration.ConfigurationManager.ConnectionStrings[connString] != null)
                        
    return System.Configuration.ConfigurationManager.ConnectionStrings[connString].ConnectionString;
                    
    else
                        
    return connString;
                }
                
    else
                {
                    
    return System.Configuration.ConfigurationManager.ConnectionStrings[connectionEntryName].ConnectionString;
                }
            }
        }
    }

            2、缓存的使用

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Shanda.Utility;
    using Shanda.CloudBar.DataAccess;
    using Shanda.CloudBar.Business.myHome;
    using Shanda.CloudBar.Business.Entitys;
    using Shanda.CloudBar.Business.JsonHelper;

    namespace Shanda.CloudBar.Business
    {
        
    public class CacheBusiness
        {
            
    /// <summary>
            
    /// CacheBusiness的单例
            
    /// </summary>
            public static CacheBusiness Instance { get { return Singleton<CacheBusiness>.GetInstance(); } }

            
    /// <summary>
            
    /// 获取变量配置
            
    /// </summary>
            
    /// <param name="variableType"></param>
            
    /// <returns></returns>
            public Dev_VariableSetting[] GetVariableSetting(string variableType)
            {
                
    return WebCache.GetCachedObject<Dev_VariableSetting[]>(typeof(Dev_VariableSetting).FullName + "#" + variableType.ToLower(),
                    
    delegate()
                    {
                        var ctx 
    = CloudBarDataContext.Create();
                        ctx.ObjectTrackingEnabled 
    = false;
                        
    return ctx.Dev_VariableSettings.Where(p => p.VariableType == variableType).OrderBy(p => p.DisplayIndex).ToArray();
                    });
            }

            
    /// <summary>
            
    /// 清除变量配置
            
    /// </summary>
            
    /// <param name="variableType"></param>
            public void RemoveVariableSetting(string variableType)
            {
                WebCache.Remove(
    typeof(Dev_VariableSetting).FullName + "#" + variableType.ToLower());
            }

            
    /// <summary>
            
    /// 获取缓存的数据表
            
    /// </summary>
            
    /// <typeparam name="TEntity"></typeparam>
            
    /// <returns></returns>
            public TEntity[] GetCachedTable<TEntity>() where TEntity : class
            {
                
    return WebCache.GetCachedObject<TEntity[]>(typeof(TEntity).FullName,
                    
    delegate()
                    {
                        var ctx 
    = CloudBarDataContext.Create();
                        ctx.ObjectTrackingEnabled 
    = false;
                        
    return ctx.GetTable<TEntity>().ToArray();
                    });
            }

            
    /// <summary>
            
    /// 清除的数据表
            
    /// </summary>
            
    /// <typeparam name="TEntity"></typeparam>
            public void RemoveCachedTable<TEntity>() where TEntity : class
            {
                WebCache.Remove(
    typeof(TEntity).FullName);
            }
            
    //获取个人微博
            public userStatus[] GetLoadUserStatuses(string variableType)
            {
                
    return WebCache.GetCachedObject<userStatus[]>(typeof(userStatus).FullName + "#" + variableType.ToLower(),
                    
    delegate()
                    {

                        List
    <userStatus> list = HomeBLL.LoadUserStatuses(variableType);
                        
    if (list == null)
                            
    return null;
                        userStatus[] userarr 
    = new userStatus[list.Count];
                        
    for (var i = 0; i < list.Count; i++)
                        {
                            userarr[i] 
    = list[i];
                        }
                        
    return userarr;
                    });
            }
       }
    }

             以上就是一点心得,记录下来以备今后查阅~~

    作者:Frederick Yang
    出处:http://www.cnblogs.com/yangtongnet/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    maven的pom.xml文件详细说明
    python 给视频添加马赛克
    cv2.VideoCapture 图像旋转问题
    三分钟理解知识蒸馏
    深度学习、机器学习常见概念及理解(持续更新)
    python用直方图规定化实现图像风格转换
    1分钟理解人体姿态估计与行为识别
    数据清洗要点
    3分钟理解NMS非极大值抑制
    python用pandas遍历csv文件
  • 原文地址:https://www.cnblogs.com/yangtongnet/p/2036211.html
Copyright © 2020-2023  润新知