我希望能够检查Redis集群中是否存在脚本。如果没有,我将需要从resources folder
加载新脚本并保存该新脚本的相应SHA值。我想在下次启动应用程序时在application.properties
内保存该SHA值。理想情况下,可以通过覆盖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
仅添加一行?
答案 0 :(得分:1)
无需在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;
}
答案 1 :(得分:0)
您可以将配置外部化到类路径之外的文件夹中。
java -jar myproject.jar --spring.config.location=/var/config
SpringApplication在以下位置从application.properties文件加载属性,并将其添加到Spring Environment:
- 当前目录的config子目录
- 当前目录
- 类路径/ config包
- classpath根
列表按优先级排序(在列表较高位置定义的属性会覆盖在较低位置定义的属性)。
如果您不喜欢application.properties作为配置文件名,则可以通过指定spring.config.name环境属性来切换到另一个文件名。您还可以通过使用spring.config.location环境属性(这是目录位置或文件路径的逗号分隔列表)来引用显式位置。