数据结构思维笔记(十五)持久化
程序员文章站
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();
}
}
上一篇: requests访问百度
下一篇: Git笔记(杂乱无章,慎入)