当前位置: 首页 > 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}
}

总结

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

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

http://www.xdnf.cn/news/899731.html

相关文章:

  • vscode使用系列之快速生成html模板
  • CANFD 数据记录仪在汽车售后解决偶发问题故障的应用
  • 浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
  • Python使用clickhouse-local和MySQL表函数实现从MySQL到ClickHouse数据同步
  • 全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
  • Spring Cloud 2025.0.0 Gateway迁移全过程详解
  • Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战
  • 开源 vGPU 方案:HAMi,实现细粒度 GPU 切分
  • 华为云Flexus+DeepSeek征文|基于华为云Flexus X和DeepSeek-R1打造个人知识库问答系统
  • 学习笔记(25):线性代数,矩阵-矩阵乘法原理
  • NoSQL子Redis哨兵
  • Android Test3 获取的ANDROID_ID值不同
  • logstash拉取redisStream的流数据,并存储ES
  • uni-app 项目支持 vue 3.0 详解及版本升级方案?
  • LangChain【8】之工具包深度解析:从基础使用到高级实践
  • Vue3 + UniApp 蓝牙连接与数据发送(稳定版)
  • FFmpeg 低延迟同屏方案
  • LeetCode 热题 100 74. 搜索二维矩阵
  • 计算机视觉与深度学习 | 基于MATLAB的图像特征提取与匹配算法总结
  • LinkedBlockingQueue、ConcurrentLinkedQueue和ArrayBlockingQueue深度解析
  • 在 Kali 上打造渗透测试专用的 VSCode 环境
  • MDP的 Commands模块
  • Git 切换到旧提交,同时保证当前修改不丢失
  • 如何写高效的Prompt?
  • pikachu靶场通关笔记18 SQL注入01-数字型注入(POST)
  • JS-- for...in和for...of
  • 在WPF项目中集成Python:Python.NET深度实战指南
  • 如何更改默认 Crontab 编辑器 ?
  • 紫光同创FPGA系列实现Aurora 8b/10b协议
  • 宝塔think PHP8 安装使用FFmpeg 视频上传