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;
        }
    
    }
    随笔看心情
  • 相关阅读:
    sql2008存储过程 "see object explorer details for objects in this folder"问题
    wcf寄宿iis7是的 500错误
    如何绑定到根元素的数据源
    实用sql语句
    網絡相關知識隨記
    MSSQL跨服務器複製數據
    javascript typeof 和 instanceof 的区别和联系[轉]
    读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。【轉】
    MSSQL觸發器注意事項
    Ext.net注册前台脚本
  • 原文地址:https://www.cnblogs.com/stromgao/p/15726173.html
Copyright © 2011-2022 走看看