數據結構思維筆記(十五)持久化

第十五章 持久化

現在我們回顧一下搜索引擎的構建:

  • 抓取:我們需要一個程序,可以下載一個網頁,解析它,並提取文本和任何其他頁面的鏈接。
  • 索引:我們需要一個索引,可以查找檢索項並找到包含它的頁面。
  • 檢索:我們需要一種方法,從索引中收集結果,並識別與檢索項最相關的頁面。

抓取和索引我們之前都處理過,但是還不夠好,我們現在先處理索引,存在Redis裏持久化並排序,最後再處理檢索功能。


1.Redis

索引器的之前版本,將索引存儲在兩個數據結構中:TermCounter將檢索詞映射爲網頁上顯示的次數,以及Index將檢索詞映射爲出現的頁面集合。

這些數據結構存儲在正在運行的 Java 程序的內存中,這意味着當程序停止運行時,索引會丟失。僅在運行程序的內存中存儲的數據稱爲“易失的”,因爲程序結束時會消失。

但這個解決方案有幾個問題:

  • 讀取和寫入大型數據結構(如 Web 索引)會很慢。
  • 整個數據結構可能不適合單個運行程序的內存。
  • 如果程序意外結束(例如,由於斷電),則自程序上次啓動以來所做的任何更改都將丟失。

現在我們用Redis解決這個問題。


2.製作基於Redis的索引

此時,梳理一下思路:

  • JedisMaker.java包含連接到 Redis 服務器並運行幾個 Jedis 方法的示例代碼。
  • JedisIndex.java包含此練習的起始代碼。
  • JedisIndexTest.java包含JedisIndex的測試代碼。
  • WikiFetcher.java包含我們在以前的練習中看到的代碼,用於閱讀網頁並使用jsoup進行解析。

你還將需要這些文件,你在以前的練習中碰到過:

Index.java使用 Java 數據結構實現索引。 TermCounter.java表示從檢索項到其頻率的映射。WikiNodeIterable.java迭代jsoup生成的 DOM 樹中的節點。

現在,我們需要做的事是連接Redis服務器:

這裏用的方法是,本地安裝redis,java客戶端推薦用Jedis

下面是具體創建連接及測試的方法:

public class JedisMaker {

    /**
     * @Author Ragty
     * @Description 創建Redis連接
     * @Date 11:52 2019/5/10
     **/
    public static Jedis make() {
        Jedis jedis = new Jedis("localhost",6379);
        return jedis;
    }


    public static void main(String[] args) {

        Jedis jedis = make();

        // String
        jedis.set("mykey", "myvalue");
        String value = jedis.get("mykey");
        System.out.println("Got value: " + value);

        // Set
        jedis.sadd("myset", "element1", "element2", "element3");
        System.out.println("element2 is member: " + jedis.sismember("myset", "element2"));

        // List
        jedis.rpush("mylist", "element1", "element2", "element3");
        System.out.println("element at index 1: " + jedis.lindex("mylist", 1));

        // Hash
        jedis.hset("myhash", "word1", Integer.toString(2));
        jedis.hincrBy("myhash", "word2", 1);
        System.out.println("frequency of word1: " + jedis.hget("myhash", "word1"));
        System.out.println("frequency of word2: " + jedis.hget("myhash", "word2"));

        jedis.close();
    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章