如何避免Lua脚本限制中的Redis调用?

我正在设置将使用Redis和APCu的PHP标记的缓存实现。由于APC是键值存储,因此我将使用Redis进行键标记关系,并与APC上的每个Web服务器进行同步。

我当前的问题仅涉及Redis。可能您知道实现,但需要明确说明:键可以具有与之关联的标签。在以后的某个时间点,您可以通过某些标签删除缓存的密钥。有很多键,但没有那么多标签,并且键和标签之间存在n对n的关系。

set(key, value, tags) 由组成:

SET key value

foreach tag in tags

SADD tag key

因为设置后无需检索或更改标签,所以我只需要保持标签与密钥的关系。

deleteByTag(tags)

keys = SUNION tag1 tag2 tag3...

DEL key1 key2 key2...

为了使事情更快,我创建了2个简单的lua脚本,将它们脚本加载并调用EVALSHA。

Lua 脚本:

redis.call('set', KEYS[1], KEYS[2])

for _, tag in pairs(ARGV) do

redis.call('sadd', tag, KEYS[1])

end

EVALSHA setHash 2 key value tag1 tag2 tag3...

我遇到的 脚本看起来像这样:

redis.call('del', unpack(redis.call('sunion', unpack(ARGV))))

redis.call('del', unpack(ARGV))

EVALSHA deleteByTagHash 0 tag1 tag2 tag3...

一切都很好,除非redis.call('sunion',

unpack(ARGV))返回很多键。看起来Lua对方法可以拥有的参数数量有严格的限制。在我的环境中是8000。

我想知道是否可以通过标签清除键,但要避免:

  • (1)服务器往返,并将密钥来回传递给客户端
  • (2)每个按键上。我尝试使用此修改后的脚本,它比(1)慢

这是(2),运行速度不够快:

for _, key in pairs(redis.call('sunion', unpack(ARGV))) do

redis.call('del', key)

end

redis.call('del', unpack(ARGV))

回答:

我几乎可以肯定,您可以8000通过更改LUAI_MAXCSTACK环境值luaconf.h并重建(Lua环境)来增加该数字()。

正如您已经注意到的,默认值是:

/*

@@ LUAI_MAXCSTACK limits the number of Lua stack slots that a C function

@* can use.

** CHANGE it if you need lots of (Lua) stack space for your C

** functions. This limit is arbitrary; its only purpose is to stop C

** functions to consume unlimited stack space. (must be smaller than

** -LUA_REGISTRYINDEX)

*/

#define LUAI_MAXCSTACK 8000

只是它有点像色情。

如何使用表并遍历table.concat()所有<=8000键呢?

以上是 如何避免Lua脚本限制中的Redis调用? 的全部内容, 来源链接: utcz.com/qa/412838.html

回到顶部