본문 바로가기

Database

Redis의 활용과 자료구조

Redis의 활용

인증, 캐싱, 재고관리 등에 사용이 되는데 이것들은 데이터의 영구적 보관보단 일시적 관리에 사용된다. → ttl (시간제한)이 많이 사용됨

데이터가 update되면 레디스에 있는 캐싱된 데이터도 같이 update시켜줘야 함

aws를 사용하면 자동 캐싱을 해주는 경우가 있어서 더 좋은 속도 (성능)을 경험할 수 있다.

 

자료구조

string : value가 string →재고관리

list : value가 리스트 형식, 자바 deque 형식이다 → 최근 방문 페이지

set : 중복제거, 순서 없음 → 오늘 방문자수

zset : score를 기준으로 순서 있는 set → 최근 본 상품

hset : value가 객체 형식

 

1. string

# 좋아요 기능 구현
set likes:posting:1 0
incr likes:posting:1 # 특정 key값의 value를 1만큼 증가
decr likes:posting:1
get likes:posting:1

# 재고 기능 구현
set product:1:stock 100
decr product:1:stock
get product:1:stock

# bash쉘을 활용하여 재고감소 프로그램 작성
redis_stock.sh

# 캐싱 기능 구현
# 1번 author 회원 정보 조회
# select name, email, age from author where id=1;
# 위 데이터의 결과값을 redis로 캐싱 : json 데이터 형식으로 저장
set user:1:detail "{\\"name\\":\\"hong\\", \\"email\\":\\"hong@naver.com\\", \\"age\\":30}" ex 10

 

2. list

# list
# redis의 list는 java의 deque와 같은 구조 즉,double-ended queue구조
# 데이터 왼쪽 삽입
LPUSH key value
# 데이터 오른쪽 삽입
RPUSH key value
# 데이터 왼쪽부터 꺼내기
LPOP key
# 데이터 오른쪽부터 꺼내기
RPOP key
#  데이터 개수 조회
LLEN key

lpush hongildongs hong1
lpush hongildongs hong1
lpush hongildongs hong1
lpop hongildongs
llen hongildongs

# list의 요소 조회시에는 범위 지정
# 0 -1 처음부터 끝까지
lrange hongildongs start end 
lrange hongildongs 0 -1 

# TTL 적용
expire hongildongs 30

# TTL 조회
ttl hongildongs

# 꺼내서 없애는게 아니라, 꺼내서 보기만
lrange hongildongs -1 -1
lrange hongildongs 0 0

# pop과 push 동시에
RPOPLPUSH A리스트 B리스트

# 어떤 목적으로 사용될 수 있을까?
# 최근 방문한 페이지
# 5개 정도 데이터 push
# 최근 방문한 페이지 3개를 보여주기
lpush recently_visit naver
lpush recently_visit daum
lpush recently_visit kakao
lpush recently_visit google
lpush recently_visit nate

lrange recently_visit 0 2

# 방문 페이지 5개에서 뒤로가기 구현
rpush forwards naver
rpush forwards daum
rpush forwards kakao
rpush forwards google
rpush forwards nate

rpoplpush forwards backwards 

 

3. set

# set 조회
smembers members

# set에서 멤버 삭제
srem members member2

# set멤버 개수 반환
scard members

# 특정 멤버가 set안에 있는지 존재 여부 확인
sismember members member3

# 매일 방문자수 계산
# 재방문은 count하지 않음
sadd visit:2024-05-27 hong1@naver.com

 

4. zset

# zset (sorted set)
zadd zmembers 3 member1
zadd zmembers 4 member2
zadd zmembers 1 member3
zadd zmembers 2 member4

# score 기준 오름차순 정렬
zrange zmembers 0 -1

# score 기준 내림차순 정렬
zrevrange zmembers 0 -1

# zset 삭제
zrem zmembers members2

# zrank는 해당 멤버가 몇번째 index인지 출력
zrank zmembers member2

# 최근 본 상품목록
zadd recent:products 192411 apple
zadd recent:products 192413 apple
zadd recent:products 192415 banana
zadd recent:products 192417 orange
zadd recent:products 192420 apple

zrevrange recent:products 0 2

 

5. hset

# hashes 
hset product:1 name "apple" price 1000 stock 50
hget product:1 name
hget product:1 price
hget product:1 stock
# 모든 객체 값 get
hgetall product:1
# 특정 요소 값 수정
hset product:1 stock 40
# 특정 요소의 값을 증가
hincrby product:1 stock 5
# 특정 요소의 값을 감소
hincrby product:1 stock -5

 

 

메시지의 pub/sub 구조

 

redis를 활용하여 메시지를 발행하고 구독하는 서비스

한번 발송된 메시지는 저장되지 않음

  • pub/sub 구조의 예시
  • kafka가 pubsub구조를 사용하는데 a서버와 b서버 통신시 두 서버가 직접 통신하지 않고 kafka라는 중간 저장소를 통해 b서버가 통신이 잠깐 끊기더라도 데이터가 유실되지 않고 안전하게 저장소에서 메시지를 받아갈 수 있다.