问题:使用execute,是
result = redisTemplate.execute(redisScript,Collections.singletonList(hashKey), // KEYSargs.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()); // ARGVresult = redisTemplate.execute(redisScript, stringSerializer, longSerializer,Collections.singletonList(hashKey), // KEYSargs.toArray());log.debug("redisEVALLuaScript result :{}", result);} catch (Exception e) {e.printStackTrace();log.error("e:", e);}return (Long) result;}