Redis 分布式生产全局有序ID


核心主要是利用Redis的senx和getset等命令进行操作,这些命令都是属于原子性的操作;


 public  synchronized boolean lockWithTimeout(String lockName, long acquireTimeout, long timeout) {
        try {
            // 获取连接
            // 随机生成一个value
            jedis = jedisPool.getResource();

            String identifier = UUID.randomUUID().toString();
            // 锁名,即key值
            // 超时时间,上锁后超过此时间则自动释放锁
            long lockTimeOut = System.currentTimeMillis()+timeout;

            // 获取锁的超时时间,超过这个时间则放弃获取锁
            long lockExpire = System.currentTimeMillis() + acquireTimeout;
            while (System.currentTimeMillis()<lockTimeOut) {
                if (jedis.setnx(lockName, String.valueOf(lockExpire)) == 1) {
                    jedisLock=true;
                    return true;
                }

                String currentValue=jedis.get(lockName);
                 //当前值不为空,且当前值没有过期
                if(currentValue!=null && Long.parseLong(currentValue)< System.currentTimeMillis()){

                    String oldValue=jedis.getSet(lockName,String.valueOf(lockExpire));

                    if(oldValue!=null && oldValue.equals(currentValue)){
                        jedisLock=true;
                        return  true;
                    }
                }

            }
        } catch (JedisException e) {
            e.printStackTrace();
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return false;
    }

    /**
     *
     * @param lockName 锁的key
     * @return
     */
    public  synchronized   boolean releaseLock(String lockName) {
        jedis = jedisPool.getResource();
        try{
            if(jedisLock){
                jedis.del(lockName);
                jedisLock=false;
            }
        }finally {
            jedis.close();
        }
        return false;

    }

根据Redis中的incr命令对产生自增;其中全局唯一ID的设计为

    public   void seckill() {
        try {
            if(lock.lockWithTimeout(lockName,1000,2000)) {
                Calendar calendar = Calendar.getInstance();
                calendar.set(Calendar.HOUR_OF_DAY, 23);
                calendar.set(Calendar.MINUTE, 59);
                calendar.set(Calendar.SECOND, 59);
                calendar.set(Calendar.MILLISECOND, 999);

                long id = Long.parseLong(format.format(calendar.getTime()))+jedis.incr("incrKey");
                System.out.println("the lockKey is : " + id);
            }
        }finally {

            lock.releaseLock(lockName);
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值