멤버 만료로 Redis 세트 생성
Redis은 다양한 유형의 값을 지원하는 우수한 메모리 내 키-값 데이터 저장소입니다. Sorted Sets도 그 중 하나입니다. 문서
sorted sets
에 따르면 다음과 같습니다.Sorted sets, similar to Sets but where every string element is associated to a floating number value, called score. The elements are always taken sorted by their score, so unlike Sets it is possible to retrieve a range of elements (for example you may ask: give me the top 10, or the bottom 10).
그들이
sorted sets
에 대해 말하지 않은 것은 적어도 이 블로그 게시물이 생성될 때까지 sets members
의 만료를 정의할 수 없다는 것입니다. 만료sets members
를 정의해야 하는 이유는 무엇입니까?제 경우에는 특정 제한이 있는 사용자에게 전송되는 OTP를 생성하고 확인할 수 있는 전화 서비스를 만들어야 했습니다. 이전 디자인은 Golang Rate Limit을 사용하고 있어서 수평 확장이 불가능하다고 생각했습니다. 그래서 이 경우에 Redis를 사용할 것이라고 생각했습니다. OTP 생성 요구 사항은 다음과 같습니다.
X times
당 최대 Y minutes
개의 OTP를 요청할 수 있습니다.그래서
Redis sets
를 생각해냈지만 sets members
는 자체 만료 시간을 가질 수 없습니다. 그런 다음 this issue comment에 의해 @pietern을 찾을 때까지 인터넷 검색을했습니다. 이것은 꽤 해키한 움직임이지만 최소한 실행 가능합니다. 그래서 그것을 구현하려고 노력했습니다. 다시 한 번 Github에 대한 댓글이 제 직업을 구했습니다.정렬된 세트의 점수를 만기 밀리초로 사용하는 아이디어는 매우 간단합니다. 점수가
current millis
와 current millis + Y minutes
사이인 유효한 멤버를 가져오고 점수가 0 과 current millis
사이인 만료된 멤버를 제거합니다. 따라서 최소 의사 코드는 다음과 같습니다.# define variables
timeLimit := Y
requestLimit := X
key := +6212312341234
otp := randomString(6)
now := currentMillis()
exp := now + timeLimit
# get total of generated phone number in key
validOTPs := redisQuery("ZRANGEBYSCORE $key $now $exp")
# Limitting request
if count(validOTPs) >= requestLimit
then exit
# Add members to key
redisQuery("ZADD $key $exp $otp")
나는 이 방법이 충분히 훌륭하고 구현하기에 가장 간단한 방법이라고 생각합니다.
adding expiration to the key
또는 removing members that are no longer valid
와 같은 선택적 작업을 추가할 수 있습니다. 하지만 이 작업은 sets member
에 만료를 추가하기에 충분합니다. 이 방법을 사용하여 무차별 대입을 방지하기 위해 OTP 인증을 제한할 수도 있습니다.
Reference
이 문제에 관하여(멤버 만료로 Redis 세트 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/clavinjune/create-redis-sets-with-member-expiration-4fh3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)