7-1 广告数据索引设计介绍

正向索引

  • 正向索引的定义:

通过主健/唯一键生成与对象的映射关系

  • 一个简单的例子

image.png

倒排索引

  • 倒排索引的定义

倒排索引也被称为反向索引,是一种索引方法,它的设计是为了存储在全文搜索下,某个单词在一个文档或一组文档中存储位置的映射。是在文档检索系统中最常用的数据结构。

  • 一个简单的例子

image.png

  • 倒排索引在广告系统中的应用

倒排索引在广告系统中的核心用途是对各个维度限制的整理,我们可以通过一些关键词找到对应的推广单元,譬如:
image.png

7-2 广告数据索引维护介绍

全量索引与增量索引

  • 全量索引

检索系统在启动时一次性读取当前数据库中的所有数据,建立索引

  • 增量索引

系统运行过程中,监控数据库的变化,实时加载更新,创建索引

7-3 推广计划索引对象定义与服务实现

[源码链接]

7-4 推广单元索引对象定义与服务实现

[源码链接]

7-5 关键词索引对象定义与服务实现

[源码链接]

7-6 兴趣索引对象定义与服务实现

[源码链接]

7-7 地域索引对象定义与服务实现

[源码链接]

7-8 创意索引对象定义与服务实现

[源码链接]

7-9 创意与推广单元关联索引对象定义与服务实现

[源码链接]

7-10 索引服务类缓存的实现

[源码链接]

7-11 思考

索引数据的存储与操作使用了 JUC 包,也就是线程安全的集合类,可否使用 HashMap,HashSet 来进行替换呢?

首先,检索服务是不会修改数据的,所以,如果我们的广告服务仅仅是检索那么换成 HashMap,HashSet 没有任何问题。不过我们需要对广告服务进行更新操作,在这个过程中,我们会监听 MySQL 的 Binlog,完成增量更新,而这些操作是多线程的,所以务必要使用支持并发的数据结构。

如果广告数据太多,内存中放不下,怎么做?

在我们设计的广告系统中,数据都是放在本地 JVM 中的,如果数据太多,放在本地内存肯定是不合适的。我们可以使用 Redis 分布式缓存来进行改造。

这样做有利有弊:

有利的一面:

  • 不需要在每个实例中都维护索引了,同步的问题可以忽略掉
  • 没有内存的限制,可以无上限加载我们的广告数据

有弊的一面:

  • 访问 Redis 存在网络耗时
  • 数据需要序列化和反序列化,在速度上比 JVM 索引慢很多