006 zset 구조를 바탕으로 하는 지연 대기열 실현

2244 단어 기타
선언:
zset은 정렬이 있는 set 집합이고 그 중에서 score 속성은 zset의 정렬 필드이다.본고는 지연된 시간 + 시스템 현재 시간을 원소의 score 속성의 값으로 하고while 순환에서 매번 zset 집합에서 맨 앞에 있는 원소를 추출하여 이 원소의 score 값이 현재 시스템 시간보다 크거나 같은지 판단함으로써 대기열에서 이 원소가 지연된 시간에 도달했는지 판정한다.자세한 내용은 다음과 같습니다.
1. 지연 대기열에 대상을 추가한다.
/**
	 *  
	 * @param obj
	 * @param seconds
	 */
	public void add(Object obj, long seconds) {
		this.redisService.zadd(delayQueueKey, obj, getDelayTimeMills(seconds));
	}
	
	private long getDelayTimeMills(long seconds) {
		long result = System.currentTimeMillis() + seconds * 1000;
		return result;
	}

 
2. 스레드 감청 대기열에서 지연 메시지가 처리되어야 하는지 여부;
public void startMonitor() {
		Runnable runnable = new Runnable() {
			@Override
			public void run() {
				monitorQueue();
			}
		};
		System.out.println("start monitor delay queue.");
		new Thread(runnable).start();
		System.out.println("finish start monitor delay queue.");
	}

3. 지연 대기열 메시지 처리 주 논리;
1) 지연 대기열에서 정보를 얻기 전에 lock에서 분포식 환경에서 여러 사례가 같은 정보를 처리하는 것을 방지한다.
2) 자물쇠를 얻을 수 있다면 지연 대기열에서 원소를 꺼내기;
3) 이 요소의 score 값과 현재 시스템 시간의 비교를 통해 이 메시지가 충분한 지연이 되었는지 여부를 결정한다.
4) 지연 시간에 도달한 경우 해당 요소를 지연 대기열에서 제거한 다음 잠금을 해제합니다.
private void monitorQueue() {
		while(true) {
			if(lock()) {
				
				TypedTuple tuple = zrangeOne();
				
				if(isCanPush(tuple)) {
					zrem();
					releaseLock();
					resolveDelayMsg(tuple);
				}
				else {
					releaseLock();
				}
			}
			sleep();
		}
	}

4. 분포식 자물쇠 획득;
private static final String lockKey = "lock:delay";
	private static final String lockValue = UUID.randomUUID().toString();
	/**
	 *  
	 * @return
	 */
	private boolean lock() {
		boolean result = false;
		try {
			result = this.redisService.setTenx(lockKey, lockValue);
		}
		finally {
			if(result) {
				result = this.redisService.expire(lockKey, 60*1);
			}
		}
		return result;
	}

5. 분포식 자물쇠 방출;
/**
	 *  
	 */
	private void releaseLock() {
		String value = this.redisService.get(lockKey);
		if(lockValue.equals(value)) {
			this.redisService.del(lockKey);
		}
	}

 
6. 전체 코드 주소:
https://github.com/haishui211/redisRep.git

좋은 웹페이지 즐겨찾기