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;
        }
    
    }
    随笔看心情
  • 相关阅读:
    Cs Round#54 E Late Edges
    Cs Round#54 D Spanning Trees
    python装饰器的理解
    java序列化,二进制和数据流
    netty的理解
    CenterOS卸载和安装MYSQL
    oracle的一些问题
    tomcat优化方案(转)
    Selector
    Buffer
  • 原文地址:https://www.cnblogs.com/stromgao/p/15726173.html
Copyright © 2011-2022 走看看