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

admin 百科 9
Dapper缓存是分层轻量内存缓存,不存结果数据而缓存执行与映射逻辑:一级缓存用SQL哈希+参数类型+连接标识+结果类型键查ConcurrentDictionary复用执行逻辑;二级缓存按Type和DeserializerKey双重索引生成差异化反序列化函数;键由GetColumnHash加权列名与类型哈希生成;默认无主动过期,仅被动淘汰低效项并提供手动清理与监控接口。

Dapper的缓存机制是什么 Dapper内部缓存原理解析-第1张图片-佛山资讯网

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 即使映射到同一类型,也会生成两个不同的反序列化函数,互不干扰。

标签: redis app sql语句 red

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~