2014-04-11 2 views
0

내 응용 프로그램에서 redis 문자열 키에 저장된 데이터를 압축 할 싶습니다. 비록 작은 데이터 값이 잘 압축되지 않기 때문에 나는 그것들을 모두 압축하고 싶지 않고 그것들에 대한 CPU 오버 헤드를 피하고자합니다.Redis 문자열 값을 .net MVC에서 압축

내 질문은 내가 압축 해제를 수행하기 위해 문자열 키를 읽을 때 값이 압축되는 것을 감지하는 방법은?

사용자 정의 헤더를 압축 스트림에 추가하려고 시도했지만 운이 없었습니다.

답변

1

일반적인 패턴은 구분 기호와 결합 된 페이로드 접두사를 사용하는 것입니다.

는 예를 들어, 다음과 같은 형식을 사용할 수 있습니다

[key];[encoding];[metatype];[version]\t[payload] 

나는 구분 기호를 사용 ; 여기 \t. 다른 구분자를 원할 경우 다른 구분자를 선택하십시오. 물론 이러한 구분 기호가 접두사 태그 자체에서 발생하는 것을 방지해야합니다. [payload]에는 바이너리 데이터, 문자열 데이터 등이 포함됩니다. 예를 들어 [encoding]zip, msgpack, utf8, base64, json (그냥 몇 가지 아이디어)합니다.

페이로드 접두어를 사용하는 이점은 직렬화 또는 엔티티로 사용하는 페이로드 자체의 압축을 해제 할 필요가 없다는 것입니다. 예를 들어 Redis-Lua에서는 압축을 풀 수 없습니다. 그러나 프리로드 접두어를 간단히 읽고 클라이언트 요청에 응답 할 수 있습니다. 당신이 직렬화 내부 레디 스 - 루아, JSON 또는 MsgPack 형식과 마찬가지로, 당신이 원하는하지 수 수없는 경우에도해야 할 일이 있기 때문에 성능 이유.

물론 다른 옵션이 있습니다. 구분 기호가있는 접두사가 마음에 들지 않으면 페이로드와 인코딩 태그를 배열에 넣고 MsgPack으로 직렬화 할 수 있습니다. 또는 접두어에 JSON을 사용하고 null 문자를 입력 한 다음 페이로드를 사용하십시오. 아니면 (조금 더 효율적인 메모리) : 접두사 크기에 4 또는 8 바이트를 사용하고 접두어에 MsgPack을 사용하고 접두어 크기를 사용하여 페이로드가 시작되는 위치를 결정합니다 (MsgPack 일 수도 있음). 조언

최종 단어 : (우편 헤더를 변경 등) 페이로드 자체가 엉망하지 않는, 즉 불필요한 문제의 전체를 많이 당신을 얻을 될거에요. 이 도움이

희망, TW

+0

는 내가 틀렸다면 당신이 무엇을 의미하는지, 저를 수정하시기 바랍니다 내가 가진 생각합니다. 나는 또 다른 스트림을 만들고, 접두어와 압축 된 스트림을 작성합니다 .... 맞나요? – PanKak

+0

그 방법 중 하나입니다. C#/BookSleeve/StackExchange.Redis에서 사용하는 것이 가장 쉬운 방법 일 것입니다. 개체에 대한 사용자 지정 serializer를 작성할 수도 있습니다. Redis에게 보내는 결과는 항상 간단한 bytearray입니다. Redis 키/값/문자열은 항상 바이너리 안전하며 사용 방법은 사용자가 결정합니다. –

+0

그때! 도와 주셔서 감사합니다. – PanKak