前言

上一篇讲述了执行sql和配置的一些功能,这篇说明IQueryable(linq)或执行sql的查询缓存与清理,包括扩展到将缓存存储到Redis中。

扩展类库源码:

  github:https://github.com/skigs/EFCoreExtend

引用类库:

  nuget:https://www.nuget.org/packages/EFCoreExtend/

    PM> Install-Package EFCoreExtend

  查询缓存引用Redis:

    PM> Install-Package EFCoreExtend.Redis

IQueryable(linq)查询缓存

DbContext:

     public class MSSqlDBContext : DbContext
     {
         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
         {
             if (optionsBuilder.IsConfigured == false)
             {
                 optionsBuilder.UseSqlServer(@"data source=localhost;initial catalog=TestDB;uid=sa;pwd=123;");
             }
             base.OnConfiguring(optionsBuilder);
         }
         public DbSet<Person> Person { get; set; }
     }

表实体:

     [Table(nameof(Person))]
     public class Person
     {
         public int id { get; set; }
         public string name { get; set; }
         [Column(TypeName = "datetime")]
         public DateTime? birthday { get; set; }
         public int? addrid { get; set; }
     }

IQueryable查询缓存:

             DbContext db = new MSSqlDBContext();
             var person = db.Set<Person>();
             //缓存不过期:参数一为表名(缓存清理的时候有用:根据表名清理缓存)
             //            参数二缓存过期策略,如果不设置为缓存不过期
             IReadOnlyList<Person> list = person.Where(l => l.name == "tom1").ListCache(nameof(Person), null);
             //这行和上面的一样
             var list0 = person.Where(l => l.name == "tom1").ListCache<Person, Person>(null);

缓存清理:

             ////缓存清理
             //根据指定的IQueryable清理缓存(Person表下的)
             person.Where(l => l.name == "tom1").ListCacheRemove<Person>();
             //移除指定缓存类型的所有缓存:List(Person表下的)
             EFHelper.Services.Cache.ListRemove<Person>();
             //移除Person表下的所有缓存
             EFHelper.Services.Cache.Remove<Person>();

查询缓存期限:

             //缓存过期
             var list1 = person.Where(l => l.name == "tom2")
                 .ListCache(nameof(Person), )));  //15分钟
             //这行和上面的一样
             var list11 = person.Where(l => l.name == "tom2")
                 .ListCache<Person, Person>(TimeSpan.FromMinutes());  //15分钟
             var list2 = person.Where(l => l.name == "tom3")
                 .ListCache<Person, Person>(DateTime.Parse("2018-1-1"));  //指定DateTime

缓存期限更新:

             //缓存期限更新
             ), true);  //第二个参数指定每次获取都更新缓存时间
             var list3 = person.Where(l => l.name == "tom4").ListCache(nameof(Person), policy);  //15分钟

其他类型的查询缓存与清理

             DbContext db = new MSSqlDBContext();
             var person = db.Set<Person>();
             var query = person.Where(l => l.name == "tom1");

             ////FirstOrDefault
             ));
             //根据指定的IQueryable清理缓存(Person表下的)
             query.FirstOrDefaultCacheRemove<Person>();
             //移除指定缓存类型的所有缓存:FirstOrDefault(Person表下的)
             EFHelper.Services.Cache.FirstOrDefaultRemove<Person>();

             ////Count
             ));
             //根据指定的IQueryable清理缓存(Person表下的)
             query.CountCacheRemove<Person>();
             //移除指定缓存类型的所有缓存:Count(Person表下的)
             EFHelper.Services.Cache.CountRemove<Person>();

             ////LongCount
             ));
             //根据指定的IQueryable清理缓存(Person表下的)
             query.LongCountCacheRemove<Person>();
             //移除指定缓存类型的所有缓存:LongCount(Person表下的)
             EFHelper.Services.Cache.LongCountRemove<Person>();

             ////其他类型的缓存
             //参数一:缓存类型,参数二:需要返回的数据
             query.Cache<Person, ));
             query.CacheRemove<Person>("sum");   //清理指定类型下的指定IQueryable的缓存
             //移除指定缓存类型的所有缓存:sum
             EFHelper.Services.Cache.Remove<Person>("sum");

SQL执行的查询缓存

             DbContext db = new MSSqlDBContext();
             string sql = $"select * from {nameof(Person)} where name=@name";
             ));
             var pararmModel = new { name = name };

             ////query的sql缓存
             IReadOnlyList<Person> list = db.QueryCacheUseModel<Person, Person>(
                 sql, pararmModel, null, null, policy);
             //根据指定的sql清理缓存(Person表下的)
             db.QueryCacheRemoveUseModel<Person>(sql, pararmModel, null);
             //移除query类型的所有缓存(Person表下的)
             EFHelper.Services.Cache.QueryRemove<Person>();

             string sql1 = $"select count(*) from {nameof(Person)} where name=@name";
             ////scalar的sql缓存
             object val = db.ScalarCacheUseModel<Person>(sql1, pararmModel, null, policy);
             //根据指定的sql清理缓存(Person表下的)
             db.ScalarCacheRemoveUseModel<Person>(sql, pararmModel, null);
             //移除scalar类型的所有缓存(Person表下的)
             EFHelper.Services.Cache.ScalarRemove<Person>();

使用Redis存放查询缓存

查询缓存引用Redis:PM> Install-Package EFCoreExtend.Redis

程序初始化的时候调用:

             //使用Redis存放查询缓存
             EFHelper.ServiceBuilder.AddQueryCacheCreator(sp =>
                 new RedisQueryCacheCreator("127.0.0.1:6379,allowAdmin=true"))
                 .BuildServices();   //重新编译服务

EFCore扩展:IQueryable(linq)或sql执行的查询缓存与清理的更多相关文章

  1. Linq To Sql 语法 子查询 & In & Join

    子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 =from cin ctx.Customers                    where                  ...

  2. wcf+linq to sql中关联查询返回数据问题

    前段时间准备采用wcf+nh框架开发sl程序,发现采用nh开发不适合我的中型.并且快速开发项目,所以综合考量了下,决定采用wcf+linq to sql . 但是此模式也有缺点,也是linq to s ...

  3. linq to sql中的自动缓存(对象跟踪)

    linq to sql中,对于同一个DataContext上下文环境,根据表主键选择记录时(当然这里所指的“记录”会自动转成“对象”),如果该记录已经被select过,默认情况下会被自动缓存下来,下次 ...

  4. asp.net LINQ连接数据库SQL执行数据的增加、修改、删除、查询操作

    查询数据库中的数据 using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...

  5. Webform中linq to sql多条件查询(小练习)

    多条件查询:逐条判断,从第一个条件开始判断,如果满足,取出放入集合,再从集合中查询第二个条件... aspx代码: <body> <form id="form1" ...

  6. Linq to Sql 左连接查询

    var query = from t0 in context.ExpressSendMaster join t1 in context.Supplier on t0.SupplierCode equa ...

  7. LinQ to sql 各种数据库查询方法

    1.多条件查询: 并且 && 或者 || var list = con.car.Where(r => r.code == "c014" || r.oil == ...

  8. Linq To Sql的各种查询

    一.Inner Join   //request为查询条件   var result = from a in db.TableA  join b in db.TableB  on a.ID equal ...

  9. linq to sql 动态构建查询表达式树

    通过Expression类进行动态构造lamda表达式. 实现了以下几种类型,好了代码说话: public Expression<Func<T, bool>> GetAndLa ...

随机推荐

  1. Unity加载本地图片的2种方式

    1. 使用 WWW 加载,详细查看 unity3d 官方文档. 2. 使用 System.IO 加载,lua 代码如下: local File = luanet.import_type("S ...

  2. js 各种常用js验证

    判断http或者https var http = 'https:' == document.location.protocol ? false : true; js的类型检测方式 /**** js的类 ...

  3. 一次性能优化,tps从400+到4k+

    项目介绍 路由网关项目watchman ,接收前端http请求转发到后端业务系统,功能安全验证,限流,转发. 使用技术:spring boot+ nreflix zuul,最开始日志使用slf4j+l ...

  4. 对AD域进行定期自动备份设置图解

    今天为大家讲解一下,如何对域进行定期的备份,因为如果域出问题了,在公司里那可就不好玩了啊,对做定期备份,在域出问题的时候可以及时恢复,减少对域重建而浪费大量的时间,同样也耽误公司员工的工作,这样的事情 ...

  5. Go的pprof使用

    go中有pprof包来做代码的性能监控,在两个地方有包: net/http/pprof runtime/pprof 其实net/http/pprof中只是使用runtime/pprof包来进行封装了一 ...

  6. iOS自定义字体及类目 分类: ios技术 2015-05-15 16:34 195人阅读 评论(0) 收藏

    1:获取字体文件 从各种渠道下载字体文件ttf, 网站或者从别的ipa里扣出来.(以fzltxh.ttf为例) 2:将fzltxh.ttf文件拷贝到工程中 3:在Info.plist中添加项: Fon ...

  7. 菊花加载第三方--MBprogressHUD 分类: ios技术 2015-02-05 19:21 120人阅读 评论(0) 收藏

    上次说到了网络请求AFN,那么我们在网络请求的时候,等待期间,为了让用户不认为是卡死或程序出错,一般都会放一个菊花加载,系统有一个菊花加载类叫UIProgressHUD.但是我今天要说的是一个替代它的 ...

  8. lower_bound和upper_bound算法实现

    lower_bound算法要求在已经按照非递减顺序排序的数组中找到第一个大于等于给定值key的那个数,其基本实现原理是二分查找,如下所示: int lower_bound(vector<int& ...

  9. TSP问题 遗传算法 智能优化算法

    写了半天,效率还是有点低的,以后有空再优化下: //用次序表示法来表示个体编码 #include<iostream> #include<fstream> #include< ...

  10. UVa 10827 - Maximum sum on a torus

    题目大意:UVa 108 - Maximum Sum的加强版,求最大子矩阵和,不过矩阵是可以循环的,矩阵到结尾时可以循环到开头.开始听纠结的,想着难道要分情况讨论吗?!就去网上搜,看到可以通过补全进行 ...