CONST redisClient = ( '레디 스')를 요구 createClient (6379를, '127.0.0.1'. ); CONST 암호화 =는 ( "암호화"요구 ) CONST lockScript = '복귀 redis.call ( "세트"KEYS [1] ARGV [1], "NX", "PX"ARGV을 [2])' unlockScript CONST = ' redis.call ( "GET", KEYS가 [1]) == ARGV [1] 다음 ( "델"KEYS [1]), 그렇지 redis.call 0 '말단 돌아 가면 redisClient.set ( "NUM", "0 " ) 에 대한 (하자 난 = 0; 나는 <1,000; I ++ ) 추가 () 에 대해 (ⅰ = 0 일하자; 나는 <1,000; I ++ ) 추가 () 에 대해 (ⅰ = 0 일하자; I <1,000; = crypto.randomBytes ( '진수'로 .toString (10) ) await를 attemplock (RESOURSE, uniqueStr) 하자를 nowCityNum = 수 (await를 GET ( 'NUM' )) NUM ++ await를 설정 ( 'NUM' , 문자열 (NUM)) await를 언록 (RESOURSE, uniqueStr) } 비동기 함수 루프 (RESOURSE, uniqueStr, TTL) { 돌아가 새로운 약속 ((해결 거부) => { 에서는 setTimeout (비동기 () => { 하자 결과 = AWAIT 로크 (RESOURSE, uniqueStr, TTL) 해결 ( ! 결과) } (10)) }) } 비동기 함수 RESOURSE, uniqueStr, TTL)가 {attemplock ( 결과하자 = AWAIT 루프 (RESOURSE, uniqueStr, TTL) 경우 (결과) { 반환 진정한 } 다른 { 복귀 attemplock (RESOURSE, uniqueStr, TTL) } } 비동기 함수 잠금 (RESOURSE, uniqueStr, TTL) { TTL = TTL? TTL : "30000" 반환 새로운 약속을 ((해결, 거부) => { redisClient.eval (lockScript, 1, RESOURSE, uniqueStr, TTL (ERR, 응답) =>{ 경우 (ERR) { console.error (ERR) (ERR) 거부 } 리졸 (응답) }) }) } 비동기 기능 해제 (RESOURSE, uniqueStr) { 돌아가 새로운 약속 ((해결 거부) => { redisClient.eval을 (unlockScript, 1 RESOURSE, uniqueStr (ERR, 응답) => { 경우 (ERR) { console.error (ERR) 거부 (ERR) } 리졸 (응답) }) }) } 비동기 기능 GET (키) { 반환 새로운 약속 ((해결, 거부) => { redisClient.get (키, (ERR, 응답) => { 경우 (ERR) { console.error (잘못을) 거부 (ERR) } 의지 (응답) }) }) } 비동기 함수 세트 (키 값) { 돌아가 새로운 ((해결 거부)를 약속 => { redisClient.set (키 값 (ERR, 응답) => { 경우 (ERR) { console.error (ERR) (ERR) 거부 } 리졸 (응답) }) }) } 비동기 함수 setnx (키 값) { 돌아가 새로운 약속을 ((해결 거부) => { redisClient.setnx (키 값 ( ERR, 응답) => { 경우 (ERR) { console.error (ERR) 거부 (ERR) } 리졸 (응답) }) }) }