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;
        }
    
    }
    随笔看心情
  • 相关阅读:
    10000个线程更新同一行数据
    CountDownLatchTest
    创建 oracle dblin
    extjs日期控件使用
    JAVA Date超强工具类,可直接取代util.Date使用
    JSP&Servlet学习手册
    JAVA 文本 TXT 操作工具类
    Leetcode 526.优美的排列
    Leetcode 525.连续数组
    Leetcode 523.连续的子数组和
  • 原文地址:https://www.cnblogs.com/stromgao/p/15726173.html
Copyright © 2011-2022 走看看