글을 시작하기 전에 질문 하나 하겠습니다. 명령을 사용할 때: expire key second
给一个key设置过期时间,过期时间一到,这个key对应的过期数据
정말 서버에서 즉시 삭제되나요? 정답은 바로 삭제되지 않는다는 것입니다. 이 답을 알고 나면 Redis에서 만료된 데이터가 어떻게 처리되는지 살펴보겠습니다.
Redis는 메모리 수준 데이터베이스입니다. 메모리에 있는 데이터는 TTL 명령을 통해 상태를 얻을 수 있습니다.
Status | |||
---|---|---|---|
시간에 민감한 데이터 | |||
영구적으로 유효한 데이터 | |||
만료된 데이터 또는 삭제된 데이터 또는 정의되지 않은 데이터 |
2. 지연 삭제 |
데이터가 만료 시간에 도달하여 처리되지 않습니다. 다음에 데이터에 액세스하면 expireIfNeeded() 함수가 호출되어 데이터가 만료되었는지 여부를 확인합니다. 만료되지 않은 경우 데이터를 반환하고 만료된 데이터를 찾아 삭제한 다음 반환이 존재하지 않습니다 |
||
---|---|---|---|
단점:높은 메모리 부족, 데이터 메모리를 오래 차지하는 것이 나타납니다 | |||
프로세스 분석: | Redis 서버가 시작하고 초기화하고 server.hz 구성의 값을 읽습니다. 기본값은 10입니다. | 그런 다음 |
serverCron()
메서드는 databasesCron()
메서드를 호출합니다. 이 메서드는 데이터베이스를 탐색하는 데 사용됩니다. Redis에는 기본적으로 16개의 데이터베이스가 있습니다. 첫 번째 데이터베이스🎜🎜🎜🎜databasesCron()
메서드는 activeExpireCycle() 메서드를 호출합니다. 이 메서드는 각 expires[*]
를 하나씩 감지합니다. , 특정 만료[* ]
동안 매번 250ms/server.hz를 실행합니다. 감지 중에 감지할 W 키를 무작위로 선택합니다🎜🎜🎜🎜키 시간 초과가 감지되면 키를 삭제합니다. 한 라운드에서 삭제된 키 수가 >25%이면 프로세스를 반복합니다. 한 라운드에서 삭제된 키 수가 요약:
redis 라이브러리에서 시기적절한 데이터를 주기적으로 폴링하고 무작위 추출 전략을 채택하며 비율을 사용합니다. 삭제 빈도를 제어하기 위해 만료된 데이터 삭제 🎜🎜🎜🎜메모리 압력은 그다지 높지 않으며 오랫동안 메모리를 점유한 콜드 데이터는 지속적으로 정리됩니다 🎜🎜🎜🎜 5. 삭제 전략 비교 🎜🎜🎜🎜🎜정기 삭제🎜🎜메모리 절약, 점유 없음🎜🎜구분 없음 기간이 CPU 자원 점유, 빈도 높음🎜🎜시간을 공간으로 교환🎜🎜🎜🎜지연 삭제🎜🎜메모리 사용량이 심함🎜🎜실행 지연, CPU 사용률 높음🎜🎜공간을 시간으로 교환함 🎜🎜🎜🎜정기 삭제🎜🎜메모리 정기 무작위 정리🎜🎜메모리 유지를 위해 초당 고정 CPU 리소스를 소비🎜🎜무작위 및 집중 부분 검사🎜🎜🎜🎜redis에 새로운 데이터가 들어왔을 때 메모리가 부족하면 어떻게 해야 하나요? Redis는 메모리를 사용하여 데이터를 저장합니다. 각 명령을 실행하기 전에 freeMemoryIfNeeded()
가 호출되어 메모리가 충분한지 확인합니다. 메모리가 새로 추가된 데이터에 대한 최소 저장 요구 사항을 충족하지 않는 경우 redis는 현재 명령에 대한 저장 공간을 정리하기 위해 일부 데이터를 일시적으로 삭제합니다. 데이터 정리 전략을 제거 알고리즘이라고 합니다. freeMemoryIfNeeded()
检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法。
注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。
检测易失数据(可能会过期的数据集server.db[i].expires
)
volatile-lru | 挑选最近最少使用的数据淘汰 |
---|---|
volatile-lfu | 挑选最近使用次数最少的数据淘汰 |
volatile-ttl | 挑选将要过期的数据淘汰 |
volatile-random | 任意选择数据淘汰 |
检测全库数据(所有数据集server.db[i].dict
2. 8가지 구성 | |
---|---|
휘발성-lru | |
휘발성-lfu |
휘발성-ttl
휘발성-random | 제거할 데이터 선택 |
---|
모든 데이터 세트 server.db[i].dict
)🎜🎜🎜🎜🎜allkeys-lru🎜🎜제거하려면 최근에 가장 적게 사용된 데이터를 선택하세요🎜🎜🎜🎜allkeys- lfu 🎜🎜퇴거를 위해 가장 최근에 사용된 데이터를 선택하세요🎜🎜🎜🎜allkeys-random🎜🎜퇴거를 위한 모든 데이터🎜🎜🎜🎜🎜🎜데이터 퇴거 포기: 🎜🎜🎜🎜🎜🎜no-enviction🎜 🎜 데이터 제거 금지( redis4 .0 기본 전략)🎜🎜🎜🎜위 내용은 Redis 삭제 전략의 세 가지 방법과 퇴거 알고리즘 사례 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!