Redis Update Sorted Set on Key Expire

Oct 13 2020

키 값 쌍 세트와 해당 키 값 쌍의 키 인덱스를 제공하는 정렬 된 세트가있는 Redis 서버가 있습니다.

키 값 쌍은 "완료 됨"상태가 될 수 있으며이 시점에서 1 시간 후에 삭제해야합니다. 이는 키에 만료를 설정하여 간단히 수행 할 수 있지만 정렬 된 세트에서 키를 지우는 것이 더 문제가되는 것처럼 보입니다.

세트를 스캔하고 수시로 업데이트하는 프로세스를 가질 수 있지만 조금 더 깨끗한 것을 갖는 것이 좋을 것입니다.

만료시 저장 프로 시저와 같은 것을 트리거하거나 정렬 된 집합 값에 만료를 설정하는 방법이 없다고 생각합니다.

내가 놓친 것이 있습니까? 아니면 수동이 유일한 방법입니까?

답변

3 TugGrall Oct 13 2020 at 18:43

정렬 된 설정 값 자체에 "만료"를 넣을 수 없습니다.

그러나 기본 키로 작업하고 만료가 발생할 때 이벤트를 캡처 할 수 있습니다. 이를 달성하는 방법은 두 가지 이상입니다.

  • 사용 키 공간 알림
  • Redis Gears 사용

키 스페이스 알림

키 공간 알림을 사용하면 사용할 수있는 PUBLISH 메시지를 보내는 EXPIRE 이벤트를 캡처 할 수 있습니다.

기본 흐름을 설명하겠습니다.

알림 구성

CONFIG SET notify-keyspace-events Ex
  • E : 키에서 발생하는 이벤트
  • x : 만료 된 이벤트 캡처

이제 데이터베이스가 __key*__:*채널에 이벤트를 게시합니다 .

따라서 이러한 이벤트를 수신하는 서비스를 구축하여 세트를 직접 또는 간접적으로 업데이트 할 수 있습니다.

psubscribe __key*__:*

다음 값과 만료를 설정하는 애플리케이션이있는 경우

set foo bar EX 5

다음 메시지를 받아야합니다.

1) "pmessage"
2) "__key*__:*"
3) "__keyevent@0__:expired"
4) "foo"

Redis Gears

Redis Gears를 사용하면 동일한 이벤트를 캡처하지만 (알림을 기반으로 함) Redis 데이터베이스에 직접 코드를 작성하는 것이 더 쉽습니다.

다음과 같이 Gears를 만들 수 있습니다. (이것은 Python 스크립트이며 RedisInsight를 사용하여 Redis에 배포하고 있습니다)

def process(x):
    execute('LPUSH', 'expired:keys', x['value']['key']);

# Capture an expiration event and adds it to 'expired:events' stream
cap = GB('KeysReader')
cap.foreach(lambda x:
            execute('XADD', 'expired:events', '*', 'key', x['key']))
cap.register(prefix='*',
             mode='sync',
             eventTypes=['expired'],
             readValue=False)

# Consume new messages from expiration streams and process them somehow
proc = GB('StreamReader')
proc.foreach(process)
proc.register(prefix='expired:*',
              batch=100,
              duration=1, 
              trimStream = False)

에 의해 시작된 섹션을보십시오 cap = GB('KeysReader')

  • 이것은 모든 키 만료 prefix='*'및eventTypes=['expired']
  • 만료되는 경우 'expired:events'XADD 명령을 사용하여 Redis Stream에 메시지를 추가합니다.
  • 그런 다음 proc = GB('StreamReader')스트림을 처리 할 함수 를 봅니다.
  • 새 메시지가 스트림에있을 때마다 process()함수 를 호출합니다 .

이 함수에서 정렬 된 집합을 업데이트하는 논리를 추가 할 수 있습니다. 내 예에서는 만료 된 키를 목록에 추가했습니다.


당신의 초기 질문에서 조금 벗어나도록하겠습니다.

정렬 된 집합을 사용하여 데이터에 대한 인덱싱 형식을 만드는 것 같습니다.

이 경우 해시 필드 를 인덱싱 한 다음 인덱스를 사용하여 고급 쿼리 및 집계를 수행 할 수있는 또 다른 Redis 모듈 인 RediSearch를 살펴 봐야 합니다.

RediSearch를 사용하면 인덱스를 관리하기 위해 코드를 추가 할 필요가 없으며 데이터베이스에서 자동으로 수행되며 필드에서 쿼리 할 수 ​​있습니다.

다음을 살펴 보도록 권합니다.

  • RediSearch 모듈
  • RediSearch 시작하기

이것이 당신이 Sorted Set을 사용하는 이유가 아니라면 죄송하지만, 오늘 수동으로 인덱스를 관리한다면 애플리케이션 코드를 많이 단순화 할 수 있으므로 확인해 볼 가치가 있다고 생각합니다.