Rego函数调用是否会被记忆化?单次查询内相同调用是否仅执行一次
Rego 单次查询执行的函数记忆化行为结论
你给出的示例代码中,规则foo和bar使用的val是myFunc单次调用返回的同一结果,该行为是Rego语义明确保证的。
核心机制说明
- Rego 采用惰性求值 + 记忆化(memoization) 的求值模型,在单次查询的完整执行周期内,所有入参完全一致的函数调用、所有绑定完成的变量值都会被缓存,不会重复触发求值逻辑。
- 示例中的
val := myFunc(...)属于模块级变量绑定,该绑定只会在查询启动的初始化阶段执行一次myFunc调用完成赋值,后续所有位置对val的引用都会直接读取缓存的赋值结果,不会重复调用myFunc。
边界注意事项
即使你定义的
myFunc是非幂等函数(相同入参可能返回不同结果),上述单次查询内的缓存行为依然生效。但记忆化缓存的生命周期仅绑定单次查询,不同查询请求之间不会共享缓存,每次新查询都会重新执行myFunc完成初始求值。
常见写法验证
就算不抽离val变量,直接把函数调用写在两个规则内部:
foo { myFunc(...).a } bar { myFunc(...).b }
只要两处myFunc的入参完全一致,Rego依然只会执行一次myFunc调用,两个规则读取到的返回值还是同一份缓存结果,不会出现两次调用返回值不一致的情况。
内容的提问来源于stack exchange,提问作者lencharest
相关产品推荐
相关产品推荐

