• C# 缓存的使用


    缓存的实现

    我们不是做第三方比如Redis等的缓存实现,而是根据实际情况,基于C#上做一些环境变量的保存,方便项目使用。

    1、系统全局变量

    很多时候,在系统运行开始,需要对系统的运行参数进行保存,以便供全局使用。

    代码如下:

    复制代码
     public class PFTCacheObject
        {
            /// <summary>
            /// 字典
            /// </summary>
            private static Dictionary<string, object> _dataDic = new Dictionary<string, object>();
    
    
            /// <summary>
            /// 定义一个静态变量来保存类的实例
            /// </summary>
            private static PFTCacheObject _session;
    
            /// <summary>
            /// 定义一个标识确保线程同步
            /// </summary>
            private static readonly object _locker = new object();
    
    
            /// <summary>
            /// 单例
            /// </summary>
            /// <returns>返回类型为Session</returns>
            public static PFTCacheObject Instance
            {
                get
                {
                    if (_session == null)
                    {
                        lock (_locker)
                        {
                            if (_session == null)// 如果类的实例不存在则创建,否则直接返回
                            {
                                _session = new PFTCacheObject();
                            }
                        }
                    }
                    return _session;
                }
            }
    
            #region Remove 移除
    
            /// <summary>
            /// 删除成员
            /// </summary>
            /// <param name="name"></param>
            public void Remove(string name)
            {
                _dataDic.Remove(name);
            }
    
            /// <summary>
            /// 删除全部成员
            /// </summary>
            public void RemoveAll()
            {
                _dataDic.Clear();
            }
            #endregion
    
            #region 本类的索引器
    
            /// <summary>
            /// 本类的索引器
            /// </summary>
            /// <returns>返回Object成员</returns>
            public Object this[string index]
            {
                get
                {
                    if (_dataDic.ContainsKey(index))
                    {
                        Object obj = (Object)_dataDic[index];
                        return obj;
                    }
                    return null;
                }
                set
                {
                    if (_dataDic.ContainsKey(index))
                    {
                        _dataDic.Remove(index);
                    }
                    _dataDic.Add(index, value);
                }
            }
            #endregion
    
    
        }
    复制代码

    这里使用一个静态变量的Dictionary来进行保存,所有项目均可以直接获取。

    2、异步的数据缓存

    在web上面,很多时候都是使用的HttpContext.Current.Items进行数据缓存,在.Net Framework框架上使用CallContext.LogicalSetData。在.Net Standard 上面CallContext.LogicalSetData已经不能使用了,替换他的方法是AsyncLocal。因为我们现在都是使用的是.Net Standard,并且我们项目并不仅仅是web,所以这里我们就只用使用AsyncLocal实现。

    代码如下

    复制代码
    public class PFTCallContext
        {
    
            #region  共享数据库连接
    
            private static AsyncLocal<object> _asyncLocalConnectionOject = new AsyncLocal<object>();
    
            /// <summary>
            /// 设置共享数据库连接
            /// </summary>
            /// <param name="obj"></param>
            public static void SetConnectionOject(object obj)
            {
                _asyncLocalConnectionOject.Value = obj;
            }
    
            /// <summary>
            /// 获取共享数据库连接
            /// </summary>
            /// <returns></returns>
            public static object GetConnectionOject()
            {
                return _asyncLocalConnectionOject.Value;
            }
    
            /// <summary>
            /// 清空共享数据库连接
            /// </summary>
            public static void ClearConnectionOject()
            {
                _asyncLocalConnectionOject.Value = null;
            }
    
            #endregion
    
    
    
        }
    复制代码

    这里我们就先定义一个当前数据库连接对象的缓存。如果还需要其他的定义,你可以直接实现。

    3、.Net Core 的MemoryCache

    本来这块想使用.Net Framework框架中的cache的,但是.Net Core才是未来的大势,而且.Net Framework的cache已经有很多的实现方法了,所以这里我就直接用.Net Core 的MemoryCache。.Net Core蜗牛也在学习中,相关的API也在不断的研究,如果有问题,请大家帮忙纠正。

    复制代码
    public static class PFTCache
        {
            public readonly static IMemoryCache _memoryCache;
    
            static PFTCache()
            {
                _memoryCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));
            }
    
            #region 常规缓存
            /// <summary>
            /// 获取缓存的值
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public static Object GetCache(string key)
            {
                return _memoryCache.Get(key);
            }
            /// <summary>
            /// 移除缓存
            /// </summary>
            /// <param name="key"></param>
            public static void Remove(string key)
            {
                _memoryCache.Remove(key);
            }
            /// <summary>
            /// 设置缓存
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            public static void SetCache(string key, Object value)
            {
                _memoryCache.GetOrCreate(key, entry =>
                {
                    return value;
                });
            }
            /// <summary>
            /// 设置缓存(固定时间过期)
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            /// <param name="absoluteExpiration"></param>
            public static void SetCacheAbsolute(string key, Object value, int absoluteExpiration)
            {
                _memoryCache.GetOrCreate(key, entry =>
                {
    
                    entry.SetAbsoluteExpiration(TimeSpan.FromSeconds(absoluteExpiration));
                    return value;
                });
            }
            /// <summary>
            /// 设置缓存(滚动时间过期)
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            /// <param name="slidingExpiration"></param>
            public static void SetCacheSliding(string key, Object value, int slidingExpiration)
            {
                _memoryCache.GetOrCreate(key, entry =>
                {
    
                    entry.SetSlidingExpiration(TimeSpan.FromSeconds(slidingExpiration));
                    return value;
                });
            }
    
            #endregion
    
            #region 文件依赖缓存
            /// <summary>
            /// 文件依赖缓存
            /// </summary>
            /// <param name="key"></param>
            /// <param name="fullName"></param>
            /// <returns></returns>
            public static string DependentCacheFile(string key, string fullName)
            {
                var basePath = PFTFile.GetDirectoryName(fullName);
                var fileName = PFTFile.GetFileName(fullName);
                var fileProvider = new PhysicalFileProvider(basePath);
                return _memoryCache.GetOrCreate(key, entry =>
                {
                    entry.AddExpirationToken(fileProvider.Watch(fileName));
                    return PFTFile.IsExistFile(fullName) ? PFTFile.ReadFile(fullName) : string.Empty;
                });
            }
            #endregion
    
        }
    复制代码

    好了,关于缓存这块蜗牛就先说到这里。

    出处:https://www.cnblogs.com/snailblog/p/11570094.html

    您的资助是我最大的动力!
    金额随意,欢迎来赏!
    款后有任何问题请给我留言。

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我。(●'◡'●)

    如果你觉得本篇文章对你有所帮助,请给予我更多的鼓励,求打             付款后有任何问题请给我留言!!!

    因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【Jack_孟】!

  • 相关阅读:
    MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐 级之间的区别?
    NOW()和 CURRENT_DATE()有什么区别?
    什么是非标准字符串类型?
    列的字符串类型可以是什么?
    实践中如何优化 MySQL ?
    可以使用多少列创建索引?
    数据库中的事务是什么?
    锁的优化策略?
    SQL 注入漏洞产生的原因?如何防止?
    强调事项段、其他事项段、关键审计事项
  • 原文地址:https://www.cnblogs.com/mq0036/p/15089595.html
Copyright © 2020-2023  润新知