欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-08 09:59:37
...

第十五章 持久化

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

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

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


}
相关标签: 持久化 redis