1. 소개:
대부분의 NoSQL 데이터베이스와 마찬가지로 Redis도 키/값 데이터 저장 모델을 따릅니다. 경우에 따라 Redis는 데이터 쿼리 및 데이터 수정의 효율성을 높이기 위해 키/값을 메모리에 저장합니다. 그러나 이 접근 방식이 항상 좋은 선택은 아닙니다. 이를 고려하여 이를 더욱 최적화할 수 있습니다. 즉, Keys 데이터만 메모리에 유지하여 데이터 검색의 효율성을 보장할 수 있으며 Values 데이터는 거의 발생하지 않는 경우 디스크로 교체할 수 있습니다. 사용된.
실제 애플리케이션에서는 키 중 약 10%만이 상대적으로 일반적으로 사용되는 키이므로 Redis는 덜 일반적으로 사용되는 나머지 키와 값을 가상 저장소를 통해 디스크로 교체할 수 있으며, 일단 이러한 키가 교체되면 키가 또는 값을 읽어야 하는 경우 Redis는 해당 값을 다시 주 메모리로 읽습니다.
2. 애플리케이션 시나리오:
대부분의 데이터베이스에서 가장 이상적인 실행 방법은 모든 데이터를 메모리에 로드하는 것이며 후속 쿼리 작업은 전적으로 메모리를 기반으로 할 수 있습니다. 그러나 실제로는 이 시나리오가 일반적이지 않으며 대부분의 경우 데이터의 일부만 메모리에 로드될 수 있습니다.
Redis에는 매우 중요한 개념이 있습니다. 즉, 일반적으로 키는 교환되지 않습니다. 따라서 데이터베이스에 많은 수의 키가 있고 각 키가 작은 값에만 연결되어 있는 경우 이 시나리오는 다음과 같습니다. 가상 메모리를 사용하는 데 적합하지 않습니다. 반대로 데이터베이스에 소수의 키만 포함되어 있고 각 키와 관련된 값이 매우 큰 경우 이 시나리오는 가상 저장소를 사용하는 데 적합합니다.
실제 애플리케이션에서는 가상 메모리가 더 많은 역할을 수행하고 시스템의 운영 효율성을 향상시키는 데 도움을 주기 위해 여러 개의 작은 값이 포함된 키를 소수의 큰 값이 포함된 키로 병합할 수 있습니다. 가장 중요한 방법은 원래 키/값 모드를 해시 기반 모드로 변경하는 것입니다. 이렇게 하면 많은 원래 키가 해시의 속성이 될 수 있습니다.
3. 구성:
1) 현재 Redis 서버가 시작될 때 가상 메모리 기능을 활성화하려면 구성 파일에 다음 구성 항목을 추가합니다.
vm-enabled yes
2) 구성 파일에서 Redis에 사용할 수 있는 최대 가상 메모리 바이트 수를 설정합니다. 메모리의 데이터가 이 값보다 크면 일부 개체가 디스크로 스왑 아웃되고, 스왑 아웃된 개체가 차지한 메모리는 사용된 메모리가 이 값보다 작아질 때까지 중단되지 않습니다.
vm-max-memory (bytes)
Redis의 교환 규칙은 "가장 오래된" 데이터를 고려하는 것입니다. 즉, 가장 오랫동안 사용되지 않은 데이터는 교체됩니다. 두 개체의 기간이 동일한 경우 값이 더 큰 데이터가 먼저 교체됩니다. Redis는 키를 디스크로 교환하지 않으므로 키 데이터만으로 전체 가상 메모리를 채운 경우 이 데이터 모델은 가상 메모리 메커니즘을 사용하는 데 적합하지 않거나 값을 더 높게 설정해야 합니다. 전체 Keys 데이터를 수용할 수 있을 만큼 큽니다. 실제 애플리케이션에서 Redis 가상 메모리 사용을 고려한다면 빈번한 스왑 인/아웃을 피하기 위해 Redis에 최대한 많은 메모리를 할당해야 합니다.
3) 구성 파일에서 페이지 수와 각 페이지가 차지하는 바이트 수를 설정합니다. 메모리에서 디스크로 데이터를 전송하려면 스왑 파일을 사용해야 합니다. 이러한 파일은 데이터 지속성과 관련이 없으며 Redis는 종료하기 전에 해당 파일을 모두 삭제합니다. 스왑 파일에 대한 액세스는 대부분 랜덤 액세스이기 때문에 스왑 파일을 SSD에 저장하는 것이 좋습니다. 이는 시스템의 운영 효율성을 크게 향상시킬 수 있습니다
vm-pages 134217728 vm-page-size 32
위 구성에서 Redis는 파일을 vm-pages 페이지로 나누고 각 페이지가 차지하는 바이트는 vm-page-size이며 Redis에서 사용할 수 있는 최종 스왑 파일 크기는 vm-pages * vm-page-size입니다. 값은 하나 이상의 페이지에 저장할 수 있지만 한 페이지에 여러 값을 담을 수는 없기 때문에 vm-page-size 설정 시 Redis의 이러한 기능을 충분히 고려해야 합니다.
4) Redis 구성 파일에는 다음과 같은 매우 중요한 구성 매개변수가 있습니다.
vm-max-threads 4
CPU cores。如果将该值设置为0,那么Redis在与交换文件进行IO交互时,将以同步的方式执行此操作。
对于Redis而言,如果操作交换文件是以同步的方式进行,那么当某一客户端正在访问交换文件中的数据时,其它客户端如果再试图访问交换文件中的数据,该客户端的请求就将被挂起,直到之前的操作结束为止。特别是在相对较慢或较忙的磁盘上读取较大的数据值时,这种阻塞所带来的影响就更为突兀了。然而同步操作也并非一无是处,事实上,从全局执行效率视角来看,同步方式要好于异步方式,毕竟同步方式节省了线程切换、线程间同步,以及线程拉起等操作产生的额外开销。特别是当大部分频繁使用的数据都可以直接从主内存中读取时,同步方式的表现将更为优异。
如果你的现实应用恰恰相反,即有大量的换入换出操作,同时你的系统又有很多的cores,有鉴于此,你又不希望客户端在访问交换文件之前不得不阻塞一小段时间,如果确实是这样,我想异步方式可能更适合于你的系统。
至于最终选用哪种配置方式,最好的答案将来自于不断的实验和调优。
以上就是Redis教程(十一):虚拟内存介绍的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!