支持高并发高性能 通用缓存容器 浓缩的精华 代码优化版

—————————————————————————————————————————————————————————————————————————————————————————————————————————————————

  1 public static class CustomCache
  2     {
  3         private static List<ConcurrentDictionary<string, DataModel>> cacheContainer = null;//缓存容器
  4
  5         private static readonly int cpuCount = Environment.ProcessorCount;//获取CPU个数
  6
  7         private static readonly int intervalTime = 900;//间隔时间 秒
  8
  9         private static readonly int expirationTime = 15;//过期时间 分
 10
 11
 12         /// <summary>
 13         /// 构造初始化
 14         /// </summary>
 15         static CustomCache()
 16         {
 17             cacheContainer = new List<ConcurrentDictionary<string, DataModel>>();
 18             for (int i = 0; i < cpuCount; i++)
 19             {
 20                 cacheContainer.Add(new ConcurrentDictionary<string, DataModel>());
 21             }
 22             AutoClaerCache();
 23         }
 24
 25         /// <summary>
 26         /// 自动清理缓存
 27         /// </summary>
 28         private static void AutoClaerCache()
 29         {
 30             Task.Factory.StartNew(() =>
 31             {
 32                 while (true)
 33                 {
 34                     Thread.Sleep(intervalTime);
 35                     for (int i = 0; i < cacheContainer.Count; i++)
 36                     {
 37                         var cache = cacheContainer[i].Where(w => w.Value.LifeCycleType == LifeCycle.Temp);
 38                         foreach (var item in cache)
 39                         {
 40                             if (DateTime.Now > item.Value.CacheDateTime)
 41                             {
 42                                 cacheContainer[i].TryRemove(item.Key, out DataModel dataModel);
 43                             }
 44                         }
 45                     }
 46                 }
 47             });
 48         }
 49
 50         /// <summary>
 51         /// 添加或更新缓存
 52         /// </summary>
 53         /// <param name="key">键</param>
 54         /// <param name="keyValue">键值</param>
 55         /// <param name="lifeCycle">生命周期</param>
 56         /// <returns></returns>
 57         public static DataModel AddOrUpdate(string key, object keyValue, LifeCycle lifeCycle)
 58         {
 59             var model = new DataModel { LifeCycleType = lifeCycle, CacheData = keyValue, CacheDateTime = lifeCycle == LifeCycle.Lasting ? DateTime.Now : DateTime.Now.AddMinutes(expirationTime) };
 60             return cacheContainer[Math.Abs(key.GetHashCode() % cpuCount)].AddOrUpdate(key, model, (k, v) => { return model; });
 61         }
 62
 63         /// <summary>
 64         /// 删除缓存
 65         /// </summary>
 66         /// <param name="key">键</param>
 67         /// <returns></returns>
 68         public static bool Remove(string key)
 69         {
 70             return cacheContainer[Math.Abs(key.GetHashCode() % cpuCount)].TryRemove(key, out DataModel dataModel);
 71         }
 72
 73         /// <summary>
 74         /// 获取缓存数据
 75         /// </summary>
 76         /// <typeparam name="T"></typeparam>
 77         /// <param name="key">键</param>
 78         /// <returns></returns>
 79         public static T GetCacheData<T>(string key)
 80         {
 81             if (IsExistsCacheData(key, out int i))
 82             {
 83                 var temp = cacheContainer[i][key];
 84                 if (temp.CacheData == null)//如果缓存为Null值返回类型默认值
 85                 {
 86                     return default(T);
 87                 }
 88                 if (typeof(T) != temp.CacheData.GetType())//判断类型是否一致,不一致将抛出异常
 89                 {
 90                     throw new Exception("This key value specifies that the type does not match the container cache type.");
 91                 }
 92                 return (T)temp.CacheData;
 93             }
 94             return default(T);//键值不存在也将返回类型默认值
 95         }
 96
 97         /// <summary>
 98         /// 获取缓存数据
 99         /// </summary>
100         /// <typeparam name="T"></typeparam>
101         /// <param name="key">键值</param>
102         /// <param name="func">委托</param>
103         /// <param name="lifeCycle">生命周期</param>
104         /// <returns></returns>
105         public static T GetCacheData<T>(string key, Func<T> func, LifeCycle lifeCycle)
106         {
107             if (IsExistsCacheData(key, out int i))
108             {
109                 var temp = cacheContainer[i][key];
110                 if (temp.CacheData == null)//如果缓存为Null值返回类型默认值
111                 {
112                     return default(T);
113                 }
114                 if (typeof(T) != temp.CacheData.GetType())//判断类型是否一致,不一致将抛出异常
115                 {
116                     throw new Exception("This key value specifies that the type does not match the container cache type.");
117                 }
118                 return (T)temp.CacheData;
119             }
120             T data = default(T);
121             try
122             {
123                 data = func.Invoke();
124             }
125             catch
126             {
127                 throw new Exception("Func Invoke Exception."); ;
128             }
129             AddOrUpdate(key, data, lifeCycle);
130             return data;
131         }
132
133         /// <summary>
134         /// 是否存在缓存数据
135         /// </summary>
136         /// <param name="key">键</param>
137         /// <param name="containerIndex">容器索引</param>
138         /// <returns>返回 Bool</returns>
139         public static bool IsExistsCacheData(string key, out int containerIndex)
140         {
141             containerIndex = Math.Abs(key.GetHashCode() % cpuCount);
142             if (cacheContainer[containerIndex].ContainsKey(key))
143             {
144                 var cache = cacheContainer[containerIndex][key];
145                 if (cache.LifeCycleType == LifeCycle.Temp && DateTime.Now > cache.CacheDateTime)
146                 {
147                     cacheContainer[containerIndex].TryRemove(key, out DataModel dataModel);
148                     return false;
149                 }
150                 return true;
151             }
152             return false;
153         }
154     }
 1 public class DataModel
 2     {
 3         /// <summary>
 4         /// 生命周期类型
 5         /// </summary>
 6         public LifeCycle LifeCycleType { get; set; }
 7
 8         /// <summary>
 9         /// 缓存时间
10         /// </summary>
11         public DateTime CacheDateTime { get; set; }
12
13         /// <summary>
14         /// 缓存数据
15         /// </summary>
16         public object CacheData { get; set; }
17     }
1 public enum LifeCycle
2     {
3         Lasting = 0,//持久
4         Temp = 1//临时
5     }

—————————————————————————————————————————————————————————————————————————————————————————————————————————————————

原文地址:https://www.cnblogs.com/JingYeChong/p/11106134.html

时间: 2024-10-30 16:33:45

支持高并发高性能 通用缓存容器 浓缩的精华 代码优化版的相关文章

39套精品Java从入门到架构师|高并发|高性能|高可用|分布式|集群|电商缓存|性能调优|设计项目实战|视频教程

精品Java高级课,架构课,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,第三方支付,web安全,高并发,高性能,高可用,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,大型分布式电商项目实战视频教程   视频课程包含: 39套Java精品高级课架构课包含:java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,架构设计,web安全,高并发,高性能,高可用,高可扩展,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,工作流,程序调优,负载均衡,Solr

高并发高性能场景(抢购、秒杀、抢票、限时竞答)解决方案

技术指标: PV(Page View, 页面浏览量)在千万级别QPS(Query Per Second, 每秒处理请求数)在百万级别数据量在千亿级别接口响应速度不能超过150毫秒用户提交请求到页面呈现不能超过3秒 架构设计:1. 从LAMP架构转为面向服务架构(服务可以用多种开发语言实现,不受一种开发语言限制)2. 对海量数据做Sharding分片,分库分表3. 从有状态服务改为无状态接口服务(便于分布式部署)4. 精心设计的数据层(存储.压缩.索引)5. 分布式系统最终瓶颈(CPU.内存.存储

1支持高并发web服务器搭建

支持高并发web服务器搭建 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] CTCDN系统优化参数 关闭ipv6 避免放大攻击 开启恶意icmp错误消息保护 关闭路由转发 开启反向路径过滤 处理无源路由的包 关闭sysrq功能 core文件名中添加pid作为扩展名 开启SYN洪水攻击保护 修改消息队列长度 设置最大内存共享段大小bytes timewait的数量默认180000 系统同时保持TIME_WAIT的最大数量如果超过这个数字TIME_WAIT将立刻被清除并打印警

配置开发支持高并发TCP连接的Linux应用程序全攻略

http://blog.chinaunix.net/uid-20733992-id-3447120.html http://blog.chinaunix.net/space.php?uid=16480950&do=blog&id=103598 原文见:http://www.cppblog.com/flashboy/articles/47012.html1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到

Linux配置支持高并发TCP连接(socket最大连接数)

Linux配置支持高并发TCP连接(socket最大连接数)及优化内核参数 2011-08-09 15:20:58|  分类:LNMP&&LAMP|  标签:内核调优  文件系统调优  高并发调优  socket连接  ip_conntract  |字号大中小 订阅 1.修改用户进程可打开文件数限制在 Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个s

支持高并发的IIS Web服务器常用设置

转一篇站长大人的文章 适用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 适用的Windows版本:Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 1.应用程序池(Application Pool)的设置:  General->Queue Length设置为65535(队列长度所支持的最大值) Process Model->Idle Time-out设置为0(不让应用程序池因为没有请求而回收)

Tornado从入门到进阶 打造支持高并发的技术论坛

第1章 Tornado从入门到进阶 打造支持高并发的技术论坛-课程导学Tornado从入门到进阶 打造支持高并发的技术论坛-课程导学 第2章 开发环境搭建(会的可以略过本章,2-4要看下哦)本章节主要讲解搭建开发环境,包括navicat.pycharm.virtualenvwrapper的使用,在本章节也会重点介绍课程资源的下载和配置使用. 第3章 为什么要学习tornado很多人会把tornado和flask以及django相提并论,只是知道tornado是高并发的,但是因为对tornado的

redis单线程如何支持高并发

redis支持高并发的原因: redis是基于内存的,内存读写很快 redis的是单线程的,省去了很多多线程上下文切换的时间 redis虽然是单线程,但采用了IO多路复用技术,非阻塞IO,即多个网络连接复用一个线程,保证多连接的同时增加系统的吞吐量 redis的数据结构,采用hash,读取速度比较快 原文地址:https://www.cnblogs.com/volare/p/12276077.html

高并发场景下缓存+数据库双写不一致问题分析与解决方案设计

Redis是企业级系统高并发.高可用架构中非常重要的一个环节.Redis主要解决了关系型数据库并发量低的问题,有助于缓解关系型数据库在高并发场景下的压力,提高系统的吞吐量(具体Redis是如何提高系统的性能.吞吐量,后面会专门讲). 而我们在Redis的实际使用过程中,难免会遇到缓存与数据库双写时数据不一致的问题,这也是我们必须要考虑的问题.如果还有同学不了解这个问题,可以搬小板凳来听听啦. 一.数据库+缓存双写不一致问题引入 要讲数据库+缓存双写不一致的问题,就需要先讲一下这个问题是怎么发生的