redis加减原子操作

public class RedisAutomaticUtils {

    /**
     * redis加减原子操作
     */
    private static int optAtomic(StringRedisTemplate redisTemplate, String key, boolean isAdd, Integer initValue, Integer changeValue,
                                 long timeout, TimeUnit unit) {
        RedisAtomicInteger counter;
        if (initValue == null) {
            counter = new RedisAtomicInteger(key, Objects.requireNonNull(redisTemplate.getConnectionFactory()));
        } else {
            counter = new RedisAtomicInteger(key, Objects.requireNonNull(redisTemplate.getConnectionFactory()), initValue);
        }
        if (NumberUtil.isEmpty(timeout) || unit == null)
            counter.expire(3, TimeUnit.DAYS); // 默认有效期3天
        else
            counter.expire(timeout, unit);
        return isAdd ? counter.addAndGet(changeValue) : counter.addAndGet(-changeValue);
    }

    private static long optAtomicLong(StringRedisTemplate redisTemplate, String key, boolean isAdd, Long initValue, Long changeValue,
                                     long timeout, TimeUnit unit) {
        RedisAtomicLong counter;
        if (initValue == null) {
            counter = new RedisAtomicLong(key, Objects.requireNonNull(redisTemplate.getConnectionFactory()));
        } else {
            counter = new RedisAtomicLong(key, Objects.requireNonNull(redisTemplate.getConnectionFactory()), initValue);
        }
        if (NumberUtil.isEmpty(timeout) || unit == null)
            counter.expire(3, TimeUnit.DAYS); // 默认有效期3天
        else
            counter.expire(timeout, unit);
        return isAdd ? counter.addAndGet(changeValue) : counter.addAndGet(-changeValue);
    }

    /**
     * redis原子锁来保证自增和自减的并发不会出错
     */
    public static int optUpValue(StringRedisTemplate redisTemplate, boolean isAdd, String keyValue, Integer initValue, Integer changeValue,
                                 long timeout, TimeUnit unit) {
        int count;
        if (Boolean.TRUE.equals(redisTemplate.hasKey(keyValue))) {
            count = optAtomic(redisTemplate, keyValue, isAdd, null, changeValue, timeout, unit);
        } else {
            //key值不存在的话就获取初始值
            count = optAtomic(redisTemplate, keyValue, isAdd, initValue == null ? 0 : initValue, changeValue, timeout, unit);
        }
        return count;
    }

    public static long optUpValueLong(StringRedisTemplate redisTemplate, boolean isAdd, String keyValue, Long initValue, Long changeValue,
                                     long timeout, TimeUnit unit) {
        long count;
        if (Boolean.TRUE.equals(redisTemplate.hasKey(keyValue))) {
            count = optAtomicLong(redisTemplate, keyValue, isAdd, null, changeValue, timeout, unit);
        } else {
            //key值不存在的话就获取初始值
            count = optAtomicLong(redisTemplate, keyValue, isAdd, initValue == null ? 0 : initValue, changeValue, timeout, unit);
        }
        return count;
    }

}

 

posted @ 2021-12-24 10:03  二次元的程序猿  阅读(2188)  评论(0编辑  收藏  举报