1. 程式人生 > >讀書筆記App研發錄--資料快取設計

讀書筆記App研發錄--資料快取設計

讀書筆記App研發錄–資料快取設計

標籤(空格分隔): 資料快取 android 優化

資料快取策略

在2G和3G網路狀態下,MobileApi訪問速度過慢,會導致不好的使用者體驗。網路端的資料接受的限制主要是傳輸速度的限制。
策略

  • 減少MobileApi的呼叫次數
  • App快取時間。分時間段呼叫,一段時間使用快取資料

App快取只使用於資料即時性要求不高的資料。當然也可以根據具體的需求調節App快取時間

即使對於同一個MobileApi,傳入的引數不同,快取也應該是不同的

最簡單的時間引數,在不同的時間獲取的天氣情況,date=A和date=B 應該分別對應兩個快取資料。不能存放在一起。

快取位置

  • SD卡

App資料快取較大,在記憶體中極易被GC回收。

存放方式

資料快取應該在網路層完成
a) url.xml中為每一個MobileApi介面配置快取時間Expired,對於Post,一律設定為0

public class URLData {
    private String key;
    private long expires; // 配置時間
    private String netType;
    private String url;
    private String mockClass;
}

b) 寫一個排序演算法sortKets,對URL中的key進行排序

void sortKeys() {
        for (int i = 1; i < parameter.size(); i++) {
            for (int j = i; j > 0; j--) {
                RequestParameter p1 = parameter.get(j - 1);
                RequestParameter p2 = parameter.get(j);
                if (compare(p1.getName(), p2.getName())) {
                    // 互動p1和p2這兩個物件,寫的超級噁心
String name = p1.getName(); String value = p1.getValue(); p1.setName(p2.getName()); p1.setValue(p2.getValue()); p2.setName(name); p2.setValue(value); } } } } // 返回true說明str1大,返回false說明str2大 boolean compare(String str1, String str2) { String uppStr1 = str1.toUpperCase(); String uppStr2 = str2.toUpperCase(); boolean str1IsLonger = true; int minLen = 0; if (str1.length() < str2.length()) { minLen = str1.length(); str1IsLonger = false; } else { minLen = str2.length(); str1IsLonger = true; } for (int index = 0; index < minLen; index++) { char ch1 = uppStr1.charAt(index); char ch2 = uppStr2.charAt(index); if (ch1 != ch2) { if (ch1 > ch2) { return true; // str1大 } else { return false; // str2大 } } } return str1IsLonger; }

c ) 將newUrl作為新key,檢查是否存在快取資料,有,返回

if (urlData.getExpires() > 0) {
                    final String content = CacheManager.getInstance()
                            .getFileCache(newUrl);
                    if (content != null) {
                        handler.post(new Runnable() {

                            @Override
                            public void run() {
                                requestCallback.onSuccess(content);
                            }

                        });

                        return;
                    }
                }

d )否則繼續呼叫MobileApi從網路端獲取資料,並存入快取

{
                        // 把成功獲取到的資料記錄到快取
                        if (urlData.getNetType().equals(REQUEST_GET)
                                && urlData.getExpires() > 0) {
                            CacheManager.getInstance().putFileCache(newUrl,
                                    responseInJson.getResult(),
                                    urlData.getExpires());
                        }

                        handler.post(new Runnable() {

                            @Override
                            public void run() {
                                requestCallback.onSuccess(responseInJson
                                        .getResult());
                            }

                        });

                        // 儲存Cookie
                        saveCookie();
                    }

e )其中CacheManager的putFileCache()完成了資料的唯一性操作(MD5)

public void putFileCache(final String key, final String data,
            long expiredTime) {
        String md5Key = BaseUtils.getMd5(key); // 根據Url產生唯一的MD5

        final CacheItem item = new CacheItem(md5Key, data, expiredTime);
        putIntoCache(item);
    }

f )MD5加密的實現

 public static String getMd5(final String s)
    {
        try
        {
            // Create MD5 Hash
            final MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
            digest.update(s.trim().getBytes());
            final byte messageDigest[] = digest.digest();
            return BaseUtils.toHexString(messageDigest);
        }
        catch (final NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        return s;
    }

    /**
     * 轉換為十六進位制字串
     * 
     * @param b
     *            byte陣列
     * @return String byte陣列處理後字串
     */
    public static String toHexString(final byte[] b)
    {// String to byte
        final StringBuilder sb = new StringBuilder(b.length * 2);
        for (final byte element : b)
        {
            sb.append(BaseUtils.HEX_DIGITS[(element & 0xf0) >>> 4]);
            sb.append(BaseUtils.HEX_DIGITS[element & 0x0f]);
        }
        return sb.toString();
    }

g )最後將可序列化的Object型別,序列化到本地

public static final void saveObject(String path, Object saveObject) {
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        File f = new File(path);
        try {
            fos = new FileOutputStream(f);
            oos = new ObjectOutputStream(fos);
            oos.writeObject(saveObject);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (oos != null) {
                    oos.close();
                }
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

強制更新

在RemoteService暴露出一個boolean型別的引數,用於判斷是否要遵從App端的快取快取策略,如果是,則在從url.xml中讀資料的時候(UrlData實體),將其expired強制設定為0。

public void invoke(final BaseActivity activity, 
            final String apiKey,
            final List<RequestParameter> params,
            final RequestCallback callBack
            final boolean forceUpdate) {

            if(forceUpdate) {
            urlData.setExpires(0);
            }
    }

相關推薦

讀書筆記App研發--資料快取設計

讀書筆記App研發錄–資料快取設計 標籤(空格分隔): 資料快取 android 優化 資料快取策略 在2G和3G網路狀態下,MobileApi訪問速度過慢,會導致不好的使用者體驗。網路端的資料接受的限制主要是傳輸速度的限制。 策略 減少Mo

App 研發、架構設計、Crash分析和競品技術分析------讀書筆記(第二章)

網路底層框架設計 1、不要自己定義網路請求框架,網路層不要使用AsyncTask 2、在網路返回資料Response的應該有一個規範的格式 { "isError":true, "errorType":1, "errorMessa

Redis開發與運維讀書筆記-第十一章-快取設計

快取能夠有效地加速應用的讀寫速度,同時也可以降低後端負載,對日常應用的開發至關重要。但是將快取加入應用架構後也會帶來一些問題. 1 快取的收益和成本 收益如下:·加速讀寫:因為快取通常都是全記憶體的(例如Redis、Memcache),而儲存層通常讀寫效能不夠強悍(例如M

APP研發讀書筆記:網路底層框架設計

一.統一響應實體類Response      我們一般採用JSON作為API返回結果,資料格式一般為: { "errorCode":0, "errorMessage":""; "res

App研發讀書筆記

這本書基本上涵蓋了移動開發中常見的關注點,之所以用關注點而不用技術點這個詞是因為這本書並沒有講到具體的技術實現,但提供了行之有效的解決方案。讀這本書的時候非常有感觸,它很多的框架設計和解決方案與我

APP研發讀書筆記(1、重構)

1、重新規劃Android專案結構 將主專案中的類分門別類的進行劃分,放置在各種包中 詳細介紹如下: activity:所有的activity放在同一個包中,細分的話,將不同模組的activity劃分到不同的包下。 adapter:將所有的介面卡放在一塊

架構設計APP研發學習筆記

一、APP研發錄總結 1、重構的憂傷 如果版本發行後很短的時間內,就需要對其進行重構,除了小部分其他原因外,最重要的只能說是程式碼寫的爛,架構設計不夠靈活,導致耦合度很高。 要是非得要做重構,必須充分考慮現有資源,在非極端情況下,可

Redis設計與實現讀書筆記之第一部分: 資料結構與物件

(一) 簡單動態字串SDS Redis沒有直接使用C語言傳統的字串表示(以空字串結尾的字串),而是構建了簡單動態字串SDS,其定義 struct sdshdr{ int len; //記錄buf陣列中已使用位元組的數量 int free; //記錄buf

APP研發筆記

最近兩天在專案不忙的時候讀了《APP研發錄》,雖然是看的PDF版,但還是受益匪淺,由於時間關係,還沒有對其中的問題進行demo驗證, 僅對一些重要內容做了筆記,現將筆記貼出來與大家共同學習,如果有問題,大家可以留言或私信。在今後的額閱讀中,再對筆記的內容進行補充說明。 面

App研發 架構設計 Crash分析和App競品技術分析

第1章原始碼:  1.1 重新規劃Android專案結構  1.1.zip  1.2 為Activity定義新的生命週期 1.2.zip  1.3 統一事件程式設計模型      1.3.zip  1.5 Adapter模板   1.5.zip  1.6 型別安全轉換函式   1.6.zip  第2章原

讀書筆記___C++沉思(第17節)

泛型演算法就是一種對其所作用的資料結構做盡可能少的約束的方式表達的演算法  以一個簡單的查詢整數陣列中的第一個等於某個值的元素為例 /* 在這個例子中,我們做了四個約束: 分別是查詢的型別是int值 我們對int陣列進行查詢 我們預先已經知道了元素的書目 我們已經預先知道了

這個好用高效的讀書筆記app軟體一定要收藏

開啟軟體首頁就是卡片式的讀書筆記,可以上下左右滑動切換下一條筆記。首頁筆記的推薦是系統根據你原來做的筆記或者看你點贊評論等行為智慧推薦的。切換到下一條後就無法返回到上一條筆記。 點選底部中間的相機按鈕會彈出拍照掃描識別功能的選項,可以選擇圖片或者使用相機拍攝。長按會直接進入建立流

親測這款讀書筆記app軟體能提高你的閱讀興趣

實在是用過太多筆記類app了,但是真正針對讀書做筆記這個場景使用的讀書筆記app很少。今天就給大家帶來一款實測過的軟體。絕對無毒無廣告。 開啟軟體就是第一張圖的畫面,頁面下面就三個按鈕,非常簡潔,甚至說有點簡陋吧。中間那個相機的按鈕點一下就可以使用相機拍照自動錄入書籍片段。長按的話就會

強迫症患者都必須具備的讀書筆記app軟體

特意在手機應用商店搜了下“讀書筆記”四個字,發現出來的都是一些有道雲筆記、印象筆記這些在工作辦公中使用的筆記工具,再往下翻就是一些微信閱讀、愛奇藝閱讀之類的看書app,真正針對讀書做筆記這個場景使用的讀書筆記app軟體很少。 再往下翻你也找不到“流書”這個軟體,雖然流書的主要功能就是拿來

有哪些好用的讀書筆記app

首先需要明辨的是筆記app和讀書筆記app是有很大的差別,大部分的筆記app都是生活辦公中使用,而且這類app要麼分高階賬號,要麼按月按年收費。 再就是專門單獨做讀書筆記的app也很少,大部分都是放在閱讀軟體裡面去了。像微信閱讀、網易蝸牛閱讀都是以看書為主,在看書瀏覽介面附帶著有做筆記的

推薦一款看書學習必備的讀書筆記app

如果你是看網路小說這種沒有深度的書籍倒是不需要做筆記,但是很明顯我們看書不僅僅是消遣時間。既然如此那就需要我們在閱讀時能隨時隨地記錄下自己的靈感。 你在應用商店裡搜尋“筆記”大都出現的是一些生活辦公中使用的。在閱讀看書這個場景中使用的讀書筆記app很少,再減去收費的有廣告的,正真能用做的

推薦一款精美小眾的讀書筆記app

各類應用商店裡關於筆記類的工具非常多,但是它們的使用場景大多是工作辦公中,像有道雲筆記、網易雲筆記、印象筆記等,而且這類筆記幾乎都有高階賬號,一些功能只有花錢購買高階賬戶才可以使用。 真正針對讀書做筆記這個使用場景來設計的app確實不多,掰著手指頭也就那麼幾個,找個時間給大家做個評測合集

精益資料分析讀書筆記——第五章-資料分析框架

戴夫·麥克盧爾的海盜指標說——AARRR 獲取使用者(Acquisition)、提高活躍度(Activation)、提高留存率(Retention)、獲取營收(Revenue)、自傳播(Referral) 要素 功用 相關指標 方式 獲取使用者

golang資料快取設計與原始碼實現

1. 實際需求 資料快取是指將一些資料儲存到快取中,以調高提高系統讀效能。使用時再從快取中取回。 它也是更高階快取特性的基礎,對於讀多寫少的應用場景,我們經常使用快取來進行優化。 1.1 應用場景 例如對於使用者的餘額資訊表account(uid, mone

《Oracle PL/SQL 完全自學手冊》讀書筆記 第5章 資料的增、刪、改-- 5.3.4 TRUNCATE與DELETE的區別

TRUNCATE的作用是清空一個表格,在刪除資料方面,它與DELETE有如下一些區別: 在資料處理功能上,TRUNCATE是清空一個表的所有內容,它相當於DELETE FROM TABLE_NAME DELETE是DML操作,而TRUNCATE是DDL操作。因此,用DELE