请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于EF core数据读取的效率和缓存问题

请问老师,EF生成的sql语句都是比较冗余,如何保证数据读取的效率?EF的缓存是否属于应用程序缓存? 是在内存上的吗? 如果需要自己用HttpRuntime.Cache,那应该在哪个地方加? 是不是在仓库类读取数据的时候先读Cache呢? 谢谢老师!

正在回答

1回答

既然是自动生成的sql语句,那我们就不要对他的性能有过高的要求,使用ef的目的主要是为了开发的便利。如果对ef的自动生成不放心,那么可以使用dapper自己写sql。1. 如何保证ef中数据读取的效率呢?还是要优化自己的代码,比如说多表联查的时候,join表的逻辑可以从仓库中提取出来放在业务逻辑里,这样可以保证每次去数据库拿数据的时候都是由业务决定join多少张表;再比如说,我们可以改变ef的track change方式来提高效率。2. EF的缓存是否属于应用程序缓存? 是在内存上的吗?ef的缓存属于应用程序缓存,应该是储存在内存上的,你可以在查询的时候加上.AsNoTracking()试试。3 .HttpRuntime.Cache应该在哪个地方加?它也属于应用程序缓存、保存在内存中,位于项目的最上层,与controller是一个级别的,应该加在这里。4. 是不是在仓库类读取数据的时候先读Cache呢?具体要看什么操作,比如说post请求就不需要读缓存了,而get请求,我们一半都要进缓存先对比一下,看看缓存数据有没有过期什么的,如果缓存过期了,那么就要去数据库里拿数据了。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕设计9348276 #1
    谢谢老师! 我想再问问,如果数据量比较大,比如携程里的真实旅游路线,如果都存到内存缓存可能太多了,而如果直接读数据库,每次都会有些关联表,查询起来也费时,是不是就要用redis这样的缓存服务器处理好些?,是否需要把整个表都读出来放到redis缓存,这样效率更高?
    回复 有任何疑惑可以回复我~ 2021-01-03 20:51:58
  • 提问者 慕设计9348276 #2
    还有,缓存的应该是dto对象而不是数据模型吧?
    回复 有任何疑惑可以回复我~ 2021-01-03 20:57:54
  • 阿莱克斯刘 回复 提问者 慕设计9348276 #3
    缓存存什么都行,不一定非要对应数据库schema,可以存dto,也可以存dto再经过变换的数据,怎么方便怎么存
    回复 有任何疑惑可以回复我~ 2021-01-04 11:11:54
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信