CRL快速开发框架系列教程五(使用缓存)

本系列目录

  1. CRL快速开发框架系列教程一(Code First数据表不需再关心)
  2. CRL快速开发框架系列教程二(基于Lambda表达式查询)
  3. CRL快速开发框架系列教程三(更新数据)
  4. CRL快速开发框架系列教程四(删除数据)
  5. CRL快速开发框架系列教程五(使用缓存)
  6. CRL快速开发框架系列教程六(分布式缓存解决方案)
  7. CRL快速开发框架系列教程七(使用事务)
  8. CRL快速开发框架系列教程八(使用CRL.Package)
  9. CRL快速开发框架系列教程九(导入/导出数据)
  10. CRL快速开发框架系列教程十(导出对象结构)
  11. CRL快速开发框架系列教程十一(大数据分库分表解决方案)
  12. CRL快速开发框架系列教程十二(MongoDB支持)
  13. CRL快速开发框架系列教程十三(嵌套查询)

 正文html

缓存功能是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);

缓存了多少数据

默认是缓存了对应表的全部数据,能够在管理类中重写查询指定缓存哪些数据ide

还能够按查询指定数据多长时间过时post

这里是完整的查询语法,自由度很大,注意返回的结果类型大数据

以下表示: 查询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);
相关文章
相关标签/搜索