java - 如何在运行时编辑 application.properties(供下次使用)

标签 java spring-boot redis lua application.properties

我希望能够检查脚本是否存在于 Redis 集群中。如果没有,我将需要从我的 resources 文件夹 加载一个新脚本并保存该新脚本的相应 SHA 值。我想在应用程序下次启动时保存该 SHA 值,在 application.properties 中。理想情况下,这将通过覆盖 sha 值的先前条目来完成

我知道属性文件在启动期间被读取一次,但这并不重要,因为我只想将该 SHA 值保存到 application.properties 以供下次使用,即防止开销每次检查脚本并加载。

这是我编写脚本的方法

static String prepareScripts() throws ExecutionException, InterruptedException, IOException {
    List <Boolean> list = (List) asyncCommands.scriptExists(sha).get();
    shaDigest = sha;
    if (list.get(0) == false) {
        URL url = AbstractRedisDao.class.getClassLoader().getResource("script.txt");
        File file = new File(url.getPath());
        String str = FileUtils.readFileToString(file, "ISO_8859_1");
        shaDigest = (String) asyncCommands.scriptLoad(str).get();

        Properties  properties = new Properties();


        try {
            FileWriter writer = new FileWriter("application.properties");
            BufferedWriter bw = new BufferedWriter(writer);
            Iterator propertyIt =  properties.entrySet().iterator();

            while (propertyIt.hasNext() ) {
                Map.Entry nextHolder = (Map.Entry) propertyIt.next();
                while (nextHolder.getKey() != ("redis.scriptActiveDev")) {
                    bw.write(nextHolder.getKey() + "=" + nextHolder.getValue());
                }
            }

            bw.write("redis.scriptActiveDev=" + shaDigest);
        } catch (IOException e) {
            System.err.format("IOException: %s%n", e);
        }
        return shaDigest;
    } else {
        return shaDigest;
    }
}

这些是 application.properties 中 redis 的详细信息:

redis.enabled=true
redis.hostname=xxxx
redis.port=xxxx
redis.password=xxxx
redis.sha=xxxx

这是在正确的轨道上吗?另外,在使用新属性重建 application.properties 后,我将如何将其保存回 resources 文件夹?有没有更有效的方法来做到这一点,而无需重新创建整个 application.properties 只是为了添加一行?

最佳答案

无需在 application.properties 中存储 Lua 脚本的 SHA 摘要.

使用 Redis 客户端的 API 在应用程序启动时获取 SHA 摘要。

例如,Lettuce 提供以下 API用于脚本:
String digest(V script)
String scriptLoad(V script)
List<Boolean> scriptExists(String... digests)

您可以在每次应用程序启动时执行以下代码以获取脚本的摘要:

public String sha(String script) {
  String shaDigest = redisScriptingCommands.digest(script);
  boolean scriptExists = redisScriptingCommands.scriptExists(shaDigest).get(0);
  if (!scriptExists) {
    redisScriptingCommands.scriptLoad(script);
  }
  return shaDigest;
}

关于java - 如何在运行时编辑 application.properties(供下次使用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56046246/

相关文章:

java - LibGDX Stage vs SpriteBatch 绘制游戏

spring - 使用 MockMultipartFile 测试最大上传文件大小

amazon-web-services - 如何在 AWS Elasticache (Redis) 中使用布隆过滤器?

php - Predis:两种集群策略的优缺点

java - 如果实体已经存在,如何通过属性返回实体?

java - Java 8 中::运算符的名称是什么

java - 递归java方法解析带条件的字符串?

java - 如何将 Angular 与 Spring Boot 集成以在 Spring Boot 端口上查看 Angular Web 界面?

java - 如何使用 Spring-Boot 在 Java 项目中使用 Clojure 库?

caching - 在数据库和 redis 缓存之间同步数据的最佳策略是什么