사용 동시 서비스 nodejs 달성 레디 스

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) 
            } 
            리졸 (응답) 
        }) 
    }) 
}

 

추천

출처www.cnblogs.com/BlackFungus/p/12329521.html