概念性的东西暂就不说了,说多了都是故事。现在我们来谈谈各种缓存。
初学.NET的朋友开始就会接触到DataSet类云里雾里的看着DataSet的例子程序也不管是咋回事用就是了。其实DataSet就是缓存当我们去读取一段数据集合的时候如果每读取一条数据就处理一条的话那么我们的程序和数据库会一直连接着。假如处理一条数据的耗时可以忽略不计或者只有你一个人使用这个数据库的话那么数据库一直连着也无所谓我们写代码完全可以不用DataSet类。但是事实上不耗时不可能的如果耗时严重的话就会一直占用这数据库连接直到我们处理完毕。如果这种查询过多连接数就会占用过多而且数据库在某些操作时会锁住表这就会造成其他的请求等待会出现查询超时程序异常等现象。所以我们必须先把数据拿出来再对这些数据进行相关的处理尽早的关闭数据库连接好让数据库处理其他的请求。 所以适时地选用DataSet或DataReader是比较重要的说明DataReader就是hold住连接的读取方式。你可能会迷惑不知不觉中使用了缓存DataSet这都是.net帮你完成的事。可是你可能还是不太清楚该如何使用缓存或者说何时使用缓存。不用着急我们一一来看。上面说过我们缓存的数据无非就是一些数据库的查询、计算结果和频繁查询。那么我们在实际开发中会碰到哪些这种数据呢 其实仔细想想这是非常常见的比如用户登录后的个人资料当他每次点击连接后造成页面刷新我们总不能都要去重新查询数据库吧我们常常用Session来存储这个人的信息当他退出系统后我们把Session清理掉所以Session也是缓存只不过他也是.NET给我们提供好的类sorry我又举了一个你不想看到的例子哈哈。其实Session是私有化的数据Session的数据访问必须通过SessionID(详情我就不多言了大家google下还不足以说明缓存的意义。如果把这个问题延伸下去假如我们开发的是一个多用户的Blog系统 每当我们访问其中一个博客时都要去查询这个博主的资料假如A和B同时访问一个博客时最理想的状态就是只查询一次而不是两个人都去访问数据库是不是呢其实。。。是也不是(故事里的事说是就是不是也是说不是就不是是也不是。 )。之所以说不是是因为假如我们的博客网站每天就几个人访问而且一直发展不起来我们就没必要用缓存因为使用缓存带来了更多的开发复杂度因为每当我们去更新博主的资料的时候不单单要更新数据库的信息我们还要去处理缓存。但是如果我们的博客访问量非常大就像博客园似的如果再不缓存那数据库服务器早就Gameover了那么现在就来看怎么用缓存的吧。.Net Framework提供了现成的缓存类供我们使用常见的是 System.Web.HttpRuntime.Cache。每当我们去执行 BlogDataProvier.GetBlogInfo()方法时假定这个方法是我们获取博主信息的方法顾名思义嘛需要在查询之前先从缓存获取数据假如数据不存在的话再去数据库获取并且把得到的结果存入缓存并且返回该结果既可。下面我把这个方法的伪代码写出来好让从来没用过缓存的朋友大致了解一下。publicclassSqlDataProvider{publicstaticobjectGetBlogInfo(stringusername){//这里是从数据库获取BlogInforeturnnull;}}publicclassBlogDataProvider{publicstaticobjectGetBlogInfo(stringusername){varcacheKey Blog_ username;varblog CacheHelper.Get(cacheKey);if(blog null){blog SqlDataProvider.GetBlogInfo(username);CacheHelper.Set(cacheKey, blog);}returnblog;}}publicclassCacheHelper{publicstaticobjectGet(stringkey){returnSystem.Web.HttpRuntime.Cache.Get(key);}publicstaticvoidSet(stringkey,objectvalue){System.Web.HttpRuntime.Cache.Insert(key, value);}}缓存两个字道出了其实际意义一个是“存”我们刚刚存了另一个是“缓”暂缓缓存一般只是用来暂时存储其命运都会被删除或替换掉所以缓存有个时效问题。如果你说你的数据永远都不会过期那么说真的我建议你直接写在代码里就可以了。上面的例子让我们了解到了HttpCache类。看来我们可以用它来解决绝大部分的缓存问题主要是公共数据的缓存所谓公共数据就是你我都可以访问的同一数据。希望新手朋友捧着MSDN仔细学习该类的用法真的很重要哦不是吗开始我们说了“拿空间换时间”目前只提到了缓存一些频繁查询的情况牺牲空间缓存时间的明显些的例子有吗没问题你看好咯说之前先插一句我们公司现在在招人其中一道笔试题是介绍一下ListT和DictionaryTKey,TValue的区别和用途。很遗憾面试了很多人只有一个同学回答的到位其他的说什么的都有。你想好怎么回答了吗如果你看了下面发现和你现在想的一致而且你还需要找一份有挑战的工作的话给我消息哦。其实用ListTDictionaryTKey,TValue泛型就是用来迷魂人的哈哈就会有些同学往泛型上面扯结果上当咯我完全可以用ArrayList和Hashtable来问。List是什么数据结构数组而且是动态的数组之所以动态就是可以视情况动态申请空间。Dictionary是什么结构有的同学回答是字典。字典是什么数据结构 散列表散列一听这名字就知道是散开分布的数据表。怎么个“散”法 自然是按照Key来散每个Key对应一个Value所以我们常叫做“键值对”Key和Value是成对的。我们把Dictionary看作是一个数组那么每个Key的hash值(什么是hash值在.net里任何类型都有GetHashCode方法返回int值有木有)便是数组的下标而该数组的元素值就是Value所以我们在获取Dictionary的某个Key的Value时速度是非常快的可以直接通过已知的下标拿到值这个时间复杂度是O(1)。快不快啊好快好快。但是你有木有想到所有的Key的hash值是按顺序来的吗显然不是鬼知道你用的什么key所以Dictionary的这个数组很长很长浪费了很多空位置所以那就是 空间 换 时间。当然GetHashCode的算法不同Key对应的值的分布也有区别有的比较紧密有的比较松散常见的算法比如一致性hash算法。dictionary的实际内存分布如上图所示dict的分布是不紧凑的牺牲了很多空间但可以最快速的找到数据所以dict或hash或map等不管什么叫什么类总之都是hashtable它们的用途主要就是查询。所以如果我们把博客按用户名作key缓存起来的话用户访问博客时都是使用的username所以我们甚至不需要blogId就可以拿到博主的信息根本没走数据库。而list这种排列紧凑的数据集合一般用于批处理。当然还有兼顾空间和速度的数据结构那就是树结构在查找时不需要所有数据都进行遍历时间复杂度一般是O(logn)而且空间是紧凑的采用的是链表结构而不是紧凑的数组。所以在时间和空间上都不比前两者但用途却十分广大我们所用的数据库的索引基本上都是用的树。这样既保证了占用空间小查询的速度也不慢。上面这一段我们介绍了hash表的基本原理现在我们明白了缓存的优势在实际的项目使用中我们除了使用系统提供的Cache类以外完全可以自己尝试写缓存类为什么不呢呵呵。我们把一个变量斯static然后再public就等于是全局变量了我们可以到处访问到他而且我们还要用dict因为他足够快还不快动手去写一个回来再接着看刚才提到了“缓”字缓也有不同的策略比如最常见的按时间缓存在单位时间内该数据有效每当访问时都要判断缓存的数据是否过期再决定Get还是Remove。除了时间策略还有使用热度策略由于内存有限所以我们的缓存也不是无限申请的是时候限制长度了。限制了长度就意味着有人能进来就得有人要出去。这就是Remove策略。我们可以对所有的缓存打上标记来标记他的热度每次添加缓存的时候把热度最低的缓存剔除掉假如已经达到限制的话。每次获取缓存的时候给该缓存热度1。这是多人性化的设计不是吗 我上篇博文中已经贴出了这类的代码。有兴趣的朋友给你们个传送门。我们继续用博客园作例子我们知道博客园的访问量已经很大了具体多大俺不知道反正以前发表评论经常超时官方团队解决后还发表博文说咋解决的结果评论里一大票同学都说怎么不用缓存阿。当网站访问量达到一定程度后一台机器很难处理太多的httprequest这个时候我们必须使用多台机器。假如你的程序没同时跑在多台机器上的话你对缓存的理解恐怕不会很深因为谁都要会这种经历哎呀 sessio不能分布式阿 哎呀妈呀我的缓存不能在两台机器上阿这可咋整其实这也不能怪你要怪就怪微软吧。因为IIS我们的web程序驻留在一个进程里每个httprequest会有一个线程来处理所以你甚至都没用过多线程。害人啊哈哈。但随着项目经验的增加特别是大项目的历练后也没什么了。之所以说是微软的错是因为人家php阿ruby阿人家的服务端(apachenginx等)都是多进程的。每个httprequest一个进程总共开几十个进程处理并发。多进程就意味着数据共享问题就像我们多台机器的情况一样。 这时候需要借助一个共享缓存进程来供其他的web服务进程来访问获取缓存。 这就是下面要说的 分布式缓存。如果说两三年前你不知memcached为何物或许情有可原那时候还流行自己写windows service。但现在满世界的NoSQLMongoDBMemcachedRedis你再不知道的话真该说多看看博客吧看看新技术你已经落后一个时代了。上面提到的这个名词都是玩缓存的主。NoSQL是个新技术NoSQL DB现在很多种MongoDB就是一种MongoDB是介于传统关系型数据库和内存数据库的杂交数据库现在也算是很热门的数据库。MemCached是著名的分布式缓存服务而Redis(Remoting Dictionary Service)你懂了吧我们的缓存服务器可以用memcached或redisMemcached是纯内存的重启进程会丢失所有缓存而redis可以把数据写到硬盘里各有各的优点吧。Redis更适合存经过计算过的数据。而且Redis支持丰富的数据类型(list\set\hash\string)这要比memcached更灵活些。 他们都有.net的Driver还有相关的Example和UnitTest可以官网下载看看。

相关新闻

数据库设计 Step by Step (1)——扬帆启航

数据库设计 Step by Step (1)——扬帆启航

一直在从事数据库开发和设计工作,也看了一些书籍,算是略有心得。很久之前就想针对关系数据库设计进行整理、总结,但因为种种原因迟迟没有动手,主要还是惰性使然。今天也算是痛下决心开始这项卓绝又令我兴奋的工作。这将是一个系列…

2026/7/5 3:41:35阅读更多 →
当AI越来越能干,我们该如何重新摆位?

当AI越来越能干,我们该如何重新摆位?

能力下放,验证上收——这是AI时代工程师的生存法则最近读到一期BestBlogs的早报,三篇精讲从不同维度探讨了同一个问题:当模型越来越能干,人和验证该怎么重新摆位? 读完后我发现,这不是一个遥远的哲学问题&a…

2026/7/5 3:41:35阅读更多 →
Kali 无法启动自带的BurpSuite

Kali 无法启动自带的BurpSuite

问题描述 启动burpsuite时,闪退,无法启动。提示如图。 原因分析: 这是由于java -version跟javac -verson的版本不同导致的。 java -version javac -version 使用update-alternatives --config java切换版本 update-alternatives --config …

2026/7/5 3:41:35阅读更多 →
SOA与DDD的定义

SOA与DDD的定义

SOA与DDD都是常用的系统架构,但两者之间所针对的核心是不同的。 SOA(面向服务架构)由Gartner 在1996年提出来,它是一种分布式的软件架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行部署、组合和使用。简单…

2026/7/5 4:56:39阅读更多 →
【Bug已解决】OpenClaw 报错 Error: Cannot find module ‘@larksuiteoapi/node-sdk‘ 解决方案

【Bug已解决】OpenClaw 报错 Error: Cannot find module ‘@larksuiteoapi/node-sdk‘ 解决方案

【Bug已解决】OpenClaw 报错 Error: Cannot find module larksuiteoapi/node-sdk 解决方案 1. 问题描述 给 OpenClaw 配置接入飞书(Lark)渠道后,启动服务时遇到模块加载失败: Error: Cannot find module larksuiteoapi/node-sdk R…

2026/7/5 4:56:39阅读更多 →
基于JEPA框架的轻量世界模型LeWorldModel:1GB显存实现AI环境预测

基于JEPA框架的轻量世界模型LeWorldModel:1GB显存实现AI环境预测

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在探索人工智能的前沿领域时,我们常常被那些需要海量算力和显存的复杂模型所困扰。近期,一个名为 LeWorldMod…

2026/7/5 4:56:39阅读更多 →
数据转换过程

数据转换过程

前面已经解释了DTO的作用,但实现领域对象与DTO之间的转换是一件复杂的事件,因此可以建立一个数据转换器实现此功能。 在平常的工作里,不太多会把“订单管理系统”做成SOA的模式,因为在分布式系统中,数据的格式与定义大…

2026/7/5 4:56:39阅读更多 →
领域层的服务

领域层的服务

在第二节已基本介绍过服务的作用了,领域层服务的作用主要是为了解决业务上的逻辑问题,更多的时候,服务是一个与业务相关的动作。比如在上述例子中: 在Order表里记录的是每次交易的过程,每次商品的送货费(F…

2026/7/5 4:56:39阅读更多 →
LitCAD:15分钟从零基础到二维CAD绘图高手

LitCAD:15分钟从零基础到二维CAD绘图高手

LitCAD:15分钟从零基础到二维CAD绘图高手 【免费下载链接】LitCAD A very simple CAD developed by C#. 项目地址: https://gitcode.com/gh_mirrors/li/LitCAD 想要掌握专业级的CAD绘图技能,却担心软件复杂、学习曲线陡峭?LitCAD正是为…

2026/7/5 4:51:39阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/5 1:30:27阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/5 3:48:10阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/5 3:48:09阅读更多 →