πŸ’Έ [Redis] λ ˆλ””μŠ€ 데이터 νƒ€μž…: Strings

μ΄μ„œΒ·2023λ…„ 10μ›” 1일
0

πŸ’Έ Redis νŠΈλž™

λͺ©λ‘ 보기
3/5

banner

πŸŽοΈπŸ’¨Β μ•ˆλ…•ν•˜μ„Έμš”, μ΄μ„œμ—μš”! 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” λ ˆλ””μŠ€ 데이터 νƒ€μž… 쀑 ν•˜λ‚˜μΈ Strings νƒ€μž…μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ³ μž ν•΄μš”.

κ°œμš”

Strings νƒ€μž…μ€ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λ¬Έμžμ—΄ 데이터λ₯Ό μ €μž₯ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 데이터 ν˜•μ‹μ΄μ—μš”. λ¬Έμžμ—΄μ€ μž‘μ€λ”°μ˜΄ν‘œ('')λ‚˜ ν°λ”°μ˜΄ν‘œ("")둜 λ¬Άμ–΄μ„œ λ‚˜νƒ€λ‚΄λ©°, λ¬Έμžμ—΄ μ•ˆμ—λŠ” 문자, 숫자, 곡백, 특수 문자 λ“± λͺ¨λ“  μ’…λ₯˜μ˜ 문자λ₯Ό 포함할 수 μžˆμ–΄μš”. Strings νƒ€μž…μ€ 캐싱, μ„Έμ…˜ 관리, μΉ΄μš΄ν„°, μ„€μ • 관리 λ“± λ‹€μ–‘ν•œ μš©λ„λ‘œ ν™œμš©λ˜λ©°, λΉ λ₯Έ 읽기 및 μ“°κΈ° μ„±λŠ₯을 μ œκ³΅ν•΄μš”. 이제 Strings νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ μ•Œμ•„λ³Όκ²Œμš”.

λͺ…λ Ήμ–΄

Redisμ—μ„œ 주둜 μ‚¬μš©ν•˜λŠ” λͺ…λ Ήμ–΄ 10개λ₯Ό μ†Œκ°œ λ“œλ¦΄κ²Œμš”. 더 λ§Žμ€ λͺ…λ Ήμ–΄λ₯Ό μ•Œμ•„λ³΄κ³  μ‹ΆμœΌμ‹œλ‹€λ©΄, μ•„λž˜μ˜ 곡식 λ¬Έμ„œλ₯Ό μ°Έκ³ ν•΄ μ£Όμ„Έμš” πŸ₯Έ.

Redis Strings

  1. SET key value: 주어진 ν‚€(key)에 λ¬Έμžμ—΄ 값을 μ €μž₯ν•΄μš”.

    > SET mykey "Hello, Redis"
    OK
  2. GET key: 주어진 ν‚€(key)에 λŒ€ν•œ λ¬Έμžμ—΄ 값을 λ°˜ν™˜ν•΄μš”.

    > GET mykey
    "Hello, Redis"
  3. DEL key [key ...]: ν•˜λ‚˜ μ΄μƒμ˜ ν‚€(key)와 μ—°κ²°λœ 값을 μ‚­μ œν•΄μš”.

    > DEL mykey
    (integer) 1
  4. INCRBY key increment: 주어진 ν‚€(key)에 μ €μž₯된 숫자 값을 주어진 increment 만큼 μ¦κ°€μ‹œμΌœμš”.

    > SET mycounter 10
    OK
    result: mycounter: 10
    
    > INCRBY mycounter 5
    (integer) 15
  5. DECRBY key decrement: 주어진 ν‚€(key)에 μ €μž₯된 숫자 값을 주어진 decrement 만큼 κ°μ†Œμ‹œμΌœμš”.

    > SET mycounter 20
    OK
    
    > DECRBY mycounter 8
    (integer) 12
  6. APPEND key value: 주어진 ν‚€(key)에 μ €μž₯된 λ¬Έμžμ—΄ 끝에 μΆ”κ°€ λ¬Έμžμ—΄ 값을 λΆ™μ—¬μš”.

    > SET mystring "Hello, "
    OK
    
    > APPEND mystring "Redis"
    (integer) 12
    
    result: "Hello, Redis"
  7. STRLEN key: 주어진 ν‚€(key)에 μ €μž₯된 λ¬Έμžμ—΄μ˜ 길이λ₯Ό λ°˜ν™˜ν•΄μš”.

    > STRLEN mystring
    (integer) 12
  8. SETNX key value: 주어진 ν‚€(key)κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œμ—λ§Œ λ¬Έμžμ—΄ 값을 μ €μž₯ν•΄μš”.

    > SETNX mystring "New Value"
    (integer) 0  // 이미 ν‚€κ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— 값을 ν• λ‹Ήν•  수 μ—†μ–΄μš”.
    
    > SETNX newKey "New Value"
    (integer) 1 // 기쑴에 newKeyκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 킀와 값을 ν• λ‹Ήν–ˆμ–΄μš”.

    NX의 λœ»μ€ Not eXists의 μ•½μžμ—μš”. λ§Œμ•½ "mykey" ν‚€κ°€ 이미 μ‘΄μž¬ν•œλ‹€λ©΄ λ™μž‘ν•˜μ§€ μ•Šμ•„μš”.

  9. SETEX key seconds value: 주어진 ν‚€(key)에 λ¬Έμžμ—΄ 값을 μ €μž₯ν•˜κ³  만료 μ‹œκ°„(초)을 μ„€μ •ν•΄μš”.

    > SETEX mykey 60 "μ½”λ“œλ ˆμ΄μ„œ"
    OK
    
    GET mykey
    > μ½”λ“œλ ˆμ΄μ„œ
    
    GET mykey  // 60초 ν›„
    > (nil)

    EXλŠ” EXpires의 μ•½μžμ—μš”. 60초 후에 "mykey" 킀와 값이 μ‚­μ œλΌμš”.

  10. GETSET key value: 주어진 ν‚€(key)에 μ €μž₯된 이전 값을 κ°€μ Έμ˜€κ³  μƒˆλ‘œμš΄ 값을 μ„€μ •ν•΄μš”.

    > SET mykey "Old Value"
    OK  // 기쑴에 ν‚€κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ (nil)을 λ°˜ν™˜ν•΄μš”.
    
    > GETSET mykey "New Value"
    "Old Value"

ν™œμš©

OTP: One-Time Password

Redisλ₯Ό μ‚¬μš©ν•œ OTP(One-Time Password) κ΅¬ν˜„μ€ λ³΄μ•ˆ 및 인증 μ‹œμŠ€ν…œμ—μ„œ 맀우 μœ μš©ν•΄μš”. OTPλŠ” ν•œ 번만 μ‚¬μš©ν•  수 μžˆλŠ” λΉ„λ°€λ²ˆν˜Έλ‘œ, 둜그인 및 인증 ν”„λ‘œμ„ΈμŠ€μ—μ„œ λ³΄μ•ˆμ„ κ°•ν™”ν•˜λŠ” 데 μ‚¬μš©λΌμš”.

OTP: One-Time Password

  1. μ‚¬μš©μžκ°€ μ„œλ²„μ— OTP 인증을 μš”μ²­ν•΄μš”.
  2. μ„œλ²„μ—μ„œ Redis에 정해진 μ‹œκ°„μ— λ§Œλ£Œλ˜λŠ” SETEX λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ λ ˆλ””μŠ€μ— μ €μž₯ν•΄μš”.
  3. OTPλ₯Ό λ ˆλ””μŠ€μ— μ €μž₯μ‹œν‚¨ 이후 μ‚¬μš©μžμ—κ²Œ OTPλ₯Ό μ „μ†‘ν•΄μš”.
  4. μ‚¬μš©μžλŠ” λ§Œλ£Œμ‹œκ°„ 이전에 μ„œλ²„μ—κ²Œ 전달받은 OTPλ₯Ό μ „μ†‘ν•΄μš”.
  5. Redisμ—μ„œ κ°€μ Έμ˜¨ OTP와 μ‚¬μš©μžκ°€ μ „μ†‘ν•΄μ˜¨ OTP값을 λΉ„κ΅ν•΄μš”.
    • λ§Œμ•½ μ‹œκ°„μ΄ λ§Œλ£Œλ˜μ—ˆλ‹€λ©΄, Redisμ—μ„œ nil을 λ°˜ν™˜ν•΄μš”.
  6. OTP 인증 성곡을 λ°˜ν™˜ν•΄μš”.

뢄산락: Distributed Lock

λΆ„μ‚° λ½μ΄λž€ λ‹€μˆ˜μ˜ ν”„λ‘œμ„ΈμŠ€μ—μ„œ λ™μΌν•œ μžμ›μ„ μ ‘κ·Όν•  λ–„ λ™μ‹œμ„± 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λΌμš”. 예λ₯Ό λ“€μ–΄ μˆ˜λŸ‰μ˜ 값이 100으둜 μ‘΄μž¬ν•˜κ³  μžˆμ„ λ•Œ λ™μ‹œμ— AλŠ” 20으둜 쀄이고 BλŠ” 20을 높일 경우, AλŠ” 80을 κΈ°λŒ€ν•˜κ³  BλŠ” 120을 κΈ°λŒ€ν•˜μ§€λ§Œ, 리턴값은 100을 λ°›μ•„μš”. λ”°λΌμ„œ μ΄λŸ¬ν•œ λ™μ‹œμ„± 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Redisλ₯Ό ν™œμš©ν•΄ 뢄산락을 κ΅¬ν˜„ν•  수 μžˆμ–΄μš”.

뢄산락: Distributed Lock

  1. μš°μ„  락을 νšλ“ν•΄μš”. SETNX λͺ…λ Ήμ–΄λ₯Ό 톡해 ν•΄λ‹Ή 락이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ κ²½μš°μ—λ§Œ 락을 μƒμ„±ν•΄μš”.
    • SETNX lock:coke β€œlocked”
    • lock:coke의 락이 μƒμ„±λ˜κ³  λ‚œ μ΄ν›„μ—λŠ” λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μˆ˜λŸ‰μ„ μˆ˜μ •ν•˜κΈ° 전에 μ ‘κ·Όν•  수 μ—†μ–΄μš”.
    • λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ λ‹€μ‹œ 락을 νšλ“ν•˜κΈ° μœ„ν•΄ SETNX lock:coke β€œlocked” λͺ…λ Ήμ–΄λ₯Ό μž‘μ„±ν•  경우 이미 ν•΄λ‹Ή keyκ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— μ €μž₯μ‹œν‚¬ 수 μ—†κΈ° λ•Œλ¬Έμ΄μ—μš”.
  2. 락이 항상 μ˜μ›νžˆ μ§€μ†λ˜μ§€ μ•Šλ„λ‘ 만료 μ‹œκ°„μ„ μ„€μ •ν•΄μš”.
    • EXPIRE lock:coke 30
  3. λ‘œμ§μ„ μ „λΆ€ μ²˜λ¦¬ν•˜κ³  λ‚˜λ©΄ 락을 λ°˜ν™˜ν•΄μš”. λ§Œμ•½ μ„œλΉ„μŠ€κ°€ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ—ˆλ”λΌλ„ EXPIREλ₯Ό 톡해 만료 μ‹œκ°„μ„ μ„€μ •ν•΄ λ‘μ—ˆκΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή 락이 μžλ™μœΌλ‘œ λ°˜ν™˜λΌμš”.
    • DEL lock:coke

마무리

Redis의 Strings 데이터 νƒ€μž…κ³Ό κ΄€λ ¨λœ λͺ…λ Ήμ–΄ 10가지와 μ‚¬μš© μ˜ˆμ‹œλ₯Ό 톡해 Redis의 κ°•λ ₯ν•œ κΈ°λŠ₯을 μ•Œμ•„λ³΄μ•˜μ–΄μš”. StringsλŠ” λ‹€μ–‘ν•œ 데이터 처리 μž‘μ—…μ„ μ§€μ›ν•˜λ©°, 뢄산락과 OTP 같은 μ€‘μš”ν•œ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œλ„ ν™œμš©λΌμš”. Redisλ₯Ό 톡해 데이터λ₯Ό 효율적으둜 μ €μž₯, 검색 및 μ‘°μž‘ν•˜λŠ” 방법을 μ΄ν•΄ν•˜μ…¨κΈΈ λ°”λΌμš”πŸ˜Ž.

profile
πŸŽοΈπŸ’¨ Beep Beep

0개의 λŒ“κΈ€