分布式系统RedisAtomicLong实现自增流水号

前言

在项目中许多过这样的需求,记录留做备忘。
需要创建一个递增序列,这个序列会提供给多个应用来使用,这样就需要保持序列的原子递增。

RedisAtomicLong

spring-data-redis包中提供的,可以对数据中的Long类型进行原子性操作的类,下面是这个类的头:

分布式系统RedisAtomicLong实现自增流水号_第1张图片
我们可以看到java.util.concurrent.atomic.AtomicLong,和java自带的atomic包一样进行原子性操作,两者不同的是:

AtomicLong只能在一个应用中使用
RedisAtomicLong可以在所有与Redis有连接的应用中使用

具体使用

   /**
     * @param key
     * @param expireTime 过期时间
     * @return
     */
    public static long generate(RedisTemplate<?,?> redisTemplate,String key,Date expireTime) {
        //RedisAtomicLong为原子类,根据传入的key和redis链接工厂创建原子类
        RedisAtomicLong counter = new RedisAtomicLong(key,redisTemplate.getConnectionFactory());
        //设置过期时间
        counter.expireAt(expireTime);
        //返回redis中key的值,内部实现下面详细说明
        return counter.incrementAndGet();
    }

注意:使用RedisAtomicInteger计数出现少计

// Fixed bug 前几个数累计重复问题
redisTemplate.opsForValue().setIfAbsent(countKey, 0);

你可能感兴趣的:(redis,java,redis,数据库)