如何在 Redis 中使用 Lua 脚本进行 sscan 操作?

我想在 SSCAN command 完成后获取值的数量。

127.0.0.1:6379[2]> sadd Test:Info:Site 'www.naver.com' 'www.google.com' 'www.daum.net' 'www.korea.com'
(integer) 4
127.0.0.1:6379[2]> smembers Test:Info:Site
    1) "www.naver.com"
    2) "www.daum.net"
    3) "www.korea.com"
    4) "www.google.com"

我想返回 "0"

127.0.0.1:6379[2]> sscan Test:Info:Site 0 match '*niver*'
    1) "0"
    2) (empty list or set)    <--- 统计此项

我想返回 "1"

127.0.0.1:6379[2]> sscan Test:Info:Site 0 match '*naver*'
    1) "0"
    2) 1) "www.naver.com"    <--- 统计此项

我想返回 "3"

127.0.0.1:6379[2]> sscan Test:Info:Site 0 match '*com*'
    1) "0"
    2) 1) "www.naver.com"     <-- 统计
       2) "www.korea.com"     <-- 统计
       3) "www.google.com"    <-- 统计

我无法访问搜索结果的值。

127.0.0.1:6379[2]> EVAL "return #redis.call('sscan',KEYS[1],0,'match',ARGV[1])" 1 'Test:Info:Site' '*com*'
(integer) 2
    127.0.0.1:6379[2]> EVAL "return #redis.call('sscan',KEYS[1],0,'match',ARGV[1])" 1 'Test:Info:Site' '*niver*'
(integer) 2
点赞
用户3160475
用户3160475

看起来你正在尝试从 Lua 脚本执行 SSCAN,以便对 Set 的成员进行模式匹配,并返回计数。如果是这样,你需要重复调用 SSCAN 直到游标返回 '0',并统计每个迭代的结果。

以下是应该如何完成的示例:

$ cat sscan.lua
local key, pat = KEYS[1], ARGV[1]
local cursor, res = 0, 0

repeat
  local rep = redis.call('SSCAN', key, cursor, 'MATCH', pat)
  cursor = rep[1]
  res = res + #rep[2]
until cursor == '0'

return res

$ redis-cli --eval sscan.lua Test:Info:Site , "*niver*"
(integer) 0
$ redis-cli --eval sscan.lua Test:Info:Site , "*naver*"
(integer) 1
$ redis-cli --eval sscan.lua Test:Info:Site , "*com*"
(integer) 3
2018-01-15 10:56:13