Dapper的缓存机制是什么 Dapper内部缓存原理解析

畫卷琴夢
发布: 2025-12-13 16:44:04
原创
199人浏览过
Dapper缓存是分层轻量内存缓存,不存结果数据而缓存执行与映射逻辑:一级缓存用SQL哈希+参数类型+连接标识+结果类型键查ConcurrentDictionary复用执行逻辑;二级缓存按Type和DeserializerKey双重索引生成差异化反序列化函数;键由GetColumnHash加权列名与类型哈希生成;默认无主动过期,仅被动淘汰低效项并提供手动清理与监控接口。

dapper的缓存机制是什么 dapper内部缓存原理解析

Dapper的缓存机制不是单一的“结果缓存”,而是分层、轻量、内存驻留的多级缓存体系,核心目标是消除重复解析和映射开销,而非替代Redis这类分布式缓存。它不缓存查询结果数据本身(比如100条User记录),而是缓存“怎么执行”和“怎么转换”的逻辑。

查询执行计划缓存(一级缓存)

每次执行SQL时,Dapper会生成一个唯一的 Identity 键,包含:SQL语句哈希值、参数类型、连接字符串标识、结果类型。这个键用于查 ConcurrentDictionary<identity cacheinfo></identity> —— 全局静态线程安全字典。

命中后直接复用已编译的执行逻辑,包括:

  • 参数绑定器(ParamReader
  • 结果反序列化器(DeserializerState
  • 列结构解析状态(如字段名、类型、顺序)

避免了每次查询都重新编译命令、反射获取属性、遍历DataReader列等操作。

类型映射反序列化器缓存(二级缓存)

这部分由 TypeDeserializerCache 管理,采用双重键控设计:

  • 外层按 Type(如 Product)索引,用静态 Hashtable byType 存储
  • 内层按 DeserializerKey(含列名数组、列类型、起始偏移、是否允许null等)区分不同查询上下文

例如:SELECT Id, Name FROM ProductsSELECT Name, Price FROM Products 即使映射到同一类型,也会生成两个不同的反序列化函数,互不干扰。

ImgGood
ImgGood

免费在线AI照片编辑器

ImgGood 92
查看详情 ImgGood

缓存键是怎么算出来的?

关键方法是 GetColumnHash,它对DataReader的列信息做加权哈希:

  • 遍历每一列,把 GetName(i)GetFieldType(i) 的哈希值参与运算
  • 引入 startBoundlength 支持跳过前几列或只取部分列(适配匿名对象、多结果集)
  • 使用 unchecked int 运算保证哈希一致性,不抛溢出异常

这种设计让缓存键真正反映“数据结构特征”,而不是简单拼接SQL字符串。

缓存怎么清理和监控?

Dapper默认不主动过期缓存,但有被动淘汰策略:

  • 每新增1000个缓存项,检查命中次数低于1的低效项并清除
  • 提供手动清理接口:SqlMapper.PurgeQueryCacheByType(typeof(T))SqlMapper.PurgeQueryCache()
  • 可监控:SqlMapper.GetCachedSQLCount()SqlMapper.GetCachedSQL(ignoreHitCountAbove: 5) 查低频查询

注意:CommandFlags.NoCache 可临时绕过整个缓存链,适合动态SQL或实时性极高的场景。

基本上就这些。它不复杂,但容易忽略——缓存生效的前提是SQL文本、参数类型、目标类型、连接字符串(或至少Provider)保持稳定。只要其中一项变了,就是新缓存键。

以上就是Dapper的缓存机制是什么 Dapper内部缓存原理解析的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号