찾다
데이터 베이스RedisRedis 캐시 공간을 최적화하는 방법

Scene 설정

1. POJO를 캐시에 저장해야 합니다. 클래스는 다음과 같이 정의됩니다.

public class TestPOJO implements Serializable {
    private String testStatus;
    private String userPin;
    private String investor;
    private Date testQueryTime;
    private Date createTime;
    private String bizInfo;
    private Date otherTime;
    private BigDecimal userAmount;
    private BigDecimal userRate;
    private BigDecimal applyAmount;
    private String type;
    private String checkTime;
    private String preTestStatus;
    
    public Object[] toValueArray(){
        Object[] array = {testStatus, userPin, investor, testQueryTime,
                createTime, bizInfo, otherTime, userAmount,
                userRate, applyAmount, type, checkTime, preTestStatus};
        return array;
    }
    
    public CreditRecord fromValueArray(Object[] valueArray){         
        //具体的数据类型会丢失,需要做处理
    }
}

2. 다음 예제를 테스트 데이터로 사용하세요

TestPOJO pojo = new TestPOJO();
pojo.setApplyAmount(new BigDecimal("200.11"));
pojo.setBizInfo("XX");
pojo.setUserAmount(new BigDecimal("1000.00"));
pojo.setTestStatus("SUCCESS");
pojo.setCheckTime("2023-02-02");
pojo.setInvestor("ABCD");
pojo.setUserRate(new BigDecimal("0.002"));
pojo.setTestQueryTime(new Date());
pojo.setOtherTime(new Date());
pojo.setPreTestStatus("PROCESSING");
pojo.setUserPin("ABCDEFGHIJ");
pojo.setType("Y");

JSON을 사용하여 직렬화합니다. direct , print length=284

**, **이 방법은 가장 간단한 방법이며 가장 일반적으로 사용되는 방법입니다. 구체적인 데이터는 다음과 같습니다:

{"applyAmount":200.11,"bizInfo":"XX", "checkTime":"2023-02-02","투자자":"ABCD","otherTime":"2023-04-10 17:45:17.717","preCheckStatus":"PROCESSING","testQueryTime":" 2023- 04-10 17:45:17.717","testStatus":"SUCCESS","type":"Y","userAmount":1000.00,"userPin":"ABCDEFGHIJ","userRate":0.002}

우리는 위의 내용에 쓸모없는 데이터가 많이 포함되어 있으며 속성 이름을 저장할 필요가 없다는 것을 발견했습니다.

개선 1 - 속성 이름 제거

System.out.println(JSON.toJSONString(pojo).length());
객체 구조 대신 배열 구조를 선택하여 속성 이름을 제거하고, length=144

를 인쇄하면 데이터 크기가 50% 줄어듭니다. 다음과 같습니다:

["SUCCESS ","ABCDEFGHIJ","ABCD","2023-04-10 17:45:17.717",null,"XX","2023-04-10 17:45:17.717", 1000.00,0.002,200.11,"Y","2023-02-02","PROCESSING"]

시간 형식이 문자열로 직렬화되어 데이터가 발생하는 것을 발견했습니다. 확장되므로 더 나은 직렬화 도구를 사용해야 합니다.

개선 2 - 더 나은 직렬화 도구 사용

System.out.println(JSON.toJSONString(pojo.toValueArray()).length());
필드 압축 및 합리적인 데이터 형식을 달성하기 위해 더 나은 직렬화 도구를 선택하고, 인쇄 **길이=92, **공간이 이전 단계에 비해 40% 감소합니다.

이것은 Redis가 바이너리로 작동되어야 하는 바이너리 데이터 조각입니다. 바이너리를 문자열로 변환한 후 다음과 같이 인쇄합니다:

��SUCCESS�ABCDEFGHIJ�ABCD� �j�6���XX� �j� 6�� ��?`bM����@i � �Q�Y�2023-02-02�PROCESSING

이 아이디어에 따라 더 깊이 파고들어 데이터 유형을 수동으로 선택할 수 있다는 사실을 발견했습니다. 보다 극단적인 최적화 효과를 달성하고 더 작은 데이터 유형을 사용하도록 선택하면 추가 개선이 달성됩니다.

개선 3 - 최적화된 데이터 유형

위의 사용 사례에서 testStatus, preCheckStatus 및Investor의 세 필드는 실제로 열거된 문자열 유형입니다(예: byte 또는 int 등). 문자열을 교체하면 공간을 더욱 절약할 수 있습니다. 문자열 대신 Long 유형을 사용하여 checkTime을 나타낼 수 있으므로 직렬화 도구가 더 적은 바이트를 출력합니다.
//我们仍然选取JSON格式,但使用了第三方序列化工具
System.out.println(new ObjectMapper(new MessagePackFactory()).writeValueAsBytes(pojo.toValueArray()).length);

수동 조정 후 String 형식 대신 더 작은 데이터 형식을 사용하여 인쇄

length=69

개선 4-ZIP 압축 고려

위 사항 외에도 The ZIP 사용을 고려할 수 있습니다. 압축 방법은 더 작은 크기를 얻습니다. 콘텐츠가 크거나 반복적인 경우 ZIP 압축의 효과가 분명합니다. 저장된 콘텐츠가 TestPOJO의 배열인 경우 ZIP 압축이 적합할 수 있습니다.

30바이트보다 작은 파일의 경우 ZIP 압축을 사용하면 파일 크기가 늘어날 수 있지만 반드시 파일 크기가 줄어들지는 않습니다. 덜 반복적인 콘텐츠의 경우에는 큰 개선 효과를 얻을 수 없습니다. 그리고 CPU 오버헤드도 있습니다.

위의 최적화 후에는 ZIP 압축이 더 이상 필수 옵션이 아닙니다. ZIP 압축 효과를 확인하려면 실제 데이터를 기반으로 한 테스트가 필요합니다.

최종 구현됨

위의 개선 단계는 최적화 아이디어를 반영하지만 역직렬화 과정에서 유형 손실이 발생하여 처리하기가 더 번거롭기 때문에 역직렬화 문제도 고려해야 합니다.

캐시 객체가 미리 정의되면 각 필드를 수동으로 완전히 처리할 수 있으므로 실제 전투에서는 위의 목적을 달성하고 정교한 제어를 달성하며 최고의 압축 효과와 최소 성능 오버헤드를 달성하기 위해 수동 직렬화를 사용하는 것이 좋습니다.

다음 msgpack 구현 코드를 참조할 수 있습니다. 다음은 테스트 코드입니다. 더 나은 Packer 및 UnPacker 도구를 직접 패키징하세요.

public Object[] toValueArray(){
    Object[] array = {toInt(testStatus), userPin, toInt(investor), testQueryTime,
    createTime, bizInfo, otherTime, userAmount,
    userRate, applyAmount, type, toLong(checkTime), toInt(preTestStatus)};
    return array;
}
<dependency>    
    <groupId>org.msgpack</groupId>    
    <artifactId>msgpack-core</artifactId>    
    <version>0.9.3</version>
</dependency>

Scenario 확장

우리가 2억 명의 사용자에 대한 데이터를 저장한다고 가정합니다. user contain 40개의 필드가 있고, 필드 키의 길이는 6바이트이며, 필드를 별도로 관리합니다.

일반적으로 해시 구조를 생각하게 되는데, 해시 구조에는 추가 리소스를 차지하게 되는 키 정보가 저장됩니다. 위의 아이디어에 따르면 해시 구조 대신 목록을 사용할 수 있습니다.

Redis 공식 툴 테스트를 통해 리스트 구조를 사용하면 144G의 공간이 필요하고, 해시 구조를 사용하면 245G의 공간이 필요합니다** (속성이 50% 이상 비어 있으면 여전히 적용 가능한지 테스트해야 함) )**

위의 경우에는 간단한 코드 몇 줄만으로 공간을 70% 이상 줄일 수 있습니다. 의 적극 권장됩니다. :Redis 캐시 공간을 최적화하는 방법

• 객체 대신 배열을 사용하세요(많은 수의 필드가 비어 있으면 직렬화 도구를 사용하여 null을 압축해야 함)

• 더 나은 직렬화 도구를 사용하세요.

• ZIP 압축 사용

• 해시 구조 대신 목록 사용(비어 있는 필드가 많은 경우 테스트 및 비교 필요)

위 내용은 Redis 캐시 공간을 최적화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 亿速云에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
REDIS : 기본 기능을 식별합니다REDIS : 기본 기능을 식별합니다Apr 12, 2025 am 12:01 AM

Redis의 핵심 기능은 고성능 인 메모리 데이터 저장 및 처리 시스템입니다. 1) 고속 데이터 액세스 : Redis는 메모리에 데이터를 저장하고 마이크로 초 수준 읽기 및 쓰기 속도를 제공합니다. 2) 풍부한 데이터 구조 : 문자열, 목록, 컬렉션 등을 지원하며 다양한 응용 프로그램 시나리오에 적응합니다. 3) 지속성 : RDB 및 AOF를 통해 디스크에 데이터를 지속하십시오. 4) 구독 게시 : 메시지 대기열 또는 실시간 통신 시스템에서 사용할 수 있습니다.

Redis : 인기있는 데이터 구조에 대한 안내서Redis : 인기있는 데이터 구조에 대한 안내서Apr 11, 2025 am 12:04 AM

Redis는 다음을 포함하여 다양한 데이터 구조를 지원합니다. 1. String, 단일 값 데이터 저장에 적합합니다. 2. 큐 및 스택에 적합한 목록; 3. 비면성 데이터 저장에 사용되는 세트; 4. 순서, 순위 목록 및 우선 순위 대기열에 적합한 순서 세트; 5. 해시 테이블, 객체 또는 구조화 된 데이터를 저장하는 데 적합합니다.

Redis 카운터를 구현하는 방법Redis 카운터를 구현하는 방법Apr 10, 2025 pm 10:21 PM

Redis Counter는 Redis Key-Value Pair 스토리지를 사용하여 다음 단계를 포함하여 계산 작업을 구현하는 메커니즘입니다. 카운터 키 생성, 카운트 증가, 카운트 감소, 카운트 재설정 및 카운트 얻기. Redis 카운터의 장점에는 빠른 속도, 높은 동시성, 내구성 및 단순성 및 사용 편의성이 포함됩니다. 사용자 액세스 계산, 실시간 메트릭 추적, 게임 점수 및 순위 및 주문 처리 계산과 같은 시나리오에서 사용할 수 있습니다.

Redis 명령 줄을 사용하는 방법Redis 명령 줄을 사용하는 방법Apr 10, 2025 pm 10:18 PM

Redis Command Line 도구 (Redis-Cli)를 사용하여 다음 단계를 통해 Redis를 관리하고 작동하십시오. 서버에 연결하고 주소와 포트를 지정하십시오. 명령 이름과 매개 변수를 사용하여 서버에 명령을 보냅니다. 도움말 명령을 사용하여 특정 명령에 대한 도움말 정보를 봅니다. 종금 명령을 사용하여 명령 줄 도구를 종료하십시오.

Redis 클러스터 모드를 구축하는 방법Redis 클러스터 모드를 구축하는 방법Apr 10, 2025 pm 10:15 PM

Redis Cluster Mode는 Sharding을 통해 Redis 인스턴스를 여러 서버에 배포하여 확장 성 및 가용성을 향상시킵니다. 시공 단계는 다음과 같습니다. 포트가 다른 홀수 redis 인스턴스를 만듭니다. 3 개의 센티넬 인스턴스를 만들고, Redis 인스턴스 및 장애 조치를 모니터링합니다. Sentinel 구성 파일 구성, Redis 인스턴스 정보 및 장애 조치 설정 모니터링 추가; Redis 인스턴스 구성 파일 구성, 클러스터 모드 활성화 및 클러스터 정보 파일 경로를 지정합니다. 각 redis 인스턴스의 정보를 포함하는 Nodes.conf 파일을 작성합니다. 클러스터를 시작하고 Create 명령을 실행하여 클러스터를 작성하고 복제본 수를 지정하십시오. 클러스터에 로그인하여 클러스터 정보 명령을 실행하여 클러스터 상태를 확인하십시오. 만들다

Redis 대기열을 읽는 방법Redis 대기열을 읽는 방법Apr 10, 2025 pm 10:12 PM

Redis의 대기열을 읽으려면 대기열 이름을 얻고 LPOP 명령을 사용하여 요소를 읽고 빈 큐를 처리해야합니다. 특정 단계는 다음과 같습니다. 대기열 이름 가져 오기 : "큐 :"와 같은 "대기열 : my-queue"의 접두사로 이름을 지정하십시오. LPOP 명령을 사용하십시오. 빈 대기열 처리 : 대기열이 비어 있으면 LPOP이 NIL을 반환하고 요소를 읽기 전에 대기열이 존재하는지 확인할 수 있습니다.

Redis Cluster ZSET 사용 방법Redis Cluster ZSET 사용 방법Apr 10, 2025 pm 10:09 PM

Redis 클러스터에서 ZSET 사용 : ZSET은 요소를 점수와 연관시키는 순서 컬렉션입니다. 샤딩 전략 : a. 해시 샤딩 : ZSET 키에 따라 해시 값을 배포하십시오. 비. 범위 샤딩 : 요소 점수에 따라 범위로 나누고 각 범위를 다른 노드에 할당합니다. 작업 읽기 및 쓰기 작업 : a. 읽기 작업 : ZSET 키가 현재 노드의 샤드에 속하는 경우 로컬로 처리됩니다. 그렇지 않으면 해당 샤드로 라우팅됩니다. 비. 쓰기 작업 : 항상 ZSET 키를 들고있는 파편으로 라우팅합니다.

Redis 데이터를 지우는 방법Redis 데이터를 지우는 방법Apr 10, 2025 pm 10:06 PM

Redis 데이터를 지우는 방법 : Flushall 명령을 사용하여 모든 키 값을 지우십시오. FlushDB 명령을 사용하여 현재 선택한 데이터베이스의 키 값을 지우십시오. 선택을 사용하여 데이터베이스를 전환 한 다음 FlushDB를 사용하여 여러 데이터베이스를 지우십시오. del 명령을 사용하여 특정 키를 삭제하십시오. Redis-Cli 도구를 사용하여 데이터를 지우십시오.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기