redis 기본 명령어 /사용법 / 설정 / 전략
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 게임상태
- 현재 게임의 턴 , 낮 / 밤 상태
- 각 플레이어의 현재 상태(보유 카드 수 , 파산 여부 등)
- 각 플레이어의 순서 및 방 정보
//예시
{
"gameId": "game123",
"state": "day", // "day" or "night"
"turnOrder": ["player1", "player2", "player3"],
"playerStates": {
"player1": { "cards": 5, "bankrupt": false },
"player2": { "cards": 10, "bankrupt": false },
// ...
}
}
카드정보
- 각 플레이어의 보유 카드 목록
- 사용된 카드 및 그에 따른 효과
//예시
{
"player1":["trapCard1","actionCard2"],
"player2":["counterCard1"]
}
게임 진행 정보
- 게임 시작 시간 , 현재 시간 , 남은 턴 시간 등
- session 플레이어 정보 1.플레이어ID,방ID,개인적인 게임 상태(카드수)
//세션
{
"playerId": "player1",
"roomId": "room123",
"currentCards": 5,
"isBankrupt": false
}
턴 정보
2. 현재 턴 번호 , 이전 턴의 카드 사용 내역 등
{
"currentTurn": 1,
"lastUsedCard": "trapCard1"
}
- 데이터의 흐름
- 게임 시작 redis에 게임 상태 초기화 (게임 ID , 플레이어 수 , 턴 순서 등) 각 플레이어의 세션에 개인 정보를 저장
- 턴 진행 플레이어가 카드를 사용핼 때 , redis에서 게임 상태를 업데이트 플레이어의 세션에서도 카드 사용 내역 및 현재 카드 수 업데이트
- 낮/밤 전환 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"