>데이터 베이스 >Redis >Redis 캐시의 8가지 제거 전략에 대한 간략한 분석

Redis 캐시의 8가지 제거 전략에 대한 간략한 분석

青灯夜游
青灯夜游앞으로
2021-11-08 10:04:539696검색

이 글에서는 Redis 캐시의 8가지 제거 전략에 대해 설명하고 이를 사용하는 방법을 알아보겠습니다. 모든 사람에게 도움이 되기를 바랍니다.

Redis 캐시의 8가지 제거 전략에 대한 간략한 분석

Redis 캐시는 데이터를 저장하기 위해 메모리를 사용한다는 것을 알고 있지만, 결국 캐시할 데이터의 양이 많아질수록 메모리 크기는 제한됩니다. 필연적으로 Full로 작성됩니다. 이때, 데이터를 삭제하기 위해서는 캐시 제거 전략이 필요합니다. [관련 권장사항: Redis缓存使用内存来保存数据,但内存大小毕竟有限,随着要缓存的数据量越来越大,有限的缓存空间不可避免地会被写满。这时候就需要缓存的淘汰策略去删除数据。【相关推荐:Redis视频教程

Redis缓存的淘汰策略

Redis的淘汰策略,根据是否会进行数据淘汰可以把它们分成两类:

  • 不进行数据淘汰的策略,只有 noeviction 这一种。
  • 会进行淘汰的 7 种其他策略。

会进行淘汰的 7 种策略,我们可以再进一步根据淘汰候选数据集的范围把它们分成两类:

  • 在设置了过期时间的数据中进行淘汰,包括 volatile-random、volatile-ttl、volatile-lru、volatile-lfu(Redis 4.0 后新增)四种。

  • 在所有数据范围内进行淘汰,包括 allkeys-lru、allkeys-random、allkeys-lfu(Redis 4.0 后新增)三种。

Redis 캐시의 8가지 제거 전략에 대한 간략한 분석

在redis3.0之前,默认是volatile-lru;在redis3.0之后(包括3.0),默认淘汰策略则是noeviction

noeviction 策略

noeviction表示不淘汰数据,当缓存数据满了,有新的写请求进来,Redis不再提供服务,而是直接返回错误。

根据过期时间的淘汰策略

volatile-random、volatile-ttl、volatile-lru、volatile-lfu 四种策略是针对已经设置了过期时间的键值对。到键值对的到期时间到了或者Redis内存使用量达到了maxmemory阈值,Redis会根据这些策略对键值对进行淘汰;

  • volatile-ttl 在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。
  • volatile-random 就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。
  • volatile-lru 会使用 LRU 算法筛选设置了过期时间的键值对。
  • volatile-lfu 会使用 LFU 算法选择设置了过期时间的键值对。

所有数据范围内的淘汰策略

allkeys-lru、allkeys-random、allkeys-lfu 这三种策略淘汰的数据范围扩大到所有的键值对,无论这些键值对是否设置了过期时间,筛选数据进行淘汰的规则是:

  • allkeys-random 策略,从所有键值对中随机选择并删除数据;

  • allkeys-lru 策略,使用 LRU 算法在所有数据中进行筛选。

  • allkeys-lfu 策略,使用 LFU 算法在所有数据中进行筛选。

关于LRU算法

LRU算法即是最近最常使用算法,由于LRU会使用一个链表去维护使用的数据列表,当使用的数据越多,其移动元素时就会越耗时,这不可避免地会影响到Redis主线程。为此Redis对lru算法做了些简化。

LRU 策略的核心思想:如果一个数据刚刚被访问,那么这个数据肯定是热数据,还会被再次访问。

按照这个核心思想,Redis 中的 LRU 策略,会在每个数据对应的 RedisObject 结构体中设置一个 lru 字段,用来记录数据的访问时间戳。在进行数据淘汰时,LRU 策略会在候选数据集中淘汰掉 lru 字段值最小的数据(也就是访问时间最久的数据)。

所以,在数据被频繁访问的业务场景中,LRU 策略的确能有效留存访问时间最近的数据。而且,因为留存的这些数据还会被再次访问,所以又可以提升业务应用的访问速度。

具体做法是,在访问键值对时,redis会记录最近一次访问的时间戳。在redis决定淘汰数据时,会随机挑选N个数据,把它们作为一个候选集合,把最小的时间戳给筛选出去。当下一次要淘汰数据时,会挑选比第一次挑选的候选集合时间戳值要小的数据进入新的候选集合。当数据达到maxmemory-samples 时,将最小的值给淘汰掉。

通过该命令可以设置挑选的候选集合数CONFIG SET maxmemory-samples NRedis 동영상 튜토리얼

]

Redis 캐시 제거 전략

Redis 제거 전략은 두 가지 범주로 나눌 수 있습니다:

  • 데이터를 제거하지 않는 유일한 전략은 퇴거 거부입니다.
  • 제거로 이어지는 7가지 다른 전략.
제거 전략은 7가지가 있습니다. 제거 후보 데이터 세트의 범위에 따라 두 가지 범주로 더 나눌 수 있습니다. 🎜
  • 🎜만료 시간이 설정된 데이터에서 제거합니다. 휘발성-random, 휘발성-ttl, 휘발성-lru, 휘발성-lfu(Redis 4.0 이후 새로운 유형)를 포함한 네 가지 유형입니다. 🎜
  • 🎜allkeys-lru, allkeys-random, allkeys-lfu(Redis 4.0 이후 새로운 기능)를 포함한 모든 데이터 범위를 제거합니다. 🎜
🎜1 .png🎜🎜redis3.0 이전에는 기본값이 휘발성-lru였고, redis3.0(3.0 포함) 이후에는 기본 제거 전략이 noeviction🎜이었습니다. h3 data-id="heading-1">🎜noeviction strategy🎜🎜🎜noeviction은 데이터를 제거하지 않는다는 의미입니다. 캐시 데이터가 가득 차고 새로운 쓰기 요청이 들어오면 Redis는 더 이상 서비스를 제공하지 않고 직접 오류를 반환합니다. . 🎜

🎜만료 시간에 따른 제거 전략🎜🎜🎜휘발성-random, 휘발성-ttl, 휘발성-lru, 휘발성-lfu 네 가지 전략은 만료 시간 설정 값 쌍이 있는 키에 대한 것입니다. . 키-값 쌍의 만료 시간에 도달하거나 Redis 메모리 사용량이 maxmemory 임계값에 도달하면 Redis는 이러한 전략에 따라 키-값 쌍을 제거합니다. 🎜
  • 휘발성; -ttl은 필터링입니다. 키-값 쌍에 만료 시간이 설정된 경우 만료 시간이 빠른 순서에 따라 삭제됩니다.
  • 휘발성-랜덤은 이름과 마찬가지로 만료 시간이 설정된 키-값 쌍을 무작위로 삭제합니다.
  • 휘발성-lru는 LRU 알고리즘을 사용하여 만료 시간이 설정된 키-값 쌍을 필터링합니다.
  • 휘발성-lfu는 LFU 알고리즘을 사용하여 만료 시간이 설정된 키-값 쌍을 선택합니다.

🎜모든 데이터 범위의 제거 전략🎜🎜🎜allkeys-lru, allkeys-random, allkeys-lfu로 제거된 데이터 범위. -값 쌍, 이러한 키-값 쌍에 만료 시간이 설정되어 있는지 여부에 관계없이 제거를 위해 데이터를 필터링하는 규칙은 다음과 같습니다. 🎜
  • 🎜allkeys-random 전략, 모든 키-값 쌍에서 무작위로 선택 및 삭제 데이터; 🎜
  • 🎜allkeys-lru 전략, LRU 알고리즘을 사용하여 모든 데이터 필터링. 🎜
  • 🎜allkeys-lfu 전략은 LFU 알고리즘을 사용하여 모든 데이터를 필터링합니다. 🎜

🎜LRU 알고리즘에 대하여🎜🎜🎜LRU 알고리즘은 최근 가장 많이 사용되는 알고리즘입니다. LRU는 연결된 목록을 사용하여 사용된 정보를 유지하기 때문입니다. 데이터 목록의 경우, 더 많은 데이터가 사용되면 요소를 이동하는 데 더 많은 시간이 소요되며 이는 필연적으로 Redis 메인 스레드에 영향을 미칩니다. 이러한 이유로 Redis는 lru 알고리즘을 일부 단순화했습니다. 🎜🎜LRU 전략의 핵심 아이디어: 데이터 일부에 방금 액세스한 경우 해당 데이터는 핫 데이터여야 하며 다시 액세스됩니다. 🎜🎜이 핵심 아이디어에 따르면 Redis의 LRU 전략은 각 데이터에 해당하는 RedisObject 구조에 lru 필드를 설정하여 데이터의 액세스 타임스탬프를 기록합니다. LRU 전략은 데이터 제거를 수행할 때 후보 데이터 세트에서 lru 필드 값이 가장 작은 데이터(즉, 액세스 시간이 가장 긴 데이터)를 제거합니다. 🎜🎜따라서 데이터에 자주 액세스하는 비즈니스 시나리오에서 LRU 전략은 실제로 최신 액세스 시간으로 데이터를 효과적으로 유지할 수 있습니다. 또한 보관된 데이터에 다시 액세스하게 되므로 비즈니스 애플리케이션의 액세스 속도를 향상시킬 수 있습니다. 🎜🎜구체적인 방법은 키-값 쌍에 액세스할 때 Redis가 가장 최근 액세스의 타임스탬프를 기록한다는 것입니다. Redis가 데이터를 제거하기로 결정하면 N개의 데이터를 무작위로 선택하여 후보 세트로 사용하고 가장 작은 타임스탬프를 필터링합니다. 다음 번에 데이터가 제거되면 처음 선택한 후보 세트보다 타임스탬프 값이 작은 데이터가 선택되어 새로운 후보 세트에 입력됩니다. 데이터가 maxmemory-samples에 도달하면 가장 작은 값이 제거됩니다. 🎜🎜이 명령 CONFIG SET maxmemory-samples N을 통해 선택한 후보 세트의 수를 설정할 수 있습니다.🎜🎜🎜사용 제안🎜🎜🎜전략의 특성에 따라 제거할 다양한 전략을 선택할 수 있습니다. 다양한 시나리오에 대한 데이터. 🎜
  • 캐시된 데이터가 확실히 핫하거나 콜드되지 않은 경우, 즉 데이터의 액세스 빈도가 크게 다르지 않은 경우 allkeys-random 무작위 전략을 사용하여 데이터를 제거하는 것이 좋습니다. allkeys-random 随机策略淘汰数据;
  • 当数据有明显的冷热之分,建议使用allkeys-lru 或者volatile-lru 算法,将最近最常访问的数据留在缓存数据中;
  • 当业务中存在置顶需求,即不会过期的数据,这类一般不会设置过期时间,可以采用volatile-lru
  • 데이터가 확실히 핫하거나 콜드인 경우 allkeys-lru 또는 휘발성-lru 알고리즘을 사용하여 가장 최근에 액세스한 데이터를 캐시 데이터에 보관하는 것이 좋습니다.

비즈니스를 최우선으로 해야 하는 경우, 즉 만료되는 데이터의 경우 이러한 유형의 데이터에는 일반적으로 만료 시간이 설정되어 있지 않으며 휘발성-lru 전략을 사용할 수 있습니다. 사용됩니다. 이러한 방식으로 이러한 유형의 데이터는 제거되지 않지만 LRU 규칙에 따라 다른 데이터는 제거될 수 있습니다.

더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 소개🎜를 방문하세요! ! 🎜

위 내용은 Redis 캐시의 8가지 제거 전략에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제