问题:使用execute,是
result = redisTemplate.execute(redisScript,
Collections.singletonList(hashKey), // KEYS
args.toArray()); // ARGV
会存在field有转义符
发现这个方法是直接调用下图的方法
使用的序列化的方式是
template.getValueSerializer(), (RedisSerializer) template.getValueSerializer()
而不是redisTemplate hash 存储的序列化方式
解决方案:
添加DefaultRedisScript 改为Object 去掉范式,设置指定的序列化方式,同时入参从 Map<String, Object> 改为Map<String, String>
调用时想要使用Jackson2JsonRedisSerializer 进行序列化value
需要自行对需要处理的value 进行序列化,转换为JSON 字符串,如下代码段
private ObjectMapper objectMapper = new ObjectMapper();
public void testHmsetLuaRead() throws JsonProcessingException {
Map<String, String> map = new HashMap<>();
Map<String, Object> item = new HashMap<>();
item.put("content_id", "111test");
map.put("111test", objectMapper.writeValueAsString(item));
redisUtils.insertIntoHashWithExpireTime("testNamelua1727", map, 11111);
// redisUtils.hmset("testName11", map, 1111);
}
插入方法如下
public Long insertIntoHashWithExpireTime(String hashKey, Map<String, String> fieldsAndValues, int expireTime) {
Object result = null;
// unpack(ARGV)在Lua中是用来将数组解包成一系列单独的参数。
// ARGV[#ARGV]获取的是传递给脚本的最后一个参数(在 Lua 中,# 操作符用于获取表中的元素数量。因此,ARGV[#ARGV] 将返回 ARGV 表中的最后一个元素。)
// 获取lua 脚本
final String luaScript = getLuaScript();
log.debug("luaScript:{}", luaScript);
try {
// 将 Map 转换成有序的键值对列表
// 创建参数列表
List<String> args = new ArrayList<>(fieldsAndValues.size() * 2 + 1);
for (Map.Entry<String, String> entry : fieldsAndValues.entrySet()) {
args.add(entry.getKey());
args.add(entry.getValue());
}
args.add(String.valueOf(expireTime)); // 最后一个参数是过期时间
DefaultRedisScript redisScript = new DefaultRedisScript<>();
redisScript.setScriptText(luaScript);
redisScript.setResultType(Long.class);//返回类型是Long
// // 设置序列化器
// redisTemplate.setKeySerializer(new StringRedisSerializer());
// redisTemplate.setValueSerializer(new StringRedisSerializer());
// 使用默认的 JdkSerializationRedisSerializer 来序列化和反序列化数据。
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
JdkSerializationRedisSerializer longSerializer = new JdkSerializationRedisSerializer();
// 执行脚本
// result = redisTemplate.execute(redisScript,
// Collections.singletonList(hashKey), // KEYS
// args.toArray()); // ARGV
result = redisTemplate.execute(redisScript, stringSerializer, longSerializer,
Collections.singletonList(hashKey), // KEYS
args.toArray());
log.debug("redisEVALLuaScript result :{}", result);
} catch (Exception e) {
e.printStackTrace();
log.error("e:", e);
}
return (Long) result;
}