数据结构思维笔记(十五)持久化

第十五章 持久化

现在我们回顾一下搜索引擎的构建:

  • 抓取:我们需要一个程序,可以下载一个网页,解析它,并提取文本和任何其他页面的链接。
  • 索引:我们需要一个索引,可以查找检索项并找到包含它的页面。
  • 检索:我们需要一种方法,从索引中收集结果,并识别与检索项最相关的页面。

抓取和索引我们之前都处理过,但是还不够好,我们现在先处理索引,存在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();
    }


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