SlideShare a Scribd company logo
1 of 24
Download to read offline
How to name a Cache Key
charsyam@naver.com
직장인의 공통적인 질문!!!
직장인의 공통적인 질문!!!
오늘 점심 뭐 먹지?
Cache Key를 설정할 때의 고민!!!
Cache Key를 설정할 때의 고민!!!
Cache Key 이름을 뭘로 할까?
왜 Cache Key의 이름은 중요할까?
• 당연히 뭔지를 알기 위한 변수명은 중요하다.
• 좀 더 적합한 데이터 타입이나 접근을 하기 위해서…
간단한 예 : API call Limit 를 구현한다면?
가정 #1
• 한 유저는 여러가지 API를 호출 할 수 있다.
• 모든 API는 호출 후 10초간 다른 API를 사용 할 수 없다.
Cache Key 이름을 UserID로 하면 어떨까?
• Key 검색을 UserID로 해도 가능
• Key만 존재하면 모든 API 호출을 막으면 원하는 동작이 됨.
• Key가 존재하지 않으면, API를 호출하고 Cache Key를 만들어 주면 됨.
Cache Key 이름을 UserID로 하면 어떨까?
가정 #2
• 한 유저는 여러가지 API를 호출 할 수 있다.
• 모든 API는 같은 API만 10초간 호출 할 수 없다.
• 즉 한 유저가 여러가지를 겹치지만 않으면 계속 호출 할 수 있음.
Cache Key 이름을 UserID로 하면 어떨까?
• api 종류를 알 수 없기 때문에, 우리가 원하는 형태로 limit를 구할 수 가 없다.
value로 api 종류를 넣으면 어떻게 될까?
• value가 다르면 api를 호출하게 해주자!!!
• 다른 api가 실행되면, 값이 덮어씌워지기 때문에 모든 api를 연속적으로 순서만 바꿔주
면 계속 호출 가능하게 됨.
• 즉 해당 방법으로는 처리가 안됨.
value로 api 종류를 넣으면 어떻게 될까?
Redis라면 hash 자료 구조를 쓸 수도…
• Redis는 hash구조를 제공하므로
• hset <main key> <sub key> <value>
• hset <userid> <api type> <마지막 시간>
• 형태로 넣어두고 체크 가능
• Memcached는 안됨.
• Arcus는 가능 btree 제공
그럼? userid + url 종류
• api:<userid>:url종류로 cache key를 잡으면 해결이 됨.
• 그런데 특정 userid의 캐시를 전부 지우고 싶다면?
• 일일이 찾아야 함.
가정 #3
• 특정 API를 최근 5분간 10번만 호출할 수 있다면…
00 01 02 03 04 05 06 07 08
최대 10번
최대 10번
최대 10번
최대 10번
기존의 방식으로 처리 안됨
• 단순히 userid + api 종류 로는 처리가 안됨.
각 1분간의 정보를 따로 저장한다면?
• 특정 API 호출을 1분 단위로 개수를 저장하고, 최근 5개의 값을 보고 api 허용
을 결정한다.
1 2 3 4 5 6 7 8
3 1 1 4 1
호출 시점
최대 3개를 호출 할 수 있음
각 1분의 정보를 저장한다면…
• <userid> + <api type> + <yyyyMMddHHmm> 형태로 저장 가능
• value로는 그 시간(분 단위)의 호출 개수를 저장한다.
• 2019년 1월 13일 00시 10분 이라면 다음 5개를 가져와서 값을 더한다.
• 201901130010
• 201901130009
• 201901130008
• 201901130007
• 201901130006
• 만약 최근 5초라면 key는 초에 대한 정보가 들어가야 함.
• 20190113000601
사실 중요한 건 이름이 아니라
해당 데이터가 어떻게 사용되는가임!!!
즉 이름의 정한다는 건
그 특성을 정확하게 파악한다는 의미…
그리고 그 특성을 들어내도록
cache key 이름을 짓도록하자.
결론
Thank you!

More Related Content

What's hot

아마존 Aws 서비스_연구
아마존 Aws 서비스_연구아마존 Aws 서비스_연구
아마존 Aws 서비스_연구
knight1128
 
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
주항 박
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
Dae Kim
 
SPDY : 더 빠른 웹을 위한 프로토콜
SPDY : 더 빠른 웹을 위한 프로토콜SPDY : 더 빠른 웹을 위한 프로토콜
SPDY : 더 빠른 웹을 위한 프로토콜
Yunsang Choi
 

What's hot (20)

How to use redis well
How to use redis wellHow to use redis well
How to use redis well
 
CoreDot TechSeminar 2018 - Session2 Ji Donghyun
CoreDot TechSeminar 2018 - Session2 Ji DonghyunCoreDot TechSeminar 2018 - Session2 Ji Donghyun
CoreDot TechSeminar 2018 - Session2 Ji Donghyun
 
CoreDot TechSeminar 2018 - Session1 Park Jihun
CoreDot TechSeminar 2018 - Session1 Park JihunCoreDot TechSeminar 2018 - Session1 Park Jihun
CoreDot TechSeminar 2018 - Session1 Park Jihun
 
Data Engineering 101
Data Engineering 101Data Engineering 101
Data Engineering 101
 
Http2(http2.0,g rpc,cookie,session,idempotent, x forwarded-for)
Http2(http2.0,g rpc,cookie,session,idempotent, x forwarded-for)Http2(http2.0,g rpc,cookie,session,idempotent, x forwarded-for)
Http2(http2.0,g rpc,cookie,session,idempotent, x forwarded-for)
 
루비온레일즈 API 서버 - 2) api 서버에 대한 이해 및 맛보기
루비온레일즈 API 서버 - 2) api 서버에 대한 이해 및 맛보기루비온레일즈 API 서버 - 2) api 서버에 대한 이해 및 맛보기
루비온레일즈 API 서버 - 2) api 서버에 대한 이해 및 맛보기
 
텀 프로젝트에서 제품 프로젝트로 - 성준영님
텀 프로젝트에서 제품 프로젝트로 - 성준영님텀 프로젝트에서 제품 프로젝트로 - 성준영님
텀 프로젝트에서 제품 프로젝트로 - 성준영님
 
2회 오픈소스 게임 서버 엔진 스터디 캠프 - CloudBread
2회 오픈소스 게임 서버 엔진 스터디 캠프 - CloudBread2회 오픈소스 게임 서버 엔진 스터디 캠프 - CloudBread
2회 오픈소스 게임 서버 엔진 스터디 캠프 - CloudBread
 
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceKGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
 
Express framework tutorial
Express framework tutorialExpress framework tutorial
Express framework tutorial
 
Comet
CometComet
Comet
 
루비온레일즈 API 서버 - 1) 인터넷 구조에 대한 대략적인 이해
루비온레일즈 API 서버 - 1) 인터넷 구조에 대한 대략적인 이해루비온레일즈 API 서버 - 1) 인터넷 구조에 대한 대략적인 이해
루비온레일즈 API 서버 - 1) 인터넷 구조에 대한 대략적인 이해
 
아마존 Aws 서비스_연구
아마존 Aws 서비스_연구아마존 Aws 서비스_연구
아마존 Aws 서비스_연구
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
 
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
 
서버성능개선 류우림
서버성능개선 류우림서버성능개선 류우림
서버성능개선 류우림
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
 
SPDY : 더 빠른 웹을 위한 프로토콜
SPDY : 더 빠른 웹을 위한 프로토콜SPDY : 더 빠른 웹을 위한 프로토콜
SPDY : 더 빠른 웹을 위한 프로토콜
 
Clova Tech Summit 세션3 :Clova extension에서 OAuth 계정 연동 구현
Clova Tech Summit 세션3 :Clova extension에서 OAuth 계정 연동 구현Clova Tech Summit 세션3 :Clova extension에서 OAuth 계정 연동 구현
Clova Tech Summit 세션3 :Clova extension에서 OAuth 계정 연동 구현
 

Similar to How to name a cache key

이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
Jeongsang Baek
 

Similar to How to name a cache key (15)

이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
XE 오픈 세미나(2014-02-22) - XE 서버 성능 개선
XE 오픈 세미나(2014-02-22) - XE 서버 성능 개선XE 오픈 세미나(2014-02-22) - XE 서버 성능 개선
XE 오픈 세미나(2014-02-22) - XE 서버 성능 개선
 
[MGDC] 리눅스 게임 서버 성능 분석하기 - 아이펀팩토리 김진욱 CTO
[MGDC] 리눅스 게임 서버 성능 분석하기 - 아이펀팩토리 김진욱 CTO[MGDC] 리눅스 게임 서버 성능 분석하기 - 아이펀팩토리 김진욱 CTO
[MGDC] 리눅스 게임 서버 성능 분석하기 - 아이펀팩토리 김진욱 CTO
 
스마일게이트 서버개발캠프 - HGHSS - 합격하소서
스마일게이트 서버개발캠프 - HGHSS - 합격하소서스마일게이트 서버개발캠프 - HGHSS - 합격하소서
스마일게이트 서버개발캠프 - HGHSS - 합격하소서
 
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
 
REST API 설계
REST API 설계REST API 설계
REST API 설계
 
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdfOS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
 
About memcached
About memcachedAbout memcached
About memcached
 
문돌이가 가르치는 서버사이드 PHP
문돌이가 가르치는 서버사이드 PHP문돌이가 가르치는 서버사이드 PHP
문돌이가 가르치는 서버사이드 PHP
 
웹 서버 실행 환경
웹 서버 실행 환경웹 서버 실행 환경
웹 서버 실행 환경
 
web study 1day
web study 1dayweb study 1day
web study 1day
 
AWS 약쟁이
AWS 약쟁이AWS 약쟁이
AWS 약쟁이
 
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
 
build a linux webhosting server
build a linux webhosting serverbuild a linux webhosting server
build a linux webhosting server
 
배치잡 대외용 이형규
배치잡 대외용 이형규배치잡 대외용 이형규
배치잡 대외용 이형규
 

More from DaeMyung Kang

More from DaeMyung Kang (20)

Count min sketch
Count min sketchCount min sketch
Count min sketch
 
Redis
RedisRedis
Redis
 
Ansible
AnsibleAnsible
Ansible
 
The easiest consistent hashing
The easiest consistent hashingThe easiest consistent hashing
The easiest consistent hashing
 
Integration between Filebeat and logstash
Integration between Filebeat and logstash Integration between Filebeat and logstash
Integration between Filebeat and logstash
 
Massive service basic
Massive service basicMassive service basic
Massive service basic
 
How To Become Better Engineer
How To Become Better EngineerHow To Become Better Engineer
How To Become Better Engineer
 
Kafka timestamp offset_final
Kafka timestamp offset_finalKafka timestamp offset_final
Kafka timestamp offset_final
 
Kafka timestamp offset
Kafka timestamp offsetKafka timestamp offset
Kafka timestamp offset
 
Data pipeline and data lake
Data pipeline and data lakeData pipeline and data lake
Data pipeline and data lake
 
Redis acl
Redis aclRedis acl
Redis acl
 
Coffee store
Coffee storeCoffee store
Coffee store
 
Number system
Number systemNumber system
Number system
 
Bloomfilter
BloomfilterBloomfilter
Bloomfilter
 
Redis From 2.8 to 4.x(unstable)
Redis From 2.8 to 4.x(unstable)Redis From 2.8 to 4.x(unstable)
Redis From 2.8 to 4.x(unstable)
 
Redis From 2.8 to 4.x
Redis From 2.8 to 4.xRedis From 2.8 to 4.x
Redis From 2.8 to 4.x
 
Soma search
Soma searchSoma search
Soma search
 
Redis 2017
Redis 2017Redis 2017
Redis 2017
 
Using spark data frame for sql
Using spark data frame for sqlUsing spark data frame for sql
Using spark data frame for sql
 
How to study
How to studyHow to study
How to study
 

How to name a cache key

  • 1. How to name a Cache Key charsyam@naver.com
  • 4. Cache Key를 설정할 때의 고민!!!
  • 5. Cache Key를 설정할 때의 고민!!! Cache Key 이름을 뭘로 할까?
  • 6. 왜 Cache Key의 이름은 중요할까? • 당연히 뭔지를 알기 위한 변수명은 중요하다. • 좀 더 적합한 데이터 타입이나 접근을 하기 위해서…
  • 7. 간단한 예 : API call Limit 를 구현한다면?
  • 8. 가정 #1 • 한 유저는 여러가지 API를 호출 할 수 있다. • 모든 API는 호출 후 10초간 다른 API를 사용 할 수 없다.
  • 9. Cache Key 이름을 UserID로 하면 어떨까? • Key 검색을 UserID로 해도 가능 • Key만 존재하면 모든 API 호출을 막으면 원하는 동작이 됨. • Key가 존재하지 않으면, API를 호출하고 Cache Key를 만들어 주면 됨.
  • 10. Cache Key 이름을 UserID로 하면 어떨까?
  • 11. 가정 #2 • 한 유저는 여러가지 API를 호출 할 수 있다. • 모든 API는 같은 API만 10초간 호출 할 수 없다. • 즉 한 유저가 여러가지를 겹치지만 않으면 계속 호출 할 수 있음.
  • 12. Cache Key 이름을 UserID로 하면 어떨까? • api 종류를 알 수 없기 때문에, 우리가 원하는 형태로 limit를 구할 수 가 없다.
  • 13. value로 api 종류를 넣으면 어떻게 될까? • value가 다르면 api를 호출하게 해주자!!! • 다른 api가 실행되면, 값이 덮어씌워지기 때문에 모든 api를 연속적으로 순서만 바꿔주 면 계속 호출 가능하게 됨. • 즉 해당 방법으로는 처리가 안됨.
  • 14. value로 api 종류를 넣으면 어떻게 될까?
  • 15. Redis라면 hash 자료 구조를 쓸 수도… • Redis는 hash구조를 제공하므로 • hset <main key> <sub key> <value> • hset <userid> <api type> <마지막 시간> • 형태로 넣어두고 체크 가능 • Memcached는 안됨. • Arcus는 가능 btree 제공
  • 16. 그럼? userid + url 종류 • api:<userid>:url종류로 cache key를 잡으면 해결이 됨. • 그런데 특정 userid의 캐시를 전부 지우고 싶다면? • 일일이 찾아야 함.
  • 17. 가정 #3 • 특정 API를 최근 5분간 10번만 호출할 수 있다면… 00 01 02 03 04 05 06 07 08 최대 10번 최대 10번 최대 10번 최대 10번
  • 18. 기존의 방식으로 처리 안됨 • 단순히 userid + api 종류 로는 처리가 안됨.
  • 19. 각 1분간의 정보를 따로 저장한다면? • 특정 API 호출을 1분 단위로 개수를 저장하고, 최근 5개의 값을 보고 api 허용 을 결정한다. 1 2 3 4 5 6 7 8 3 1 1 4 1 호출 시점 최대 3개를 호출 할 수 있음
  • 20. 각 1분의 정보를 저장한다면… • <userid> + <api type> + <yyyyMMddHHmm> 형태로 저장 가능 • value로는 그 시간(분 단위)의 호출 개수를 저장한다. • 2019년 1월 13일 00시 10분 이라면 다음 5개를 가져와서 값을 더한다. • 201901130010 • 201901130009 • 201901130008 • 201901130007 • 201901130006 • 만약 최근 5초라면 key는 초에 대한 정보가 들어가야 함. • 20190113000601
  • 21. 사실 중요한 건 이름이 아니라 해당 데이터가 어떻게 사용되는가임!!!
  • 22. 즉 이름의 정한다는 건 그 특성을 정확하게 파악한다는 의미…
  • 23. 그리고 그 특성을 들어내도록 cache key 이름을 짓도록하자. 결론