当前位置: 首页 > news >正文

C#学习第28天:内存缓存和对象池化

内存缓存


什么是内存缓存?

  • 定义:内存缓存是一种将计算或数据结果暂时存储在内存中的技术,以便快速重复访问。
  • 用途:提高数据访问速度,减少数据库或文件系统的反复读取。 
  • 适用对象:不可变数据或需要频繁读取的数据,如计算结果、查询结果、配置数据等。

实际应用场景 

  • 网页应用中的数据缓存:存储页面片段、用户会话数据、频繁查询的数据库结果等。
  • 配置和元数据存储:应用程序配置、功能开关、常量数据。
  • 计算密集型任务的结果缓存:如数据分析结果、报告生成结果。

优缺点

  • 优点
    • 性能提升:显著减少数据读取的时间,提升应用程序响应速度。
    • 降低后端负载:减少对数据库或外部服务的请求次数。
  • 缺点
    • 内存占用:缓存数据会占用系统内存,过多的缓存可能导致内存不足。
    • 数据一致性:可能会有过期数据的问题,需要适当的过期策略管理。

示例 

System.Runtime.Caching命名空间提供了内存缓存的功能,MemoryCache类是常用的缓存实现。

using System;
using System.Runtime.Caching;public class CachingExample
{// 创建一个默认的内存缓存实例private static MemoryCache cache = MemoryCache.Default;public static void Main(){string key = "sampleData";// 获取数据(如果缓存中存在则直接获取,否则从源获取并缓存)string value = GetData(key);Console.WriteLine($"Data: {value}");// 再次调用以演示缓存命中value = GetData(key);Console.WriteLine($"Data: {value}");}public static string GetData(string key){// 检查缓存中是否存在数据if (cache.Contains(key)){Console.WriteLine("缓存命中。");return cache[key] as string; // 从缓存中获取数据}// 模拟数据获取并缓存Console.WriteLine("缓存未命中。正在检索数据...");string data = "这是一些示例数据。";// 设置缓存策略,10分钟后过期CacheItemPolicy policy = new CacheItemPolicy{AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(10)};// 将数据添加到缓存中cache.Add(key, data, policy);return data;}
}

对象池化 


什么是对象池化?

  • 定义:对象池化是重用现有对象而不是每次需要时都创建新对象的一种技术。
  • 用途:减少垃圾回收和对象创建开销,特别适合那些创建成本高但重用性强的对象。
  • 适用对象:适用于创建开销大,生命周期短且可重复使用的对象,如数据库连接、线程、内存缓冲区等。

实际应用场景

  • 数据库连接池:维护一组数据库连接以供应用程序重用,减少连接的创建和销毁成本。
  • 线程池:在多线程编程中复用线程,减少线程创建的开销。
  • 网络连接池:在高并发网络应用中复用连接,提升吞吐量。
  • 游戏开发中:子弹,粒子对象等

优缺点

  • 优点
    • 节省资源:通过对象重用减少资源分配和回收的成本。
    • 提高性能:减少垃圾回收和内存分配的开销,提高系统的整体性能。
  • 缺点
    • 复杂性增加:需要管理对象的创建、销毁和复用,可能引入复杂性。
    • 内存占用:对象池中未使用的对象仍会占用内存。

示例

using System;
using System.Collections.Generic;// 泛型对象池类,用于对象的重用
public class ObjectPool<T> where T : new()
{// 使用栈来存储对象private readonly Stack<T> _objects = new Stack<T>();private readonly int _maxSize; // 对象池的最大容量public ObjectPool(int maxSize){_maxSize = maxSize;}// 获取对象的方法public T GetObject(){if (_objects.Count > 0){Console.WriteLine("从对象池中重用对象。");return _objects.Pop(); // 从对象池中获取对象}Console.WriteLine("创建新对象。");return new T(); // 创建新对象}// 返回对象到池中public void ReturnObject(T obj){if (_objects.Count < _maxSize){_objects.Push(obj); // 将对象放回池中Console.WriteLine("对象已返回到池中。");}}
}// 示例对象类
public class ExampleObject
{public int Value { get; set; }
}public class Program
{public static void Main(){// 创建一个对象池,最大容量为5ObjectPool<ExampleObject> pool = new ObjectPool<ExampleObject>(5);// 获取一个对象并设置其值ExampleObject obj1 = pool.GetObject();obj1.Value = 42;// 将对象返回到池中pool.ReturnObject(obj1);// 再次获取对象,应该重用之前的对象ExampleObject obj2 = pool.GetObject();Console.WriteLine($"对象值: {obj2.Value}"); // 输出:42}
}

总结

  • 内存缓存适用于频繁访问的不可变数据,主要目的是加速数据读取。
  • 对象池化适用于开销大的可重用对象,旨在减少资源分配的开销。

在选择这两种技术时,需要根据应用的具体需求、对象的生命周期和访问模式来做出最佳决策。有效的使用可以显著提升应用的性能和响应性。如有其他问题或需要进一步探讨,请随时告诉我! 

相关文章:

  • 给网站添加live2d看板娘
  • 终极数据结构详解:从理论到实践
  • 我用AI降低AI率:一次“用魔法打败魔法”的实验
  • 装载机防撞系统:智能守护,筑牢作业现场人员安全防线
  • unity Addressable的基本使用
  • 今日行情明日机会——20250606
  • 5.3 Spring Boot整合JPA
  • 手机如何防止ip关联?3种低成本方案
  • 淘酒屋(香港)控股公司副总裁郭钢出席2025西班牙葡萄酒行业论坛
  • 从混乱到秩序:探索管理系统如何彻底改变工作流程
  • 区块链技术相关
  • Three.js中AR实现详解并详细介绍基于图像标记模式AR生成的详细步骤
  • 二叉树基础全解:存储方式、遍历原理与查找树对比
  • MySQL用户和授权
  • Verilog编程技巧01——如何编写三段式状态机
  • C++ 设计模式 《小明的奶茶加料风波》
  • gitlab CI/CD本地部署配置
  • leetcode78. 子集
  • 使用 Coze 工作流一键生成抖音书单视频:全流程拆解与技术实现
  • Komiko 视频到视频功能炸裂上线!
  • 惠州做网站多少钱/南昌搜索引擎优化
  • 阿里云企业网站备案/bt磁力搜索神器
  • 网站建设包括哪些/泉州百度竞价公司
  • 怎样做新闻网站/seo新人培训班
  • 成都微信网站建设公/网站模板价格
  • 找网站设计/什么是市场营销