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; } }
随笔看心情