redisTemplate ValueOperations增量获取空值

问题描述 投票:1回答:1

首先,我必须说密钥存在于redis中,该密钥是一个自增序列,但有时获取此密钥为空。我使用了spring-boot:2.0.4.0.release我的期望是一次获得一个自增1来生成订单号您能为我的方案提供解决方案吗?谢谢!

@Override
@Transactional(rollbackFor = Exception.class)
public boolean paymentBatchMeter(UserDescriptor user, String areaCode, String newPrice) {
    List<Meter> meters = meterService.findAllByFilterAndAreaCode(null, areaCode, user);
    if (meters != null && meters.size() > 0) {
        List<TaskValue> taskValueList = new ArrayList<>();
        meters.forEach(meter -> {
            if (meter.getState() == 1) {
                Task task = new Task();
                task.setCode(meter.getCode());

                TaskValue taskValue = new TaskValue();
                taskValue.setId(task.getId());
                taskValue.setMeterType(meter.getMeterDicCode());
                taskValue.setCode(meter.getCode());

                Long orderIndex = redisTemplate.opsForValue().increment("athena:order:index", 1);
                if (orderIndex == null) {
                    throw new IllegalStateException("error!");
                }
                taskValueList.add(taskValue);

                Order order = new Order();
                order.setCustomerId(meter.getCustomerId());
                order.setCode(orderIndex.toString());
                order.setCreateTime(new Date());
                order.setMeterId(meter.getId());
                order.setState(0);
                order.setRechargeMoney(new BigDecimal(newPrice));
                List<DicProjectItem> dicProjectItems = dicProjectItemMapper.getDicProjectItemAll("D10015", 1);
                String dicProjectItemId = dicProjectItems.stream().filter(p -> "002".equals(p.getCode())).collect(Collectors.toList()).get(0).getId();
                order.setRechargeWayDicId(dicProjectItemId);
                order.setRechargeState(1);
                order.setTaskId(task.getId());
                order.setOperatorId(user.getId());
            }
        });

        redisTemplate.setEnableTransactionSupport(true);
        taskValueList.forEach(taskValue -> {
            if ("004".equals(taskValue.getMeterType())) {
                redisTemplate.convertAndSend(TOPIC, taskValue.getCode());
                redisTemplate.opsForList().rightPush("athena:concentrator:meter:task:" + taskValue.getCode(), JSON.toJSONString(taskValue));
            } else {
                redisTemplate.opsForList().rightPush("athena:meter:task:" + taskValue.getCode(), JSON.toJSONString(taskValue));
            }
        });
        redisTemplate.setEnableTransactionSupport(false);

        return true;
    }

    return false;
}
spring-boot redis spring-data-redis
1个回答
0
投票

我遇到了相同的问题,我的redisTemplate为null,最后以下代码对我有用,我在redisTemplate方法中添加了[[@Autowire并注入JedisConnectionFactory作为参数。

@Bean(name = "factory") JedisConnectionFactory jedisConnectionFactory() { JedisConnectionFactory jedisConFactory = new JedisConnectionFactory(); ... return jedisConFactory; } @Bean(name = "common") @Autowired public RedisTemplate<String, Object> redisTemplate(@Qualifier("factory") JedisConnectionFactory jedisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); .... return redisTemplate; }
然后可以像下面那样使用它,

@Autowired @Qualifier("common") RedisTemplate<String, Object> redisTemplate;

private final RedisTemplate<String, Object> redisTemplate; @Autowired public TestRedisController(@Qualifier("common") RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; }

© www.soinside.com 2019 - 2024. All rights reserved.