Redis

redis 기본 명령어 /사용법 / 설정 / 전략

한우종 2024. 11. 18. 09:59
Redis 기본 명령어

 

@데이저저장
set 키이름 : 벨류 “벨류값” = 데이터저장
띄어쓰기 사용시 “” 사용
@데이터 조회
get 키 : 값

 

@모든 키값을 보는 방법
keys *

 

@데이터 삭제
del key 키:값

 

@만료시간 설정
set 키 : 값 “벨류” ex 30

 

@만료시간 조회
ttl 키:값
설정값이 있다면 -1 없다면 -2

 

@모든 데이터 삭제
flushall

 

@ ;콜론을 사용해 계층적 의미를 구분해서 사용
내가:키우는:개

홍길동이:오늘훔친:양말
  • 장점

1.검색 필터링 용의

2.확장성

 

@캐시

원본 저장소보다 빠르게 가져올 수 있는 임시 데이터 저장소

 

@캐싱

캐시에 접근해서 데이터를 빠르게 가져오는 방식임

대형마트 가기 귀찮으니 앞에 편의접가서사옴

 

@캐싱전략

 

1. Cache Aside (= Look Aside , Lazy Loading) 전략

캐시에 데이터가 있을경우 =Cache Hit 편의점에 가서 물건 있는지 물어봄 ⇒있음 ⇒구매함|| 없음 ⇒대형마트에서 가져옴⇒ 편의점에 넣어줌 ⇒편의점에 팜 캐시에 데이터가 없을경우 = Cache Miss 편의점에 없음 ⇒ 마트감 ⇒ 편의점마트전략

 

2. Write Around 전략 레디스에 저장안하고 db에 저장하는 전략

두 전략을 같이 쓸 경우 한계점

 

3. 캐시된 데이터와 db데이터가 일치하지 않을 수 있다.

즉 데이터의 일관성을 보장할 수 없다.

 

4. 캐시에 저장할 수 있는 공간이 비교적 작다. db는 디스크에 저장해서 많은 양을 저장하지만 캐시는 메모리에 저장하기떄문에 db에 비해 많은 양의 데이터를 저장할 수가 없음

한계는 어떻게 극복하는가?

 

5. 캐시된 데이터와 db데이터가 일치하지 않을 수 있음 어쩔수없음 ㅋㅋ 뭘 얻으면 뭘 포기해야함 이 경우 일관성 포기=⇒ 성능향상 잘 변하지 않는 경우의 데이터 . 실시간으로 정확하게 일치하지 않아도 되는 데이터 등에 사용 하지만 장기간 데이터가 일치하지 않는건 문제가 될 수 있음 따라서 적절한 주기로 데이터 동기화시켜줘야함 이떄 활용하는 기능이 TTL기능(만료시간 설정)이다.

캐시없음 ⇒ db들어감 ⇒ 데이터조회 ⇒ 캐시에 데이터 삽입 ⇒ 데이터 갱신

 

6. 캐시에 저장할 수 있는 공간이 비교적 작다. TTL을 활용하여 자주 조회하지 않는 데이터는 만료 시간 설정으로 데이터를 삭제시킴

 

@데이터 조회 성능 개선

SQL튜닝 , 캐싱서버활용 , 레플리케이션 , 샤딩 ,db스케일업

최우선 순위 : SQL튜닝

1.SQL튜닝을 제외한 나머지는 추가적인 시간,비용이듬 sql튜닝은 기존 시스템 변경없이 성능을 개선가능 2. 근본적인 문제를 해결하는 방법이 sql튜닝일 가능성 높음 sql자체가 비효율적으로 작성된 경우 시스템 성능개선을 하더라고 한계가 있음

@위치 정보 저장자료형 추천

geospatial indexs https://devfunny.tistory.com/936

안에 {user1:(x:42.123123,y:1.123213),user2:(x:42.123123,y:1.123213),user3:(x:42.123123,y:1.123213),user4:(x:42.123123,y:1.123213),user5:(x:42.123123,y:1.123213)user6:(x:42.123123,y:1.123213)}

 

@redis를 사용하여 저장할 값과 session을 사용해 저장할만한값 정리
  • redis 게임상태
  1. 현재 게임의 턴 , 낮 / 밤 상태
  2. 각 플레이어의 현재 상태(보유 카드 수 , 파산 여부 등)
  3. 각 플레이어의 순서 및 방 정보
//예시
{
  "gameId": "game123",
  "state": "day", // "day" or "night"
  "turnOrder": ["player1", "player2", "player3"],
  "playerStates": {
    "player1": { "cards": 5, "bankrupt": false },
    "player2": { "cards": 10, "bankrupt": false },
    // ...
  }
}

 

카드정보
  1. 각 플레이어의 보유 카드 목록
  2. 사용된 카드 및 그에 따른 효과
//예시
{
"player1":["trapCard1","actionCard2"],
"player2":["counterCard1"]
}

 

게임 진행 정보
  1. 게임 시작 시간 , 현재 시간 , 남은 턴 시간 등
  • session 플레이어 정보 1.플레이어ID,방ID,개인적인 게임 상태(카드수)
//세션
{
  "playerId": "player1",
  "roomId": "room123",
  "currentCards": 5,
  "isBankrupt": false
}

 

턴 정보

 

2. 현재 턴 번호 , 이전 턴의 카드 사용 내역 등

{
  "currentTurn": 1,
  "lastUsedCard": "trapCard1"
}

 

 

  • 데이터의 흐름
  1. 게임 시작 redis에 게임 상태 초기화 (게임 ID , 플레이어 수 , 턴 순서 등) 각 플레이어의 세션에 개인 정보를 저장
  2. 턴 진행 플레이어가 카드를 사용핼 때 , redis에서 게임 상태를 업데이트 플레이어의 세션에서도 카드 사용 내역 및 현재 카드 수 업데이트
  3. 낮/밤 전환 redis 에서 상태 변경(낮/밤) 플레이어의 세션에서 해당 상태에 따른 메시지나 알림 처리
@도커 레디스 비밀번호설정

참고블로그

redis-cli로 접속후

config set requirepass [비밀번호]

 

# 비번실행 테스트
127.0.0.1:6379> AUTH 'test'
(error) ERR AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct?
=> 비번 설정이 되어 있지 않아 error 발생

# 비번설정 정보 확인 
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
=> 비번정보가 없다.

# 비번 설정
127.0.0.1:6379> config set requirepass strongPassword
OK

# 테스트 정보 세팅
127.0.0.1:6379> set foo 1234
OK

# 비번 테스트를 위해 재접속
127.0.0.1:6379> exit
root@c9f0cdfa7cff:/data# redis-cli

# 비번 인증 없이 조회 시 에러 발생
127.0.0.1:6379> get foo
(error) NOAUTH Authentication required.

# 비번 인증
127.0.0.1:6379> AUTH 'strongPassword'
OK

# 정보조회 확인
127.0.0.1:6379> get foo
"1234"