使用 Lua 脚本批量获取制定目录下的所有 Redis 键的值

/**
 * 使用 Lua 脚本批量获取 Redis 键的值
 *
 * @param prefix Redis 中的键列表
 * @return 键对应的值的列表
 */
public <E> List<E> getAllListValuesByPrefix(String prefix, Class<?> classType) {
    // 获取所有以给定前缀开头的键
    Set<String> keys = redisTemplate.keys(prefix + ":*"); // 使用通配符查找匹配的键
    // 参数校验
    if (keys == null || keys.isEmpty()) {
        return Collections.emptyList();
    }
    String cmd;
    if (classType.isAssignableFrom(String.class)) {
        cmd = "redis.call('GET', key)";
    } else if (classType.isAssignableFrom(List.class)) {
        cmd = "redis.call('LRANGE', key, 0, -1)";
    } else if (classType.isAssignableFrom(HashMap.class)) {
        cmd = "redis.call('HVALS', key)";
        // cmd = "redis.call('HGETALL', key)";
    } else {
        throw new RuntimeException("不支持的classType类型");
    }
    // Lua脚本:批量获取所有传入keys的值
    String luaScript = "local result = {} " +
            "for i, key in ipairs(KEYS) do " +
            "    local value = " + cmd +
            "    result[i] = value " +
            "end " +
            "return result";

    // 构建 RedisScript 对象,指定返回类型为 List
    DefaultRedisScript<List> redisScript = new DefaultRedisScript<>();
    redisScript.setScriptText(luaScript);
    redisScript.setResultType(List.class);
    // 执行 Lua 脚本并返回结果
    try {
        Object result = redisTemplate.execute(redisScript, Arrays.asList(keys.toArray()));
        if (result instanceof List) {
            return (List<E>) result;
        } else {
            return Collections.emptyList();
        }
    } catch (Exception e) {
        e.printStackTrace();
        return Collections.emptyList();
    }
}
posted @   槑孒  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
历史上的今天:
2023-10-14 CSS制作逼真的波浪效果
2021-10-14 Python | P站壁纸爬取
2021-10-14 Conda 创建和删除虚拟环境
点击右上角即可分享
微信分享提示