[Feature request] cache 可以跳过不缓存
skill7899 opened this issue · comments
希望添加的功能
- tag: main_sequence
type: sequence
args:
- exec: $hosts
- exec: jump has_resp_sequence
- matches:
- "!qname $ddnslist"
- "!qname $blocklist"
- "!qname $adlist"
- "!qname $local_ptr"
exec: $lazy_cache
- exec: $redirect
- exec: jump has_resp_sequence
- exec: $query_is_apple_domain
- exec: jump has_resp_sequence
- exec: $query_is_ddns_domain
- exec: jump has_resp_sequence
- exec: $query_is_whitelist_domain
- exec: jump has_resp_sequence
- exec: $query_is_reject_domain
- exec: jump has_resp_sequence
- exec: $query_is_greylist_domain
- exec: jump has_resp_sequence
- exec: $query_is_local_domain
- exec: jump has_resp_sequence
- exec: $query_is_no_local_domain
- exec: jump has_resp_sequence
- exec: $fallback
希望cache可以更灵活,比如远程的dns结果,我不要缓存,
执行到$query_is_no_local_domain 的时候,我不想缓存他的结果,按目前配置是做不到的。
因为我远程的dns是一个fakeIp,缓存起来可能会导致异常。又或者我远程到的ip是一个cdn ip。
我也有曲线求国的办法,就是,cache 成功后判断一下响应结果,要是fakeIp就drop掉,继续执行。
可以exec: !cache 代表这次响应的结果不缓存
比如
- exec: $query_is_no_local_domain
- exec: !cache
- exec: jump has_resp_sequence
或者添加cache的作用域,只在当前的sequence
- matches:
- "!qname $ddnslist"
- "!qname $blocklist"
- "!qname $adlist"
- "!qname $local_ptr"
exec: $lazy_cache
按你贴出来的配置,你这不是已经会条件缓存了吗?为什么还会问远程DNS不缓存的问题,这不是和你上面的意思一样的吗?
在你这个基础上直接把 $query_is_no_local_domain
所使用的数据库 tag
名称添加上去,它不就跳过缓存操作了吗?
希望cache可以更灵活,比如远程的dns结果,我不要缓存
另外 mosdns 是完全支持灵活缓存的,只要在需要的地方(比如国内)给它使用 sequence 内建操作的 exec: cache
就可以了,而不是使用独立的 lazy cache 插件。灵不灵活,主要体验在你怎么写配置文件!
最傻瓜的方法:扔掉你现有所有缓存操作,只在响应中做匹配,命**内 IP 就缓存。
- tag: has_resp_sequence
type: sequence
args:
- matches: "resp_ip $geoip_cn"
exec: $lazy_cache
- matches: has_resp
exec: accept
在你这个基础上直接把
$query_is_no_local_domain
所使用的数据库tag
名称添加上去,它不就跳过缓存操作了吗?
相当于又查了一次$query_is_no_local_domain的匹配了tag了,性能会有所下降
希望cache可以更灵活,比如远程的dns结果,我不要缓存
另外 mosdns 是完全支持灵活缓存的,只要在需要的地方(比如国内)给它使用 sequence 内建操作的
exec: cache
就可以了,而不是使用独立的 lazy cache 插件。灵不灵活,主要体验在你怎么写配置文件!最傻瓜的方法:扔掉你现有所有缓存操作,只在响应中做匹配,命**内 IP 就缓存。
- tag: has_resp_sequence type: sequence args: - matches: "resp_ip $geoip_cn" exec: $lazy_cache - matches: has_resp exec: accept
这样就重复匹配了,每次查询到的结果都要去匹配国内IP,要是还有域名,还得再匹配域名。现在cache的作用域就是只要出现在调用中,最后回来的结果都会cache上。没有丢弃的选项。要是多一个丢弃项,或者在当前sequence选项生效。会更加灵活
mosdns 的规则匹配都是在内存里进行,常规的设备下多庞大的规则量都是微秒单位完成匹配(按当时的 mosdns v4 debug 日志表现来讲)。只要不是部署在公网给大众使用的,这种所谓性能下降完全可以无视。
真设备性能差到爆的话,直接用 sequence 的 cache 按需对某个 tag 做缓存,比如只对 query_is_local_domain 执行,这种情况 0 额外匹配,它单纯是个执行序列
拿到应答后,把 ttl 改成 1,就可以”近似跳过“缓存。
可以全缓存 然后匹配fakeip地址的请求再去请求一次clash-dns 相当于强制刷新了吧