>  기사  >  데이터 베이스  >  Redis에는 예약 삭제 기능이 있나요?

Redis에는 예약 삭제 기능이 있나요?

尚
원래의
2019-06-28 17:50:078394검색

Redis에는 예약 삭제 기능이 있나요?

Redis 시간 초과 삭제에는 세 가지 가능한 답변이 있으며 이는 세 가지 다른 삭제 전략을 나타냅니다.

시간 지정 삭제: 키의 만료 시간을 설정하는 동안 타이머(타이머)를 생성하여 키의 만료 시간이 되면 열쇠가 오면 즉시 열쇠를 삭제하세요.

지연 삭제: 키가 만료되도록 두되, 키 공간에서 키를 가져올 때마다 획득한 키가 만료되었는지 확인하고, 만료되지 않은 경우 키를 삭제하고, 키를 반환하세요.

정기 삭제: 프로그램은 가끔씩 데이터베이스를 확인하고 만료된 키를 삭제합니다. 삭제할 만료된 키 수와 확인할 데이터베이스 수를 결정하는 것은 알고리즘에 달려 있습니다.

이 세 가지 전략 중 첫 번째와 세 번째는 능동적 삭제 전략이고 두 번째는 수동적 삭제 전략입니다.

예약 삭제:

예약 삭제 전략은 가장 메모리 친화적입니다. 타이머를 사용하면 예약 삭제 전략을 통해 만료된 키가 최대한 빨리 삭제되고 만료된 키가 차지한 메모리를 해제할 수 있습니다. 열쇠.

반면 예약 삭제 전략의 단점은 CPU 시간에 가장 친숙하지 않다는 것입니다. 만료된 키가 많은 경우 만료된 키를 삭제하는 행위가 CPU 시간의 상당 부분을 차지할 수 있으며, 메모리가 부족하지 않은 경우 그러나 CPU 시간이 매우 부족한 경우 CPU 시간을 사용하여 현재 작업과 관련 없는 만료된 키를 삭제하면 의심할 여지 없이 서버의 응답 시간과 처리량에 영향을 미칩니다.

예를 들어, 서버가 처리하기를 기다리는 명령 요청이 많고 서버에 현재 메모리가 부족하지 않은 경우 서버는 만료된 키를 삭제하는 대신 CPU 시간을 사용하여 클라이언트의 명령 요청을 처리하는 데 우선 순위를 두어야 합니다.

또한 타이머를 생성하려면 Redis 서버의 시간 이벤트를 사용해야 하며 현재 시간 이벤트 구현 - 순서가 지정되지 않은 연결 목록, 이벤트를 찾는 시간 복잡도는 O(N) - 큰 시간을 효율적으로 처리할 수 없습니다. 이벤트.

따라서 현 단계에서는 서버가 예약된 삭제 전략을 구현하기 위해 많은 수의 타이머를 생성하는 것은 현실적이지 않습니다.

지연 삭제:

지연 삭제 전략은 CPU 시간에 가장 적합합니다. 프로그램은 키를 꺼낼 때만 키의 만료 여부를 확인하므로 만료된 키 삭제 작업이 키가 제거될 때만 수행됩니다. 이것이 불가능하고 삭제 대상이 현재 처리된 키로 제한되는 경우 수행됩니다. 이 전략은 관련 없는 만료된 키를 삭제하는 데 CPU 시간을 소비하지 않습니다.

지연 삭제 전략의 단점은 메모리에 가장 친숙하지 않다는 점입니다. 키가 만료되었고 키가 데이터베이스에 여전히 남아 있는 경우 만료된 키가 삭제되지 않는 한 키가 차지하는 메모리는 출시되지 않습니다.

지연 삭제 전략을 사용할 때 데이터베이스에 만료된 키가 많고 만료된 키에 액세스할 수 없는 경우(사용자가 FLUSHDB를 수동으로 실행하지 않는 한) 삭제되지 않을 수 있습니다. 메모리 누수로 간주될 수 있습니다. 쓸모 없는 쓰레기 데이터는 많은 메모리를 차지하지만 서버는 이를 자체적으로 해제하지 않습니다. 이는 실행 상태가 메모리에 크게 의존하는 Redis 서버의 경우에는 확실히 해당되지 않습니다. 좋은 소식.

예를 들어, 로그와 같은 일부 시간 관련 데이터의 경우 특정 시점이 지나면 해당 데이터에 대한 액세스가 크게 줄어들거나 더 이상 액세스할 수 없게 됩니다. 만료된 데이터가 대량으로 백로그되면 데이터베이스에 저장됩니다. , 사용자는 서버가 자동으로 삭제했다고 생각하지만 실제로는 이러한 키가 여전히 존재하고 키가 차지하는 메모리가 해제되지 않았으므로 결과는 매우 심각할 것입니다.

정기 삭제:

위의 예약 삭제와 지연 삭제에 대한 논의에서 볼 때 이 두 가지 삭제 방법은 단독으로 사용할 경우 명백한 결함이 있습니다. ​​

·예약 삭제는 CPU 시간을 너무 많이 차지하여 서버에 영향을 줍니다. 응답 시간 및 처리량.

·지연 삭제는 메모리를 너무 많이 낭비하고 메모리 누수 위험이 있습니다.

주기적 삭제 전략은 처음 두 가지 전략을 통합하고 절충한 것입니다.

·주기적 삭제 전략은 만료된 키를 가끔씩 삭제하고 기간과 빈도를 제한하여 삭제 작업의 영향을 줄입니다. 삭제 작업. CPU 시간의 영향.

·또한 만료된 키를 정기적으로 삭제함으로써 정기적인 삭제 전략은 만료된 키로 인한 메모리 낭비를 효과적으로 줄입니다.

정기 삭제 전략의 어려움은 삭제 작업의 기간과 빈도를 결정하는 것입니다.

·삭제 작업이 너무 자주 실행되거나 실행 시간이 너무 길면 정기 삭제 전략이 예약된 전략으로 전락됩니다. 만료된 키를 삭제하는 데 CPU가 너무 많은 시간을 소비하게 됩니다.

·삭제 작업이 너무 드물게 실행되거나 실행 시간이 너무 짧은 경우 일반 삭제 전략은 지연 삭제 전략과 동일하므로 메모리 낭비가 발생합니다.

만료된 키의 주기적 삭제 전략은 redis.c/activeExpireCycle 함수로 구현됩니다. Redis 서버가 redis.c/serverCron 함수를 주기적으로 실행할 때마다 activeExpireCycle 함수가 여러 번 호출됩니다. 지정된 시간에 서버의 각 데이터베이스를 한 번 탐색하고 데이터베이스의 만료 사전에서 일부 키의 만료 시간을 무작위로 확인한 후 만료된 키를 삭제합니다.

전체 프로세스는 다음과 같이 의사 코드로 설명할 수 있습니다.

#
默认每次检查的数据库数量
DEFAULT_DB_NUMBERS = 16
#
默认每个数据库检查的键数量
DEFAULT_KEY_NUMBERS = 20
#
全局变量,记录检查进度
current_db = 0
def activeExpireCycle():
    #
初始化要检查的数据库数量
    #
如果服务器的数据库数量比 DEFAULT_DB_NUMBERS
要小
    #
那么以服务器的数据库数量为准
    if server.dbnum < DEFAULT_DB_NUMBERS:
        db_numbers = server.dbnum
    else:
        db_numbers = DEFAULT_DB_NUMBERS
    #
遍历各个数据库
    for i in range(db_numbers):
        #
如果current_db
的值等于服务器的数据库数量
        #
这表示检查程序已经遍历了服务器的所有数据库一次
        #
将current_db
重置为0
,开始新的一轮遍历
        if current_db == server.dbnum:
            current_db = 0
        #
获取当前要处理的数据库
        redisDb = server.db[current_db]
        #
将数据库索引增1
,指向下一个要处理的数据库
        current_db += 1
        #
检查数据库键
        for j in range(DEFAULT_KEY_NUMBERS):
            #
如果数据库中没有一个键带有过期时间,那么跳过这个数据库
            if redisDb.expires.size() == 0: break
            #
随机获取一个带有过期时间的键
            key_with_ttl = redisDb.expires.get_random_key()
            #
检查键是否过期,如果过期就删除它
            if is_expired(key_with_ttl):
                delete_key(key_with_ttl)
            #
已达到时间上限,停止处理
            if reach_time_limit(): return

activeExpireCycle 함수의 작업 모드는 다음과 같이 요약할 수 있습니다.

·함수가 실행될 때마다 특정 수의 무작위 키가 확인 및 삭제를 위해 특정 수의 데이터베이스에 만료 키가 있습니다.

·전역 변수 current_db는 현재 activeExpireCycle 함수 검사의 진행 상황을 기록하고, 다음에 activeExpireCycle 함수가 호출되면 이전 진행 상황이 처리됩니다. 예를 들어, 10번 데이터베이스를 순회할 때 현재 activeExpireCycle 함수가 반환되면 다음에 activeExpireCycle 함수가 실행될 때 11번 데이터베이스부터 만료된 키를 검색하여 삭제합니다.

·activeExpireCycle 함수가 계속 실행되면서 서버의 모든 데이터베이스를 검사하게 됩니다. 이때 이 함수는 current_db 변수를 0으로 재설정한 후 새로운 검사 작업을 다시 시작합니다.

더 많은 Redis 관련 지식을 알고 싶으시면 Redis 사용법 튜토리얼 칼럼을 방문해 주세요!

위 내용은 Redis에는 예약 삭제 기능이 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.