zoukankan      html  css  js  c++  java
  • 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;
        }
    
    }
    随笔看心情
  • 相关阅读:
    Spring学习记录(八)---Bean的生命周期
    Spring学习记录(七)---表达式语言-SpEL
    Spring学习记录(六)---使用外部属性文件
    Spring学习记录(五)---bean的作用域scope
    Spring学习记录(四)---bean之间的关系:继承、依赖
    Spring学习记录(三)---bean自动装配autowire
    Spring学习记录(二)---容器和bean属性配置
    2017.9
    Flask
    ELK
  • 原文地址:https://www.cnblogs.com/stromgao/p/15726173.html
Copyright © 2011-2022 走看看