報表資料的可控快取
使用快取可以提升報表效能是一個共識,一般高階報表工具都會提供報表快取功能,將整個報表計算結果快取在檔案系統中,以便使用者下次訪問引數相同的報表時可以快速讀取快取結果進行展現。潤乾報表作為報表工具的領軍品牌,當然也具有這種常規的快取功能。
但在有些情況下,報表開發人員還希望進一步控制快取的內容,比如對於快取內容,可能只想快取一部分而不是整個報表結果,或者能夠讓其它報表或程式複用快取內容,又比如對於超時設定,可能希望為不同的快取結果設定不同的超時時間。這些需求都來自於實際業務中需要應對的資料量和實時性方面的不同情況,也是一般報表工具的快取功能無法滿足的。
潤乾報表內建了可程式設計的資料計算引擎(結合集算器實現),允許開發人員靈活控制快取內容,稱為可控快取。可控快取能夠帶來更大的靈活性,下面就前面提到的三點展開介紹。
1、快取部分結果
在報表開發中,有時並不希望將所有報表結果進行快取,避免耗費過高的快取成本(磁碟空間和應用伺服器資源開銷)。另外,當報表中的部分資料實時性要求很高,需要實時與資料庫互動進行資料查詢,那麼就並不適合進行快取。這種情況下,透過潤乾報表的可控快取可以將變化不太頻繁的中間結果快取起來。當報表再次請求時,實時性要求高的資料仍然從資料庫中讀取,同時結合快取中的非實時資料進行報表計算,得到最終報表結果集。常規快取方案中沒有這種快取部分結果的功能,只能設定整個報表是否進行快取,這樣報表在涉及資料的不同時效性時就必須平衡兩者的矛盾,而潤乾報表在這方面顯然更加靈活,效率更高。
2、快取結果複用
潤乾報表中可控快取是可以複用的,一個報表的快取結果(部分或全部)可以被其他報表或程式讀取並使用,而不必像常規報表快取方案那樣重複快取同樣的結果,這顯然也會大幅度提高快取的整體效率。當其他報表或程式使用某個報表的快取結果時,只需從快取(一般是磁碟檔案)中讀取,並與報表中其他資料來源(可能是 DB、檔案,或是另一個報表的快取)進行混合運算,就能得到報表需要的結果集,處理方式和快取部分結果的方式類似。常規的報表快取以報表模板為單位進行快取,彼此無法複用,會造成相當的資源浪費,增加不小的效能開銷,而潤乾報表在這方面同樣體現了靈活和高效。
3、設定不同超時時間
快取機制中一定會有超時時間,過時的快取會被清除,報表再訪問時再重新快取。一般報表工具的快取超時時間在配置檔案中設定,如通常的 3600s 或 7200s,這種設定往往作用於對單張報表的所有引數,有時甚至作用於所有報表。換句話說,整個報表甚至整個系統都必須使用同樣的設定。
這種做法顯然效能不高,如果能夠針對不同的報表場景設定不同的超時時間,自然會更有效。比如,針對大量歷史資料進行查詢的報表,由於歷史資料一般很少變化,我們希望報表的快取結果可以儲存較長時間,相應地設定較長的超時時間;而針對資料變化頻繁,實時性要求較高的報表則設定較短的超時時間,以便滿足資料的實時性要求。
潤乾報表的結果快取允許開發人員針對不同的報表設定不同的超時時間,以應對不同的報表場景。這種做法同樣提供了更高的靈活性,使得報表快取成為真正意義上的可控。
舉例
可控快取的具體實現可以參考潤乾報表的相關文件資料,這裡只是透過一個簡單的例子說明一下結果快取的使用方法:
首先使用潤乾報表內建的集算器編寫指令碼生成和讀取快取檔案,這個過程處於報表資料來源的計算階段。
A | B | C | |
---|---|---|---|
1 | E:\work\esProc\ | / 快取目錄 |
|
2 | =“sales_”+string(d_date) | / 快取檔名,報表名 + 引數 (dfxName_ParamName) |
|
3 | =file(A1+A2) |
|
|
4 | if A3.exists()&& interval@s(A3.date(),now())<3600 | result A3.import@b() | end |
5 | =connect(“demo”) |
|
|
6 | =A5.cursor(“SELECT 客戶 ID,sum( 單價 * 數量) 訂單總額 FROM 訂單, 訂單明細 WHERE 訂單. 訂單 ID= 訂單明細. 訂單 ID and year(訂購日期)>? group by 客戶 ID order by 訂單總額 desc”,d_date) |
|
|
7 | =A6.fetch(5) | >A5.close() |
|
8 | =A3.export@b(A7) | / 生成快取檔案 |
|
9 | return A7 | / 為報表返回結果集 |
|
上述指令碼首先指定快取目錄,並根據引數設定快取檔名稱,再根據檔名查詢快取檔案是否存在(A4)。若存在且未超時則直接讀快取,否則直接連線資料庫取數運算,並將計算結果生成快取檔案。
對比一下,如果報表中不使用快取,那麼指令碼只需要這樣編寫:
A | B | |
---|---|---|
1 | =connect(“demo”) |
|
2 | =A1.cursor(“SELECT 客戶 ID,sum( 單價 * 數量) 訂單總額 FROM 訂單, 訂單明細 WHERE 訂單. 訂單 ID= 訂單明細. 訂單 ID and year(訂購日期)>? group by 客戶 ID order by 訂單總額 desc”,d_date) |
|
3 | =A2.fetch(5) | >A1.close() |
4 | return A3 |
|
然後,只需要在潤乾報表中呼叫上述集算指令碼,編輯報表表示式就可以完成報表製作了。
需要注意的是,潤乾報表的可控快取也有其適用場景,並不能完全取代常規快取。常規快取手段會連同報表計算結果以及呈現屬性一起儲存,而這裡的可控快取只快取資料,在呈現時還要再次進行外觀計算,因此更適用於資料計算強度較高,外觀計算強度較低的場景。實際應用中,兩者可以結合使用。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2667645/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 清除 Electron 中的快取資料快取
- 快取淘汰、快取穿透、快取擊穿、快取雪崩、資料庫快取雙寫一致性快取穿透資料庫
- 清除 Nuxt 資料快取:clearNuxtDataUX快取
- Web快取知多少(快取機制和資料儲存)Web快取
- MYSQL---SQL語句的資料快取MySql快取
- 【UniApp】-uni-app-資料快取APP快取
- Python操作Redis快取資料庫PythonRedis快取資料庫
- 前端快取API請求資料前端快取API
- 微信清除快取資料方法快取
- 加班做報表被嘲低效!快用大資料分析工具大資料
- 用於Electron/Nodejs的資料持久快取庫NodeJS快取
- 分散式快取--快取與資料庫強一致場景下的方案分散式快取資料庫
- 分散式快取--快取與資料庫一致性方案分散式快取資料庫
- [20181119]firefox更改快取資料夾.txtFirefox快取
- Redis快取資料庫-快速入門Redis快取資料庫
- 從 0 學習 Spring 快取資料Spring快取
- 阿里一面:關於【快取穿透、快取擊穿、快取雪崩、熱點資料失效】問題的解決方案阿里快取穿透
- 皕傑報表之引數為NULL時,取全部資料Null
- 快取與資料庫的一致性快取資料庫
- MySQL 資料庫的提速器-寫快取(Change Buffer)MySql資料庫快取
- PbootCMS快取如何清理runtime資料夾下經常滿怎麼辦?清理快取的方法boot快取
- Redis快取穿透、擊穿、雪崩,資料庫與快取一致性Redis快取穿透資料庫
- 究竟先操作快取,還是資料庫?快取資料庫
- SpringBoot 實戰 (十一) | 整合資料快取 CacheSpring Boot快取
- Redis中快取二進位制資料Redis快取
- 前端讀取Excel表中資料前端Excel
- 一學就會!快來領取你的Smartbi資料視覺化圖表分類指南視覺化
- Redis的快取穿透、快取雪崩、快取擊穿的區別Redis快取穿透
- iOS雜湊表快取窺探iOS快取
- 關於redis快取資料庫的一些思考Redis快取資料庫
- 使Instagram.com更快的三個步驟:預取資料、推送資料和使用快取 -Instagram Engineering快取
- 使用Redis和Java進行資料庫快取 - DZone資料庫RedisJava資料庫快取
- 快取穿透、快取擊穿、快取雪崩、快取預熱快取穿透
- Stimulsoft Reports報表使用者手冊:資料帶中的交叉表報表
- 從CPU快取看快取的套路快取
- 報表從資料庫中採集相關資料生成報表,資料太少怎麼辦?資料庫
- PB級資料持久化快取系統——lest持久化快取
- 快取與資料庫一致性快取資料庫