com.naah69.core.handler.ScriptHandler Maven / Gradle / Ivy
The newest version!
package com.naah69.core.handler;
import com.naah69.core.util.ConvertUtil;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.connection.RedisScriptingCommands;
import org.springframework.data.redis.connection.ReturnType;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.data.redis.serializer.RedisSerializer;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
* lua脚本助手
*
* @author xsx
* @since 1.8
*/
public final class ScriptHandler implements RedisHandler {
/**
* 对象模板
*/
private RedisTemplate redisTemplate;
/**
* 字符串模板
*/
private StringRedisTemplate stringRedisTemplate;
/**
* 对象脚本命令
*/
private RedisScriptingCommands commands;
/**
* 字符串脚本命令
*/
private RedisScriptingCommands stringCommands;
/**
* 键助手构造
*
* @param dbIndex 数据库索引
*/
@SuppressWarnings("unchecked")
ScriptHandler(Integer dbIndex) {
List templateList = HandlerManager.createTemplate(dbIndex);
this.redisTemplate = templateList.get(0);
this.stringRedisTemplate = (StringRedisTemplate) templateList.get(1);
this.commands = this.redisTemplate.getRequiredConnectionFactory().getConnection().scriptingCommands();
this.stringCommands = this.stringRedisTemplate.getRequiredConnectionFactory().getConnection().scriptingCommands();
}
/**
* 执行对象脚本
*
* @param scriptText lua脚本
* @param resultType 返回类型
* @param keys 键列表
* @param args 参数列表
* @param 返回类型
* @return 返回脚本类型对象
* @see Redis Documentation: EVAL
* @since redis 2.6.0
*/
public T excuteAsObj(String scriptText, Class resultType, List keys, Object... args) {
return this.redisTemplate.execute(this.buildScriptWithText(scriptText, resultType), keys, args);
}
/**
* 执行字符串脚本
*
* @param scriptText lua脚本
* @param resultType 返回类型
* @param keys 键列表
* @param args 参数列表
* @param 返回类型
* @return 返回脚本类型对象
* @see Redis Documentation: EVAL
* @since redis 2.6.0
*/
public T excute(String scriptText, Class resultType, List keys, Object... args) {
return this.stringRedisTemplate.execute(this.buildScriptWithText(scriptText, resultType), keys, args);
}
/**
* 执行对象脚本
*
* @param scriptLocation lua脚本路径
* @param resultType 返回类型
* @param argsSerializer 参数序列化类型
* @param resultSerializer 结果序列化类型
* @param keys 键列表
* @param args 参数列表
* @param 返回类型
* @return 返回脚本类型对象
* @see Redis Documentation: EVAL
* @since redis 2.6.0
*/
public T excuteAsObj(
String scriptLocation,
Class resultType,
RedisSerializer> argsSerializer,
RedisSerializer resultSerializer,
List keys,
Object... args
) {
return this.redisTemplate.execute(
this.buildScriptWithLocation(scriptLocation, resultType),
argsSerializer,
resultSerializer,
keys,
args
);
}
/**
* 执行字符串脚本
*
* @param scriptLocation lua脚本路径
* @param resultType 返回类型
* @param argsSerializer 参数序列化类型
* @param resultSerializer 结果序列化类型
* @param keys 键列表
* @param args 参数列表
* @param 返回类型
* @return 返回脚本类型对象
* @see Redis Documentation: EVAL
* @since redis 2.6.0
*/
public T excute(
String scriptLocation,
Class resultType,
RedisSerializer> argsSerializer,
RedisSerializer resultSerializer,
List keys,
Object... args
) {
return this.stringRedisTemplate.execute(
this.buildScriptWithLocation(scriptLocation, resultType),
argsSerializer,
resultSerializer,
keys,
args
);
}
/**
* 执行对象缓存脚本
*
* @param scriptSHA 脚本缓存SHA码
* @param resultType 返回类型
* @param keys 键列表
* @param args 参数列表
* @param 返回类型
* @return 返回脚本类型对象
* @see Redis Documentation: EVALSHA
* @since redis 2.6.0
*/
public T excuteWithSHAAsObj(String scriptSHA, Class resultType, List keys, Object... args) {
return this.commands.evalSha(
scriptSHA,
ReturnType.fromJavaType(resultType),
keys.size(),
ConvertUtil.toByteArray(
this.redisTemplate.getKeySerializer(),
this.redisTemplate.getValueSerializer(),
keys,
args
)
);
}
/**
* 执行字符串缓存脚本
*
* @param scriptSHA 脚本缓存SHA码
* @param resultType 返回类型
* @param keys 键列表
* @param args 参数列表
* @param 返回类型
* @return 返回脚本类型对象
* @see Redis Documentation: EVALSHA
* @since redis 2.6.0
*/
public T excuteWithSHA(String scriptSHA, Class resultType, List keys, Object... args) {
return this.stringCommands.evalSha(
scriptSHA,
ReturnType.fromJavaType(resultType),
keys.size(),
ConvertUtil.toByteArray(
this.stringRedisTemplate.getKeySerializer(),
this.stringRedisTemplate.getValueSerializer(),
keys,
args
)
);
}
/**
* 加载对象脚本到缓存
*
* @param scriptText lua脚本
* @return 返回SHA1校验码
* @see Redis Documentation: SCRIPT LOAD
* @since redis 2.6.0
*/
public String loadAsObj(String scriptText) {
return this.commands.scriptLoad(RedisSerializer.string().serialize(scriptText));
}
/**
* 加载字符串脚本到缓存
*
* @param scriptText lua脚本
* @return 返回SHA1校验码
* @see Redis Documentation: SCRIPT LOAD
* @since redis 2.6.0
*/
public String load(String scriptText) {
return this.stringCommands.scriptLoad(RedisSerializer.string().serialize(scriptText));
}
/**
* 加载对象脚本到缓存
*
* @param scriptLocation lua脚本路径
* @return 返回SHA1校验码
* @see Redis Documentation: SCRIPT LOAD
* @since redis 2.6.0
*/
public String loadByLocationAsObj(String scriptLocation) {
return this.commands.scriptLoad(
this.buildScriptWithLocation(scriptLocation, null)
.getScriptAsString()
.getBytes(StandardCharsets.UTF_8)
);
}
/**
* 加载字符串脚本到缓存
*
* @param scriptLocation lua脚本路径
* @return 返回SHA1校验码
* @see Redis Documentation: SCRIPT LOAD
* @since redis 2.6.0
*/
public String loadByLocation(String scriptLocation) {
return this.stringCommands.scriptLoad(
this.buildScriptWithLocation(scriptLocation, null)
.getScriptAsString()
.getBytes(StandardCharsets.UTF_8)
);
}
/**
* 是否存在对象脚本
*
* @param scriptSHAs 脚本sha1验证码
* @return 返回布尔值列表
* @see Redis Documentation: SCRIPT EXISTS
* @since redis 2.6.0
*/
public List existsAsObj(String... scriptSHAs) {
return this.commands.scriptExists(scriptSHAs);
}
/**
* 是否存在字符串脚本
*
* @param scriptSHAs 脚本sha1验证码
* @return 返回布尔值列表
* @see Redis Documentation: SCRIPT EXISTS
* @since redis 2.6.0
*/
public List exists(String... scriptSHAs) {
return this.stringCommands.scriptExists(scriptSHAs);
}
/**
* 清除对象脚本缓存
*
* @see Redis Documentation: SCRIPT FLUSH
* @since redis 2.6.0
*/
public void clearAsObj() {
this.commands.scriptFlush();
}
/**
* 清除字符串脚本缓存
*
* @see Redis Documentation: SCRIPT FLUSH
* @since redis 2.6.0
*/
public void clear() {
this.stringCommands.scriptFlush();
}
/**
* 停止对象脚本
*
* @see Redis Documentation: SCRIPT KILL
* @since redis 2.6.0
*/
public void stopAsObj() {
this.commands.scriptKill();
}
/**
* 停止字符串脚本
*
* @see Redis Documentation: SCRIPT KILL
* @since redis 2.6.0
*/
public void stop() {
this.stringCommands.scriptKill();
}
/**
* 获取spring redis模板
*
* @return 返回对象模板
*/
public RedisTemplate getRedisTemplate() {
return this.redisTemplate;
}
/**
* 获取spring string redis模板
*
* @return 返回字符串模板
*/
public StringRedisTemplate getStringRedisTemplate() {
return this.stringRedisTemplate;
}
/**
* 通过路径创建脚本
*
* @param scriptLocation 脚本路径
* @param resultType 返回类型
* @param 类型
* @return 返回脚本
*/
private RedisScript buildScriptWithLocation(String scriptLocation, Class resultType) {
DefaultRedisScript redisScript = new DefaultRedisScript<>();
redisScript.setLocation(new ClassPathResource(scriptLocation));
redisScript.setResultType(resultType);
return redisScript;
}
/**
* 通过字符串创建脚本
*
* @param scriptText 脚本字符串
* @param resultType 返回类型
* @param 类型
* @return 返回脚本
*/
@SuppressWarnings("unchecked")
private RedisScript buildScriptWithText(String scriptText, Class resultType) {
return RedisScript.of(scriptText, resultType);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy