redisベースの分散型自己増加シーケンス

9351 ワード

RedisAtomicInteger,RedisAtomicLongはspring-data-redis.JArが提供する方法springbootはredisモジュールに参加して自動的に導入します
  • の2つのクラスとAtomicIntegerの違いは、1つは分布式自己増加であり、1つはjvm内自己増加
  • である.
  • intとlongが最大になると負数になります.処理方法は、負数を検出すると0に設定し、次のコード
  • を参照してください.
  • 性能、この呼び出しを加えず、同時量360;この呼び出しを加えると、コンカレント量330は、パフォーマンスへの影響が小さい
  • を示します.
    package com.example.demo.service;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.support.atomic.RedisAtomicInteger;
    import org.springframework.data.redis.support.atomic.RedisAtomicLong;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.PostConstruct;
    
    @Service
    public class KeyGenertService {
         
        @Autowired
        RedisTemplate<String, String> redisTemplate;
    
        private RedisAtomicInteger counter_int_tx;
        private RedisAtomicLong counter_long_tx2;
    
        @PostConstruct
        public void init() {
         
            counter_int_tx = new RedisAtomicInteger("int_tx", redisTemplate.getConnectionFactory());
            counter_long_tx2 = new RedisAtomicLong("long_tx2", redisTemplate.getConnectionFactory());
        }
        
        public int generate_int_tx() {
         
            int i = counter_int_tx.incrementAndGet();
            if (i < 0) {
         
                synchronized (this) {
         
                    i = counter_int_tx.incrementAndGet();
                    if (i < 0) {
         
                        counter_int_tx.set(0);
                        i = 0;
                    }
                }
            }
            return i;
        }
    
        public long generate_long_tx2() {
         
            long i = counter_long_tx2.incrementAndGet();
            if (i < 0) {
         
                synchronized (this) {
         
                    i = counter_long_tx2.incrementAndGet();
                    if (i < 0) {
         
                        counter_long_tx2.set(0);
                        i = 0;
                    }
                }
            }
            return i;
        }
    }