>데이터 베이스 >Redis >Redis 캐시 제거 전략에 대해 이야기해 보겠습니다.

Redis 캐시 제거 전략에 대해 이야기해 보겠습니다.

青灯夜游
青灯夜游앞으로
2021-10-27 10:24:211782검색

Redis 캐시 제거 전략은 무엇인가요? 이 글에서는 Redis 캐시 제거 전략에 대해 이야기하고 캐시 전략 설정 제안을 소개하겠습니다. 도움이 되길 바랍니다.

Redis 캐시 제거 전략에 대해 이야기해 보겠습니다.

원격 사전 서비스인 Redis(Remote Dictionary Server)는 ANSI C 언어로 작성된 오픈소스 로그형 Key-Value 데이터베이스로, 네트워크를 지원하고, 메모리 기반으로 지속성이 가능하며, 다양한 Language API를 제공합니다. [관련 추천 : Redis 영상 튜토리얼]

다음과 같은 특징을 가지고 있습니다.

  • 메모리 연산 및 고성능 기반
  • 배포 지원, 이론적으로 무한 확장 가능
  • 키-값 저장 구조, 쿼리 효율성
  • 다양한 개발 언어 API를 제공하며 기존 비즈니스 시스템과 쉽게 통합됩니다.

일반적으로 분산 캐시, 중앙 집중식 세션 저장, 분산 잠금 및 기타 애플리케이션 시나리오를 위해 비즈니스 시스템에 사용됩니다.

로컬 캐시든 분산 캐시든 더 높은 성능을 보장하기 위해 메모리를 사용하여 데이터를 저장합니다. 비용 및 메모리 제한으로 인해 저장된 데이터가 캐시 용량을 초과하면 캐시된 데이터를 제거해야 합니다. . 일반적인 제거 전략에는 가장 오래된 데이터를 제거하는 FIFO, 최근에 가장 적게 사용된 데이터를 제거하는 LRU, 최근에 가장 적게 사용된 데이터를 제거하는 LFU가 포함됩니다.

Redis 캐시 제거 정책 트리거

프로덕션 환경에서는 Redis의 스왑 동작을 허용하지 않습니다. 따라서 최대 메모리 사용량은 일반적으로 제한됩니다. Redis는 최대 메모리 사용량을 지정하는 구성 매개변수 maxmemory를 제공합니다.

적법한 구성은 다음과 같습니다.

maxmemory 1000KB 
maxmemory 100MB 
maxmemory 1GB 
maxmemory 0  # 表示不做限制,一般不会用

redis.conf 구성 파일은 다음과 같습니다.

Redis 캐시 제거 전략에 대해 이야기해 보겠습니다.

8 Redis 캐시 전략

  • 휘발성-lru는 시간 초과가 있는 데이터 중에서 가장 일반적으로 사용되지 않는 데이터를 삭제합니다. set

  • allkeys-lru는 삭제를 위해 모든 키 중에서 가장 적게 사용되는 데이터를 쿼리합니다. 이는 가장 널리 사용되는 전략입니다.

  • 휘발성-random은 시간 초과가 설정된 데이터를 무작위로 삭제합니다. 모든 키를 무작위로 삭제합니다.
  • 휘발성-ttl은 설정된 시간 초과로 모든 데이터를 쿼리하고, 추적 후 즉시 정렬하고, 만료 예정인 데이터를 삭제합니다.
  • noeviction(기본값) 이 속성으로 설정된 경우 삭제되지 않습니다. 작업이 수행되고 메모리가 오버플로되면 오류가 반환됩니다.
  • 휘발성-lfu는 만료 시간으로 구성된 모든 키에서 가장 자주 사용되지 않는 키를 제거합니다.
  • allkeys-lfu는 가장 자주 사용되지 않는 키를 모두 제거합니다. 키;
Redis의 LRU 및 LFU 알고리즘

LRU 알고리즘 Redis LRU 알고리즘은 정확한 구현이 아닙니다. 이는 Redis가

최고의

퇴거 후보, 즉 과거에 가장 많은 방문을 기록한 후보를 선택할 수 없음을 의미합니다. 대신, 소수의 키를 샘플링한 다음 샘플링된 키 중 가장 좋은 키(가장 빠른 액세스 시간 포함)를 제거하여 LRU 알고리즘의 근사치를 실행하려고 시도합니다. 그러나 Redis 3.0부터 알고리즘이 개선되어 퇴거에 적합한 후보를 선택할 수도 있습니다. 이는 알고리즘의 성능을 향상시켜 실제 LRU 알고리즘의 동작과 더욱 유사하게 만듭니다.

Redis LRU 알고리즘에서 중요한 점은 각 제거를 확인하기 위해 샘플 수를 변경하여 알고리즘의

정확도를

조정할 수 있다는 것입니다

. 이 매개변수는 다음 구성 지시문에 의해 제어됩니다.

maxmemory-samples 5
Redis가 실제 LRU 구현을 사용하지 않는 이유는 더 많은 메모리가 필요하기 때문입니다. 그러나 Redis를 사용하는 애플리케이션의 경우 근사치는 실제로 동일합니다. 다음은 Redis에서 사용하는 LRU 근사치와 실제 LRU의 비교 차트입니다.

위 그래프를 생성한 테스트에서는 지정된 수의 키로 Redis 서버를 채웠습니다. 키는 처음부터 마지막까지 액세스되므로 첫 번째 키가 LRU 알고리즘을 사용하여 제거하기에 가장 적합한 후보입니다. 나중에 기존 키의 절반을 강제로 제거하기 위해 추가로 50%의 키가 추가되었습니다.

Redis 캐시 제거 전략에 대해 이야기해 보겠습니다.사진에서 세 가지 종류의 포인트가 세 가지 다른 밴드를 형성하는 것을 볼 수 있습니다.

연한 회색 띠가 퇴거된 개체입니다.

회색 띠는 아직 퇴거되지 않은 물건입니다.
  • 녹색 띠가 추가된 개체입니다.
    이론적인 LRU 구현에서는 이전 키에서 전반부가 만료될 것으로 예상합니다. Redis LRU 알고리즘은
  • 확률
  • 으로 오래된 키만 만료합니다.

LRU는 미래에 특정 키에 액세스할 가능성을 예측하는 모델일 뿐입니다. 또한 데이터 액세스 패턴이 거듭제곱 법칙과 매우 유사한 경우 대부분의 액세스는 LRU 근사 알고리즘이 잘 처리할 수 있는 키 세트에 포함됩니다.

단점: 일정 기간 내에 대량의 콜드 데이터에 접근하여 대량의 핫 데이터가 생성될 수 있음

LFU 算法

从 Redis 4.0 开始,可以使用新的最不常用驱逐模式。这种模式在某些情况下可能会更好(提供更好的命中率/未命中率),因为使用 LFU Redis 会尝试跟踪项目的访问频率,因此很少使用的项目会被驱逐,而经常使用的项目有更高的机会留在记忆中。

如果您认为在 LRU,最近访问过但实际上几乎从未被请求过的项目不会过期,因此风险是驱逐将来有更高机会被请求的密钥。LFU 没有这个问题,一般应该更好地适应不同的访问模式。

配置LFU模式,可以使用以下策略:

  • volatile-lfu 在具有过期集的键中使用近似 LFU 驱逐。
  • allkeys-lfu 使用近似 LFU 驱逐任何密钥。

LFU 类似于 LRU:它使用一个概率计数器,称为莫里斯计数器,以便仅使用每个对象的几位来估计对象访问频率,并结合衰减周期,以便计数器随着时间的推移而减少:在某些时候,我们不再希望将密钥视为经常访问的密钥,即使它们过去是这样,以便算法可以适应访问模式的转变。

这些信息的采样与 LRU 发生的情况类似(如本文档的前一部分所述),以便选择驱逐的候选人。

然而,与 LRU 不同的是,LFU 具有某些可调参数:例如,如果不再访问频繁项,它的排名应该以多快的速度降低?还可以调整 Morris 计数器范围,以便更好地使算法适应特定用例。

默认情况下,Redis 4.0 配置为:

  • 在大约一百万个请求时使计数器饱和。
  • 每一分钟衰减一次计数器。

这些应该是合理的值并经过实验测试,但用户可能希望使用这些配置设置以选择最佳值。

有关如何调整这些参数的说明可以redis.conf在源代码分发的示例文件中找到,但简单地说,它们是:

lfu-log-factor 10 
lfu-decay-time 1

衰减时间是显而易见的,它是计数器应该衰减的分钟数,当采样并发现它比该值更旧时。一个特殊值0意味着:每次扫描时总是衰减计数器,很少有用。

计数器对数因子会改变需要多少次命中才能使频率计数器饱和,这恰好在 0-255 的范围内。系数越高,需要越多的访问以达到最大值。根据下表,系数越低,低访问计数器的分辨率越好:

+--------+------------+------------+------------+------------+------------+
| factor | 100 hits   | 1000 hits  | 100K hits  | 1M hits    | 10M hits   |
+--------+------------+------------+------------+------------+------------+
| 0      | 104        | 255        | 255        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 1      | 18         | 49         | 255        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 10     | 10         | 18         | 142        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 100    | 8          | 11         | 49         | 143        | 255        |
+--------+------------+------------+------------+------------+------------+

淘汰最近一段时间被访问次数最少的数据,以次数作为参考。

缺点:

1. 最近加入的数据常常容易被剔除,因为其起始方法次数比较少,

2. 如果频率时间度量为 1 个小时,则平均一天每个小时内访问频率 1000 的热点数据可能会被 2个小时的一段时间访问的频率为 1001 的数据剔除掉。可能会出现一些临界值的数据。

缓存策略设置建议

建议:了解Redis 的淘汰策略之后,在平时使用尽量主动设置/更新 key 的 expire 时间主动剔除不活跃的旧数据, 有助于提升查询性能

更多编程相关知识,请访问:编程入门!!

위 내용은 Redis 캐시 제거 전략에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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