StackExchange.Redis - 禁用使用 EVALSHA?

4

当停止并重新启动Redis服务器时,通过Redis发送内容会引发以下错误:"StackExchange.Redis.RedisServerException:NOSCRIPT No matching script. Please use EVAL。"

我的理解是,当服务器不记得具有SHA1摘要的脚本时,就会出现此错误。我猜测服务器在重新启动时会删除缓存的脚本 - 应该如何处理?

1个回答

4
该库会在内部检测到此错误并清除已知好的脚本的本地缓存,因此库将自我修复,并且下一次调用脚本时将自动发出SCRIPT LOAD。如果您正在使用*Async API,则它不会自动重新发出此命令,因为无法理解调用方想要发生什么以及是否已经有相关命令正在执行中。但是,当使用非*Async API时,它知道这不是问题,因此会自动为您重新发出命令而不显示错误。
重新启动redis服务器是相当罕见的事件,但我认为在断开连接时可以合理地更改以刷新脚本缓存。

更新:我现在跟踪运行ID的更改, 这个ID唯一标识一个服务器运行(因此需要重启)。如果这个ID发生变化,脚本缓存将被清除。


是的,我认为当服务器重新启动时,你应该有能力清除客户端的缓存。我会在GitHub上开一个问题,你能否尽快查看一下? - Abhishek Nanda
@Abhishek 是的,我也这么认为。请注意,我们不一定知道服务器是否已重新启动(尽管我可能能够在上级服务器上检查运行ID),我们能够保证检测到的是断开连接。 - Marc Gravell
@MarcGravell,我们也使用异步API。从您发布的PR中可以看到,您清除了脚本,但是您是否重新加载了它们?我们遇到了一个问题,即库在刷新脚本后不会重新加载它们,因此我们需要通过强制显式重新加载来处理它,作为一种解决方法的权宜之计。 - fiskra
@fiskra FlushScriptCache 不会清除 Redis 中的脚本;它只会清除客户端中已知的内容,也就是说,下次使用脚本时,它应该自动执行 SCRIPT LOAD,因为它假设脚本不在服务器上。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接