在redis中是否可以使用正则表达式扫描和匹配模式?

9udxz4iz  于 2022-11-21  发布在  Redis
关注(0)|答案(3)|浏览(147)

假设我想用SCAN函数扫描一个redis中的集合,是否可以传递一个正则表达式给MATCH with?

soat7uwm

soat7uwm1#

不,MATCH是仅支持通配符的模式。

uxh89sit

uxh89sit2#

MATCH 不 支持 正则 表达式 , 只 支持 通配符 。 但是 , 您 可以 在 Redis 的 Lua 脚本 中 使用 Lua 模式 。 对于 大多 数 常见 的 实际 使用 情况 , Lua patterns 将 与 POSIX 正则 表达式 模式 一样 强大 。 以下 是 非常 有用 的@itamarhaber 提供 的 要点
https://gist.github.com/itamarhaber/19c8393f465b62c9cfa8 格式
注 : 这 不 适合 生产 , 因为 它 占用 大量 资源 并 执行 完全 扫描 。

sigwle7e

sigwle7e3#

只 提 一 件 小事 , 因为 regex 不 受 支持 , 我们 可以 自己 实现 一些 匹配 。
例如 ( 使用 python ) :

def generator():
    target_pattern = 'user_\d+'
    simple_pattern = 'user_*'
    import re
    cursor, i = 0, 0
    while True:
        cursor, keys = rs.scan(cursor, match=simple_pattern, count=1000)
        for key in keys:
            if re.match(target_pattern, key):
                yield (i, key)
                i += 1
        if not keys:
            break

for cursor, keys in generator():
    print(cursor, keys)
    do_something()

# or 
def while_true_loop():
    target_pattern = 'user_\d+'
    simple_pattern = 'user_*'
    import re
    cursor = 0
    while True:
        cursor, keys = rs.scan(cursor, match=simple_pattern, count=1000)
        for key in keys:
            if re.match(target_pattern, key):
                do_something()
        if not keys:
            break

中 的 每 一 个

相关问题