Redis 삭제 전략의 세 가지 방법과 퇴거 알고리즘 사례 분석

PHPz
풀어 주다: 2023-06-02 13:43:34
앞으로
1543명이 탐색했습니다.

1. 서문

글을 시작하기 전에 질문 하나 하겠습니다. 명령을 사용할 때: expire key second给一个key设置过期时间,过期时间一到,这个key对应的过期数据정말 서버에서 즉시 삭제되나요? 정답은 바로 삭제되지 않는다는 것입니다. 이 답을 알고 나면 Redis에서 만료된 데이터가 어떻게 처리되는지 살펴보겠습니다.

2. Redis의 데이터 특성

Redis는 메모리 수준 데이터베이스입니다. 메모리에 있는 데이터는 TTL 명령을 통해 상태를 얻을 수 있습니다.

명령 결과StatusXX시간에 민감한 데이터-1영구적으로 유효한 데이터-2만료된 데이터 또는 삭제된 데이터 또는 정의되지 않은 데이터

3. 시간에 민감한 데이터 저장 구조

Redis 삭제 전략의 세 가지 방법과 퇴거 알고리즘 사례 분석

만료된 데이터를 설정하는 명령을 사용하면 데이터에 해당하는 주소가 만료 공간에 저장되며 저장되는 값은 만료됩니다. 시간.

4. 데이터 삭제 전략

데이터 삭제 전략 목표:메모리 사용량과 CPU 사용량 사이의 균형을 찾으세요. 둘 중 하나를 고려하지 않으면 전체 Redis 성능이 저하되거나 심지어 서버 다운타임 또는 메모리 오류 数据删除策略目标:在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或内存泄露

1、定时删除

  • 创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作

  • 优点:节约内存,到时就删除,快速释放掉不必要的内存占用

  • 缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量

Redis 삭제 전략의 세 가지 방법과 퇴거 알고리즘 사례 분석

2、惰性删除

  • 数据到达过期时间,不做处理。等下次访问该数据时,会调用expireIfNeeded()函数来判断该数据是否过期: 如果未过期,返回数据,发现已过期,删除,返回不存在

  • 优点:节约CPU性能,发现必须删除的时候才删除

  • 缺点:内存压力很大,出现长期占用内存的数据

Redis 삭제 전략의 세 가지 방법과 퇴거 알고리즘 사례 분석

3、定期删除

Redis 삭제 전략의 세 가지 방법과 퇴거 알고리즘 사례 분석

流程分析:

  • Redis服务器启动初始化时,读取配置server.hz的值,默认为10

  • 然后每秒钟执行10次serverCron()方法,该方法用来检测服务器

  • serverCron()方法又会调用databasesCron()方法,该方法是用来遍历数据库的,redis默认有16个数据库,从第一个数据库开始

  • databasesCron()方法又会调用activeExpireCycle()方法,该方法会对每一个expires[*]逐一进行检测,每次执行250ms/server.hz;对某个expires[*]检测时,随机挑选W个key检测

  • 如果检测到key超时,则删除key;如果一轮中删除的key的数量>W25%,循环该过程;如果一轮中删除的key的数量≤W25%,检查下一个expires[*],0-15循环。其中W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值

  • 如果activeExpireCycle()执行时间到期,下次从current_db继续向下执行

  • 参数current_db用于记录activeExpireCycle() 进入哪个expires[*] 执行

Redis 삭제 전략의 세 가지 방법과 퇴거 알고리즘 사례 분석

  • 总结:

    1. 예약 삭제

    • 키에 만료 시간이 설정되어 있는 경우. 시간에 도달하면 타이머 작업이 즉시 주요 삭제 작업을 수행합니다
    • 장점:메모리를 절약하고, 때가 되면 삭제하고, 불필요한 메모리 사용량을 빠르게 해제합니다

    단점: CPU 압력 현재 CPU 부하가 아무리 높아도 CPU를 점유하게 되어 Redis 서버 응답 시간과 명령 처리량에 영향을 미칩니다Redis 삭제 전략의 세 가지 방법 및 퇴거 알고리즘 예시 분석장점:CPU 성능을 절약하고 삭제가 필요한 경우에만 삭제하세요

    3. 정기 삭제

    Redis 서버가 시작하고 초기화하고 server.hz ​​구성의 ​​값을 읽습니다. 기본값은 10입니다. 그런 다음 serverCron() 메서드가 초당 10번 실행되어 서버를 감지하는 데 사용됩니다

    2. 지연 삭제

      데이터가 만료 시간에 도달하여 처리되지 않습니다. 다음에 데이터에 액세스하면 expireIfNeeded() 함수가 호출되어 데이터가 만료되었는지 여부를 확인합니다. 만료되지 않은 경우 데이터를 반환하고 만료된 데이터를 찾아 삭제한 다음 반환이 존재하지 않습니다
      단점:높은 메모리 부족, 데이터 메모리를 오래 차지하는 것이 나타납니다 Redis 삭제 세 가지 방법 퇴거 알고리즘 예시의 전략 및 분석
      프로세스 분석:
      🎜serverCron() 메서드는 databasesCron() 메서드를 호출합니다. 이 메서드는 데이터베이스를 탐색하는 데 사용됩니다. Redis에는 기본적으로 16개의 데이터베이스가 있습니다. 첫 번째 데이터베이스🎜🎜🎜🎜databasesCron() 메서드는 activeExpireCycle() 메서드를 호출합니다. 이 메서드는 각 expires[*]를 하나씩 감지합니다. , 특정 만료[* ] 동안 매번 250ms/server.hz를 실행합니다. 감지 중에 감지할 W 키를 무작위로 선택합니다🎜🎜🎜🎜키 시간 초과가 감지되면 키를 삭제합니다. 한 라운드에서 삭제된 키 수가 >25%이면 프로세스를 반복합니다. 한 라운드에서 삭제된 키 수가 만료[*], 0-15 주기를 확인합니다. . 그 중 W = ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 속성값🎜🎜🎜🎜activeExpireCycle()의 실행 시간이 만료되면 다음 번에는 current_db부터 실행이 계속됩니다🎜🎜🎜🎜current_db 매개변수는 만료되는 것을 기록하는 데 사용됩니다.[*] activeExpireCycle () 실행 들어갑니다🎜🎜 🎜🎜Redis 삭제 전략 세 가지 방법과 분석 퇴거 알고리즘 예 🎜
        🎜🎜요약: redis 라이브러리에서 시기적절한 데이터를 주기적으로 폴링하고 무작위 추출 전략을 채택하며 비율을 사용합니다. 삭제 빈도를 제어하기 위해 만료된 데이터 삭제 🎜🎜🎜🎜메모리 압력은 그다지 높지 않으며 오랫동안 메모리를 점유한 콜드 데이터는 지속적으로 정리됩니다 🎜🎜🎜🎜 5. 삭제 전략 비교 🎜🎜🎜🎜🎜정기 삭제🎜🎜메모리 절약, 점유 없음🎜🎜구분 없음 기간이 CPU 자원 점유, 빈도 높음🎜🎜시간을 공간으로 교환🎜🎜🎜🎜지연 삭제🎜🎜메모리 사용량이 심함🎜🎜실행 지연, CPU 사용률 높음🎜🎜공간을 시간으로 교환함 🎜🎜🎜🎜정기 삭제🎜🎜메모리 정기 무작위 정리🎜🎜메모리 유지를 위해 초당 고정 CPU 리소스를 소비🎜🎜무작위 및 집중 부분 검사🎜🎜🎜🎜

        6. Eviction 알고리즘

        1. 개념 소개

        redis에 새로운 데이터가 들어왔을 때 메모리가 부족하면 어떻게 해야 하나요? Redis는 메모리를 사용하여 데이터를 저장합니다. 각 명령을 실행하기 전에 freeMemoryIfNeeded()가 호출되어 메모리가 충분한지 확인합니다. 메모리가 새로 추가된 데이터에 대한 최소 저장 요구 사항을 충족하지 않는 경우 redis는 현재 명령에 대한 저장 공간을 정리하기 위해 일부 데이터를 일시적으로 삭제합니다. 데이터 정리 전략을 제거 알고리즘이라고 합니다. freeMemoryIfNeeded()检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法。

        注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。

        Redis 삭제 전략의 세 가지 방법과 퇴거 알고리즘 사례 분석

        2、八种配置

        检测易失数据(可能会过期的数据集server.db[i].expires

        volatile-lru 挑选最近最少使用的数据淘汰
        volatile-lfu 挑选最近使用次数最少的数据淘汰
        volatile-ttl 挑选将要过期的数据淘汰
        volatile-random 任意选择数据淘汰

        检测全库数据(所有数据集server.db[i].dict

        참고: 데이터 제거 프로세스는 사용 가능한 메모리 공간을 100% 제거할 수 없습니다. 실패할 경우 반복적으로 실행됩니다. 모든 데이터를 시도한 후에도 메모리 정리 요구 사항을 충족할 수 없으면 오류 메시지가 나타납니다. 휘발성 데이터 감지(만료될 수 있는 Data set server.db[i].expires)휘발성-lru최근에 사용된 데이터 제거 선택휘발성-lfu제거하려면 최근에 가장 적게 사용된 데이터를 선택하세요
        Redis 삭제 전략 3가지 방법과 제거 알고리즘 예시 분석 2. 8가지 구성

        휘발성-ttl

        곧 만료될 데이터를 선택하세요휘발성-random제거할 데이터 선택
        🎜 🎜 전체 데이터베이스 데이터 검색(모든 데이터 세트 server.db[i].dict)🎜🎜🎜🎜🎜allkeys-lru🎜🎜제거하려면 최근에 가장 적게 사용된 데이터를 선택하세요🎜🎜🎜🎜allkeys- lfu 🎜🎜퇴거를 위해 가장 최근에 사용된 데이터를 선택하세요🎜🎜🎜🎜allkeys-random🎜🎜퇴거를 위한 모든 데이터🎜🎜🎜🎜🎜🎜데이터 퇴거 포기: 🎜🎜🎜🎜🎜🎜no-enviction🎜 🎜 데이터 제거 금지( redis4 .0 기본 전략)🎜🎜🎜🎜

      위 내용은 Redis 삭제 전략의 세 가지 방법과 퇴거 알고리즘 사례 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

      관련 라벨:
      원천:yisu.com
      본 웹사이트의 성명
      본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
      인기 튜토리얼
      더>
      최신 다운로드
      더>
      웹 효과
      웹사이트 소스 코드
      웹사이트 자료
      프론트엔드 템플릿