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);
相關文章
相關標籤/搜索