搜索 / NOTEBOOK 课程

41 · 候选缓存、TTL与一致性

逻辑时钟和构造库存;无真实缓存流量

构造机制只读 · 已保存的实验

已有输出来自保存的教学实验,并非打开页面时重新执行。 代码和原始输出保持不变;数据与历史注释保留原始语言。

41 · 候选缓存、TTL与一致性

单元:S11。先修:40、26–28。

来源:王树森固定目录。这是 Lab 自编实验;王树森后四模块只有公开目录,不称原作者完整讲义。

证据边界:逻辑时钟和构造库存;无真实缓存流量。

学习方式:先预测每个对照,再只改一个变量,运行后解释差异。

PYTHON · 01
import numpy as np
import pandas as pd
from IPython.display import display
from reclab.learning.search_curriculum import *

缓存对象

特征缓存存向量,候选缓存存doc IDs,结果缓存含最终排序。此处只实现候选缓存。命中省loader调用,统计的是模拟成本而非毫秒收益。

PYTHON · 02
cache=CandidateCache(ttl=5)
for t in [0,1,2,6]: print(t,cache.get('apple',t,0,lambda:['a','b']))
assert cache.cost==2
print('loader calls',cache.cost)
Notebook 保存的输出 · 本页未执行
0 (['a', 'b'], 'miss')
1 (['a', 'b'], 'hit')
2 (['a', 'b'], 'hit')
6 (['a', 'b'], 'miss')
loader calls 2

陈旧缓存

删除a、generation变更但忽略版本,TTL未到仍命中。只改变check_generation。

PYTHON · 03
stale=CandidateCache(); stale.get('apple',0,0,lambda:['a','b'])
bad,state=stale.get('apple',1,1,lambda:['b'],check_generation=False)
good,state2=stale.get('apple',1,1,lambda:['b'])
print('stale',bad,state,'version checked',good,state2)
assert 'a' in bad and 'a' not in good
Notebook 保存的输出 · 本页未执行
stale ['a', 'b'] hit version checked ['b'] miss

过期与故障回退

空候选可缓存,但短TTL防止持续漏召。后端故障应显式回退词法,不能把错误当空结果。

PYTHON · 04
empty=CandidateCache(ttl=1)
print(empty.get('rare',0,0,lambda:[]))
print(empty.get('rare',2,0,lambda:['d']))
trace=pipeline('phone repair',fail_semantic=True)
assert trace['fallback']=='lexical' and trace['ranking']
print(trace)
Notebook 保存的输出 · 本页未执行
([], 'miss')
(['d'], 'miss')
{'query': 'phone repair', 'intent': 'support', 'lexical': ['c', 'd', 'a', 'b'], 'semantic': [], 'cache': 'miss', 'candidates': ['a', 'b', 'c', 'd'], 'ranking': ['c', 'd', 'a', 'b'], 'fallback': 'lexical', 'empty': False}

成本与差异

固定请求序列,只改TTL;较长TTL提高命中但无generation检查会滞后。无真实延迟测量,不推线上收益。

PYTHON · 05
for ttl in [1,10]:
    c=CandidateCache(ttl); results=[]
    for t in range(4): results.append(c.get('q',t,0,lambda:[str(t)])[0])
    print(ttl,'calls',c.cost,'results',results)
Notebook 保存的输出 · 本页未执行
1 calls 4 results [['0'], ['1'], ['2'], ['3']]
10 calls 1 results [['0'], ['0'], ['0'], ['0']]

本次保存结果的解读

四次访问在TTL=5时只调用loader两次;忽略generation返回已删除a,启用版本检查立即刷新。TTL=1每次重载,TTL=10只重载一次但持续返回旧值;这是命中与新鲜度的构造取舍,并非本机真实服务加速测量。

改参数后应以新输出重新判断,不把这段固定解读当作新的测量。

复盘与练习

写下输入、输出、保持不变的量与本章不能支持的结论。选一个上面的单变量参数先预测再重跑;保留失败例。回到搜索学习路径继续下一语义单元。

继续阅读原文

本章来源

作者课程中文

王树森 · 搜索引擎技术

目录:召回 → 缓存召回

固定版本:六模块目录、9份PDF。查询处理、召回、排序、查询推荐四模块主要是目录,Lab实验为独立教学实现。

学习标记可选,仅保存在当前浏览器中。打开页面不会自动标记已学。