使用RedisAtomicLong和redisTemplate实现redis的计数器INCR原子加

Posted 好大的月亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用RedisAtomicLong和redisTemplate实现redis的计数器INCR原子加相关的知识,希望对你有一定的参考价值。

默认引入了redis依赖,这里就不上依赖了。

这里需要的是生成一个huize20171027100140000001这种格式的字符串,可以看到前面大致是字符串+年月日时间分秒毫秒+三位自增num

接单表述一下基本思路:
这里先用时间(年月日)生成一个key,然后,利用RedisAtomicLongincrementAndGet方法调用redisINCR原子加,之后给这个key设置一个24小时+随机数的过期时间,最后获取的INCR结果再对999进行取余,使得最终获取的结果肯定是小于999的,因为只需要三位数

 @Test
public void testMd5(){
    String str = getTransNo("huize");
    String sign = DigestUtils.md5DigestAsHex(str.getBytes()).toLowerCase();
}

//channel 渠道
public String getTransNo(String channel){
    LocalDateTime nowTime = LocalDateTime.now();
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
    String dateStr = dateTimeFormatter.format(nowTime);

    DateTimeFormatter inceKeyFormat = DateTimeFormatter.ofPattern("yyyy:MM:dd");
    String formatMinute = inceKeyFormat.format(nowTime);
    String key = formatMinute;

    Double randExpireTime = Math.floor(Math.random() * 10) + 24;

/*        Long increment = redisTemplate.opsForValue().increment(key, 1l);
    Long expire = redisTemplate.boundValueOps(key).getExpire();
    System.out.println(expire);

    Boolean aBoolean = redisTemplate.boundValueOps(key).expireAt(new Date(System.currentTimeMillis() + 10000));
    redisTemplate.boundValueOps(key).expire(1,TimeUnit.MINUTES);*/

    org.springframework.data.redis.support.atomic.RedisAtomicLong atomicLong = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
    Long incrementAndGet = atomicLong.incrementAndGet();
    Long expire1 = atomicLong.getExpire();
    System.out.println(expire1);
    atomicLong.expire(randExpireTime.longValue(), TimeUnit.HOURS);
    expire1 = atomicLong.getExpire();
    System.out.println(expire1);


/*        for (int i = 0; i < 9; i++) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                RedisAtomicLong atomicLong = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
                Long incrementAndGet = atomicLong.incrementAndGet();
                System.out.println(incrementAndGet);
                Long expire1 = atomicLong.getExpire();
                System.out.println(expire1);
                atomicLong.expire(randExpireTime.longValue(), TimeUnit.MINUTES);
                expire1 = atomicLong.getExpire();
                System.out.println(expire1);
            }
        });
        thread.start();
    }*/

    int incrementResult = incrementAndGet.intValue() % 999;

    String incrementStr = String.format("%03d", incrementResult);
    //生成格式为:渠道名称拼音小写+随机字符串,长度为25位,如慧择:huize20171027100140000001
    System.out.println(channel + dateStr + incrementStr);
    return  channel + dateStr + incrementStr;
}

huize20210830105239720015

以上是关于使用RedisAtomicLong和redisTemplate实现redis的计数器INCR原子加的主要内容,如果未能解决你的问题,请参考以下文章

C# 检查已安装的 .NET Framework 和 MS Visual C++ Redist 版本

python爬虫实现分布式——redist数据库的使用

分发 VC++ Redist... 在已安装时运行安装程序会导致问题

安装不上vc_redist的解决办法

安装不上vc_redist的解决办法

electron-edge中使用时未安装Visual Studio 2015 redist 解决方法