CRL快速开发框架系列教程五(使用缓存)
本系列目录
- CRL快速开发框架系列教程一(Code First数据表不需再关心)
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
- CRL快速开发框架系列教程三(更新数据)
- CRL快速开发框架系列教程四(删除数据)
- CRL快速开发框架系列教程五(使用缓存)
- CRL快速开发框架系列教程六(分布式缓存解决方案)
- CRL快速开发框架系列教程七(使用事务)
- CRL快速开发框架系列教程八(使用CRL.Package)
- CRL快速开发框架系列教程九(导入/导出数据)
- CRL快速开发框架系列教程十(导出对象结构)
- CRL快速开发框架系列教程十一(大数据分库分表解决方案)
- CRL快速开发框架系列教程十二(MongoDB支持)
- CRL快速开发框架系列教程十三(嵌套查询)
正文
缓存功能是CRL一大特色,使用起来再简单不过了
从数据库查询,到缓存调用,只是一个方法名的区别,创建维护全自动
如:
从数据库查
var item = Code.ProductDataManage.Instance.QueryItem(b => b.Id==1)
从缓存查
var item = Code.ProductDataManage.Instance.QueryItemFromCache(b=>b.Id==1);
查询多项
var list = Code.ProductDataManage.Instance.QueryFromCache(b => b.Id < 10);
缓存了多少数据
默认是缓存了对应表的所有数据,可以在管理类中重写查询指定缓存哪些数据
还可以按查询指定数据多长时间过期
这里是完整的查询语法,自由度很大,注意返回的结果类型
如下表示: 查询ID小于1000,过期时间为10分钟
public class ProductDataManage : CRL.BaseProvider<ProductData>
....
protected override CRL.LambdaQuery.LambdaQuery<ProductData> CacheQuery()
{
return GetLambdaQuery().Where(b => b.Id < 1000).Expire(10);
}
缓存过期了怎么办
如上面指定的是10分钟过期,到10分钟后会再次调用会返回什么,空值?老数据?
当然不是,CRL有缓存管理机制,并且是异步的,缓存创建后,后台线程会监视对应的缓存,如果到达了设定的过期时间
按原SQL查询(如上面重写的CacheQuery方法)重新查询,转换为对应的对象,加载到内存
缓存查找效率
内存查找也是比较费资源的事,特别是数据比较多的情况下,有没有优化的可能?
一般我们会按主键查询某个数据,这种情况比较多,CRL针对这种情况作了优化
如上面查询:
var item = Code.ProductDataManage.Instance.QueryItemFromCache(5);
从所有数据里查询主键为5的数据,看上去为
datas.FindAll(b=>b.Id==5)
实际查询为
if (datas.ContainsKey(id))
{
return datas[id];
}
CRL缓存数据结构是Dictionary<string, TModel>
在按主键查询的情况下,效率会高很多
将查询结果转换为缓存
除了按管理类绑定的缓存外,还可以装任意查询转换为缓存
var query = Code.ProductDataManage.Instance.GetLambdaQuery();
//缓存会按条件不同缓存不同的数据,条件不固定时,慎用
query.Where(b => b.Id < 700);
int exp = 10;//过期分钟
query.Expire(exp);
var list = query.ToList();
这时创建的查询缓存会按参数值不同,缓存N个结果,也是比较好用的
手动维护缓存
缓存一般情况下是自动维护的,也可以手动维护
获取缓存列表
var caches = CRL.MemoryDataCache.CacheService.GetCacheList();
在页面上显示
<table border="1" style="width:100%">
<tr>
<td class="auto-style5">KEY</td>
<td class="auto-style2">数据类型</td>
<td class="auto-style3">过期(分)</td>
<td class="auto-style4">上次更新</td>
<td width="50">行数</td>
<td width="200">查询</td>
<td width="100">参数</td>
<td width="40">操作</td>
</tr>
<%
foreach(var item in caches)
{
%>
<tr>
<td class="auto-style5"><%=item.Key %></td>
<td class="auto-style2"><%=item.DataType %></td>
<td class="auto-style3"><%=item.TimeOut %></td>
<td class="auto-style4"><%=item.UpdateTime %></td>
<td><%=item.RowCount %></td>
<td><%=item.TableName %></td>
<td><%=item.Params %></td>
<td><a href="?type=update&key=<%=item.Key %>" target="_blank">更新</a></td>
</tr>
<%} %>
</table>
运行如图

通过KEY更新缓存
string key = Request["key"];
var a = CRL.MemoryDataCache.CacheService.UpdateCache(key);
CRL快速开发框架系列教程五(使用缓存)的更多相关文章
- CRL快速开发框架系列教程六(分布式缓存解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程十三(嵌套查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程十二(MongoDB支持)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程十一(大数据分库分表解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程十(导出对象结构)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程九(导入/导出数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程七(使用事务)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程三(更新数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
随机推荐
- [NodeJS] 优缺点及适用场景讨论
概述: NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以及它适用于什么场景呢? 本文就个人使用经验对这些问题进行探讨. 一. ...
- Java多线程基础——对象及变量并发访问
在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...
- 【翻译】MongoDB指南/CRUD操作(一)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删 ...
- [C#] C# 知识回顾 - 委托 delegate
C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...
- 一个IT人的成长路
毕业四年多了,来深圳三年多了,经历了刚毕业的懵懂少年,成长为现在的成熟稳重青年.职场上,从刚毕业的小白,成长为现在可以成熟应对各种事情的老司机.经历过从初级研发工程师,到中级研发工程师,到高级研发工程 ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- python 数据类型 --- 集合
1. 注意列表和集合的区别 set 列表表现形式: list_1 = [1,3,4]; 集合表现形式:set_1= set() list_1 = [1,2,3,4,23,4,2] print(lis ...
- 数塔问题(DP算法)自底向上计算最大值
Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数 ...
- ILJMALL project过程中遇到Fragment嵌套问题:IllegalArgumentException: Binary XML file line #23: Duplicate id
出现场景:当点击"分类"再返回"首页"时,发生error退出 BUG描述:Caused by: java.lang.IllegalArgumentExcep ...
- DataTable转换成IList<T>的简单实现
DataTable的无奈 很多时候,我们需要去操作DataTable.但DataTable的操作,实在是太不方便了.Linq?lambda表达式?统统没有... 特别是对现有结果集做进一步筛选,这样的 ...