首页 > 数据库 >使用 Lua 脚本批量获取制定目录下的所有 Redis 键的值

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

时间:2024-10-14 15:35:43浏览次数:7  
标签:return 批量 keys List cmd Redis Lua result

/**
 * 使用 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();
    }
}

标签:return,批量,keys,List,cmd,Redis,Lua,result
From: https://www.cnblogs.com/echohye/p/18464302

相关文章

  • 基于redis实现验证码、Token的存储
    多台tomcat服务器之间session信息不能共享(早期tomcat为解决这个问题可以在tomcat服务器之间拷贝session信息但拷贝时有时间延迟故淘汰)1.使用redis替代session1.使用String数据类型存储验证码 每一个手机号作为key2.使用Hash数据结构存储用户信息  随机token作为k......
  • redis未授权访问及利用总结
    Redis未授权访问漏洞漏洞原理redis默认端口6379,在默认配置情况下密码为空,因此如果将redis暴露到公网,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据,并且可以利用redis写入shell、写入公钥等危险操作漏洞复现安装redis下载安装包后进行解......
  • Redis缓存更新策略
    缓存更新策略内存淘汰超时剔除主动更新说明利用Redi的内存淘汰机制,当内存不足时自动淘汰部分数据,下次查询时更新缓存给缓存数据添加TTL(即缓存存在时间)的时间,到期后自动删除缓存,下次查询时更新缓存在修改数据库的同时,更新缓存一致性差一般好维护成本无低高业务使用场景:低一致......
  • redis缓存穿透、雪崩、击穿
    缓存穿透缓存穿透:客户端请求的数据在缓存和数据库都不存在。这样缓存永远不会生效,这些请求都会打到数据库中。解决方案缓存空对象(常用)优点:实现简单,维护方便缺点:额外的内存消耗;可能造成短期的不一致(可以设置TTL时间,缓解不一致的情况)布隆过滤器(常用)优点:内存占用少,没用多......
  • cmd批量创建文件和文件夹
    批量创建文件夹在当前文件夹下批量创建文件夹for/l%iin(start,setp,end)domd新建文件夹%istart:起始数字setp:步长end:结束数字md表示创建文件夹在指定路径下批量创建文件夹在D:\test\下创创建编号为2~10的文件夹:for/l%iin(2,1,10)domdD:\test\新建文件......
  • AI批量剪辑助手视频批量自动剪辑软件
    批量剪辑助手是一款视频批量自动剪辑软件,具有智能化、批量化、操作简单等特点。该软件适用于自动化处理和生产视频,旨在帮助用户实现批量化生产产品推广视频的功能。三、安装与配置安装步骤:下载程序压缩包:访问官方网站或指定下载地址,下载小咖批量剪辑助手程序压缩包。b.......
  • AI批量剪辑助手视频批量自动剪辑软件
    批量剪辑助手是一款视频批量自动剪辑软件,具有智能化、批量化、操作简单等特点。该软件适用于自动化处理和生产视频,旨在帮助用户实现批量化生产产品推广视频的功能。三、安装与配置安装步骤:下载程序压缩包:访问官方网站或指定下载地址,下载小咖批量剪辑助手程序压缩包。b.......
  • Redis 缓存预热,缓存雪崩,缓存击穿,缓存穿透
    Spring-data-redis说明:在SpringBoot2.x之后,原来使用的jedis被替换为了lettucejedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用jedispool连接池lettuce:采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据了1......
  • AI批量剪辑助手视频批量自动剪辑软件
    批量剪辑助手是一款视频批量自动剪辑软件,具有智能化、批量化、操作简单等特点。该软件适用于自动化处理和生产视频,旨在帮助用户实现批量化生产产品推广视频的功能。三、安装与配置安装步骤:下载程序压缩包:访问官方网站或指定下载地址,下载小咖批量剪辑助手程序压缩包。b.......
  • 滚雪球学Redis[3.3讲]:Redis数据持久化深入探讨:从 AOF 到混合持久化的演进
    全文目录:前言混合持久化1.RDB与AOF之间的权衡2.混合持久化的工作原理工作机制详解3.配置与实践实例演示4.实际应用中的案例分析5.深入探讨混合持久化的优势与局限6.扩展思考:如何选择Redis的持久化策略?总结附:案例与代码配置文件示例:测试代码:模拟数据恢复:下......