当前位置: 首页 > article >正文

解决springboot redisTemplate lua execute hash脚本 field有转义符的问题

问题:使用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;
    }

http://www.kler.cn/news/360639.html

相关文章:

  • CentOS6升级OpenSSH9.2和OpenSSL3
  • ChatGLM-6B和Prompt搭建专业领域知识问答机器人应用方案(含完整代码)
  • L0G1000 Linux 基础知识
  • 长短期记忆网络(Long Short-Term Memory,LSTM)
  • 跨境电商批量自养号测评是怎么做到的?
  • 鸿蒙开发案例:绘制中国象棋棋盘与棋子的技术教程
  • 为什么springboot项目更多的选择了SpringSecurity,而不是Shiro?
  • 【WebLogic】WebLogic 14c控制台密码文件权限问题分享
  • 2019年计算机网络408真题解析
  • CFG 蒸馏:On Distillation of Guided Diffusion Models
  • 【景观生态学实验】实验四 景观指数计算
  • multi-Head Attention
  • Vue--》掌握自定义依赖引入的最佳实践
  • blender 理解 积木组合 动画制作 学习笔记
  • C# 数据集
  • sql server xml
  • Egg.js使用ejs快速自动生成resetful风格的CRUD接口
  • 数据门户:企业数字化转型的关键作用
  • Oracle里面,with ... as 用法介绍
  • 软考系统分析师知识点十三:软件需求工程