System.out.println(JSON.toJSONString(pojo).length());
System.out.println(JSON.toJSONString(pojo.toValueArray()).length());
Redis 캐시 공간을 최적화하는 방법
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% 줄어듭니다. 다음과 같습니다: System.out.println(JSON.toJSONString(pojo).length());
["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이 아이디어에 따라 더 깊이 파고들어 데이터 유형을 수동으로 선택할 수 있다는 사실을 발견했습니다. 보다 극단적인 최적화 효과를 달성하고 더 작은 데이터 유형을 사용하도록 선택하면 추가 개선이 달성됩니다. System.out.println(JSON.toJSONString(pojo.toValueArray()).length());
개선 3 - 최적화된 데이터 유형
위의 사용 사례에서 testStatus, preCheckStatus 및Investor의 세 필드는 실제로 열거된 문자열 유형입니다(예: byte 또는 int 등). 문자열을 교체하면 공간을 더욱 절약할 수 있습니다. 문자열 대신 Long 유형을 사용하여 checkTime을 나타낼 수 있으므로 직렬화 도구가 더 적은 바이트를 출력합니다. //我们仍然选取JSON格式,但使用了第三方序列化工具
System.out.println(new ObjectMapper(new MessagePackFactory()).writeValueAsBytes(pojo.toValueArray()).length);
로그인 후 복사
수동 조정 후 String 형식 대신 더 작은 데이터 형식을 사용하여 인쇄//我们仍然选取JSON格式,但使用了第三方序列化工具 System.out.println(new ObjectMapper(new MessagePackFactory()).writeValueAsBytes(pojo.toValueArray()).length);
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% 이상 줄일 수 있습니다. 의 적극 권장됩니다. :
• 객체 대신 배열을 사용하세요(많은 수의 필드가 비어 있으면 직렬화 도구를 사용하여 null을 압축해야 함)
• 더 나은 직렬화 도구를 사용하세요.
• ZIP 압축 사용
• 해시 구조 대신 목록 사용(비어 있는 필드가 많은 경우 테스트 및 비교 필요)
위 내용은 Redis 캐시 공간을 최적화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











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

Redis는 해시 테이블을 사용하여 데이터를 저장하고 문자열, 목록, 해시 테이블, 컬렉션 및 주문한 컬렉션과 같은 데이터 구조를 지원합니다. Redis는 Snapshots (RDB)를 통해 데이터를 유지하고 WRITE 전용 (AOF) 메커니즘을 추가합니다. Redis는 마스터 슬레이브 복제를 사용하여 데이터 가용성을 향상시킵니다. Redis는 단일 스레드 이벤트 루프를 사용하여 연결 및 명령을 처리하여 데이터 원자력과 일관성을 보장합니다. Redis는 키의 만료 시간을 설정하고 게으른 삭제 메커니즘을 사용하여 만료 키를 삭제합니다.

Redis-Server가 찾을 수없는 문제를 해결하기위한 단계 : Redis가 올바르게 설치되어 있는지 확인하십시오. 환경 변수를 설정 redis_host 및 redis_port; Redis Server Redis-Server를 시작하십시오. 서버가 Redis-Cli Ping을 실행 중인지 확인하십시오.

Redis에서 모든 키를 보려면 세 가지 방법이 있습니다. 키 명령을 사용하여 지정된 패턴과 일치하는 모든 키를 반환하십시오. 스캔 명령을 사용하여 키를 반복하고 키 세트를 반환하십시오. 정보 명령을 사용하여 총 키 수를 얻으십시오.

Redis 소스 코드를 이해하는 가장 좋은 방법은 단계별로 이동하는 것입니다. Redis의 기본 사항에 익숙해집니다. 특정 모듈을 선택하거나 시작점으로 기능합니다. 모듈 또는 함수의 진입 점으로 시작하여 코드를 한 줄씩 봅니다. 함수 호출 체인을 통해 코드를 봅니다. Redis가 사용하는 기본 데이터 구조에 익숙해 지십시오. Redis가 사용하는 알고리즘을 식별하십시오.

Redis 지시 사항을 사용하려면 다음 단계가 필요합니다. Redis 클라이언트를 엽니 다. 명령 (동사 키 값)을 입력하십시오. 필요한 매개 변수를 제공합니다 (명령어마다 다름). 명령을 실행하려면 Enter를 누르십시오. Redis는 작업 결과를 나타내는 응답을 반환합니다 (일반적으로 OK 또는 -err).

Redis 버전 번호를 보려면 다음 세 가지 방법을 사용할 수 있습니다. (1) info 명령을 입력하고 (2) -version 옵션으로 서버를 시작하고 (3) 구성 파일을 봅니다.

다음 두 가지 방법을 사용하여 Redis : Flushall 명령 : 데이터베이스의 모든 키와 값을 삭제할 수 있습니다. Config ResetStat 명령 : 데이터베이스의 모든 상태 (키, 값 및 기타 통계 포함)를 재설정합니다.
