我正在设置一个PHP标记的缓存实现,它将同时使用Redis和APCu.由于APC是键值存储,我将使用Redis进行密钥标记关系并与APC上的每个Web服务器同步.
我目前的问题只涉及Redis.可能你知道实现,但要明确:密钥可以有与之关联的标签.稍后您可以通过某些标记删除缓存的密钥.有许多键而不是很多标签,键和标签之间存在n对n的关系.
set(key, value, tags)
由组成:
SET key value
foreach tag in tags
SADD tag key
Run Code Online (Sandbox Code Playgroud)
因为在设置之后不需要检索或更改标签,所以我只需要保持标签到密钥的关系.
deleteByTag(tags)
是
keys = SUNION tag1 tag2 tag3...
DEL key1 key2 key2...
Run Code Online (Sandbox Code Playgroud)
为了加快速度,我创建了两个简单的lua脚本,我将脚本加载并调用EVALSHA.
Lua 设置脚本:
redis.call('set', KEYS[1], KEYS[2])
for _, tag in pairs(ARGV) do
redis.call('sadd', tag, KEYS[1])
end
Run Code Online (Sandbox Code Playgroud)
打电话给
EVALSHA setHash 2 key value tag1 tag2 tag3...
Run Code Online (Sandbox Code Playgroud)
我遇到问题的deleteByTag脚本如下所示:
redis.call('del', unpack(redis.call('sunion', unpack(ARGV))))
redis.call('del', unpack(ARGV))
Run Code Online (Sandbox Code Playgroud)
打电话给
EVALSHA deleteByTagHash 0 tag1 tag2 tag3...
Run Code Online (Sandbox Code Playgroud)
一切都很好,除非redis.call('sunion', unpack(ARGV))
返回很多钥匙.似乎Lua对方法可以拥有的参数数量有一个硬性限制.在我的环境中它是8000.
我想知道是否有办法通过标签清除键,但避免:
这是(2)不够快的工作:
for _, key in pairs(redis.call('sunion', unpack(ARGV))) do
redis.call('del', key)
end
redis.call('del', unpack(ARGV))
Run Code Online (Sandbox Code Playgroud)
我几乎可以肯定,您可以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
Run Code Online (Sandbox Code Playgroud)
只有它像色情片一样接缝.
怎么样使用一张桌子和迭代throught table.concat()
大块<=8000
的钥匙?
归档时间: |
|
查看次数: |
2889 次 |
最近记录: |