7-1 广告数据索引设计介绍
正向索引
- 正向索引的定义:
通过主健/唯一键生成与对象的映射关系
- 一个简单的例子
倒排索引
- 倒排索引的定义
倒排索引也被称为反向索引,是一种索引方法,它的设计是为了存储在全文搜索下,某个单词在一个文档或一组文档中存储位置的映射。是在文档检索系统中最常用的数据结构。
- 一个简单的例子
- 倒排索引在广告系统中的应用
倒排索引在广告系统中的核心用途是对各个维度限制的整理,我们可以通过一些关键词找到对应的推广单元,譬如:
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 索引慢很多