牧羊人_1215 2017-07-07 11:00 采纳率: 0%
浏览 1703

spring-data-redis事务操作异常

相关jar

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.6.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.4.2</version>
        </dependency>

业务场景:
现有一个定时任务,将符合条件的新闻标题存入Reids,采用zset格式,新闻数据转换为json,试问时间为score,便于通过新闻时间分页获取数据。
执行定时任务时,先通过key删除原有的数据,然后批量增加新的数据,为了避免在删除命令执行后增加命令执行前会插入其他查询命令,导致查询结果为空,所以需要事物处理,以下代码:

    @Test
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void test001(){
        List<NewsInfo> list = getList("ztw_0707");
        Set<TypedTuple<String>> set = Sets.newHashSet();
        for (int i = 0; i < list.size(); i++) {
            String str = JSON.toJSONString(list.get(i), SerializerFeature.WriteMapNullValue);
            TypedTuple<String> typedTuple = new DefaultTypedTuple<String>(str, Double.valueOf(i));
            set.add(typedTuple);
        }
//      stringRedisTemplate.delete("myKey");
//      stringRedisTemplate.opsForZSet().add("myKet", set);
        Map<String, String> map = Maps.newHashMap();
        map.put("key001", "value001");
        map.put("key002", "value002");
        map.put("key003", "value003");
        SessionCallback<Object> sessionCallback = new SessionCallback<Object>(){
            @Override
            public Object execute(RedisOperations operations) throws DataAccessException {
                operations.multi();  
                operations.delete("test");
                //operations.opsForHash().putAll("test", map);
                operations.opsForZSet().add("test", set);
//              operations.opsForZSet().add("test", "value001", 1);
//              operations.opsForZSet().add("test", "value002", 2);
//              operations.opsForZSet().add("test", "value003", 3);
                //operations.opsForHash().put("test", "key001", "value001");
                operations.expire("test", 1, TimeUnit.HOURS);
                Object val=operations.exec();
                return val;
            }
        };
        try {
            Object obj = stringRedisTemplate.execute(sessionCallback); 
            System.out.println(obj.toString());
        } catch (Exception e) {
            System.out.println(e);
        }

    }

执行注释部分的代码没问题,唯但是operations.opsForZSet().add("test", set);时出现异常:
org.springframework.dao.InvalidDataAccessApiUsageException: Cannot use Jedis when in Multi. Please use JedisTransaction instead.; nested exception is redis.clients.jedis.exceptions.JedisDataException: Cannot use Jedis when in Multi. Please use JedisTransaction instead.

请教各位,怎么解决,或者有其它的好的解决方案。

  • 写回答

1条回答 默认 最新

  • oyljerry 2017-07-07 14:12
    关注

    错误提示你了,要你直接用JedisTransaction,而不是用redis原生的multi来做事务

    评论

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?