zoukankan      html  css  js  c++  java
  • Spring boot redis自增编号控制 踩坑

    近段期间,公司 接手一个订单号生成服务,规则的话已经由项目经理他们规定好了,主要是后面的四位数代表的关于当前订单号已经执行第几个了。而这里面有一个要求就是支持分布式。为了实现这个东西,刚开始我使用了redis的incr来解决这个问题,因为我们后端开发用的是Spring boot,所以我网上找了一个代码如下:

     1 /**
     2      *
     3      * @param key
     4      * @param liveTime
     5      * @return
     6      */
     7     public Long incr(String key, long liveTime) {
     8         RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
     9         Long increment = entityIdCounter.getAndIncrement();
    10 
    11         if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始设置过期时间
    12             entityIdCounter.expire(liveTime, TimeUnit.SECONDS);
    13         }
    14 
    15         return increment;
    16     }

    结果测试的时候,看着后面的数很满意,心里面有点小小的激动哦~~

    但是当我将数据从小到大排序的时候,发现了一点异样,即刚开始的几个是存在问题的。

    所以通过测试发现了,当redis里面还没有设置计时器的一刹那,分布式服务下,会存在前几个重复的现象。

    发现这个问题之后,于是我通过redis锁,当判断redis下面还没存在计数key的情况下,锁住,然后在锁住的情况下,其他人进来调用的时候,线程睡眠500ms,然后再往下执行。顺利解决~~~

  • 相关阅读:
    1月6日 作业 穷举
    1.4 作业
    12月31日 作业
    12月29日-练习成果
    12月30日作业-<转>字符集编码
    1.22作业
    集合
    泛型
    CPU接口练习 (仅以此程序证明 某个同学真的有毒!有毒!!!)
    继承知识点总结
  • 原文地址:https://www.cnblogs.com/Grace-is-enough/p/9225455.html
Copyright © 2011-2022 走看看