C#에서 byte[] 데이터를 Redis에 전송하는 것은 가능합니다. 하지만 Redis는 문자열 기반 저장소이기 때문에, byte[] 데이터를 저장하려면 적절히 직렬화(serialize)하거나 Base64 인코딩을 적용해야 합니다. 다음은 이를 처리하는 방법입니다.

AddItemToList 메서드를 사용할 경우

만약 Redis 클라이언트 라이브러리의 AddItemToList 메서드를 사용하려는 경우, byte[] 데이터를 문자열로 변환해야 합니다. 아래는 Base64 인코딩 방식으로 이를 수행하는 예제입니다.

byte[] realData = new byte[datalen];
Array.Copy(data, 0, realData, 0, datalen);

// Convert byte[] to Base64 string
string encodedData = Convert.ToBase64String(realData);

// Add to Redis list
sendRealRedis.AddItemToList("REAL", encodedData);

Redis에서 데이터를 복원할 때

// Retrieve Base64 string from Redis
string encodedData = receiveRealRedis.GetItemFromList("REAL");

// Convert Base64 string back to byte[]
byte[] realData = Convert.FromBase64String(encodedData);

 

간단한 Redis AddItemToList 및 복원

만약 간단히 데이터를 추가하고 문자열 기반으로 저장하려면 다음과 같이 구현할 수 있습니다.

using System;
using ServiceStack.Redis;

class Program
{
    static void Main()
    {
        string redisHost = "localhost:6379"; // Redis 서버 주소
        string redisKey = "REAL";

        // Redis 클라이언트 초기화
        using (var redisClient = new RedisClient(redisHost))
        {
            // 예제 데이터 준비
            byte[] realData = new byte[] { 100, 200, 255 };

            // 1. byte[] 데이터를 문자열로 저장 (Base64 인코딩 사용)
            string encodedData = Convert.ToBase64String(realData);
            redisClient.AddItemToList(redisKey, encodedData);
            Console.WriteLine("Data added to Redis.");

            // 2. Redis에서 데이터를 가져와 복원
            string retrievedEncodedData = redisClient.GetItemFromList(redisKey, 0); // 첫 번째 아이템 가져오기
            byte[] decodedData = Convert.FromBase64String(retrievedEncodedData);
            Console.WriteLine("Retrieved byte[]: " + BitConverter.ToString(decodedData));
        }
    }
}

- BRPop을 사용시에 해결방법

  1. data 배열이 byte[][] 형식으로 반환되었을 가능성이 높습니다.
    • data[0]: Redis 키 이름 (byte 배열로 반환됨)
    • data[1]: Redis 값 (Base64 인코딩된 byte 배열)
  2. Encoding.UTF8.GetString() 및 Convert.FromBase64String() 메서드는 입력 값이 적절하지 않을 경우 오류를 발생시킵니다.
var data = _receiveRealRedis.BRPop("REAL", 10);

if (data != null && data.Length > 0)
{
    // data[0]과 data[1]이 byte[] 형식이라고 가정
    string listName = Encoding.UTF8.GetString(data[0]); // 키 이름 변환
    byte[] decodedData = Convert.FromBase64String(Encoding.UTF8.GetString(data[1])); // 데이터 변환

    Console.WriteLine($"List Name: {listName}");
    Console.WriteLine($"Decoded Data: {BitConverter.ToString(decodedData)}");
}



주요 고려사항

  1. 직렬화 사용:
    • byte[] 데이터를 직렬화하여 Redis에 저장할 수 있습니다.
    • 직렬화된 데이터는 나중에 Redis에서 가져올 때 역직렬화(deserialize)하여 원래 데이터로 복원해야 합니다.
  2. Base64 인코딩 사용:
    • byte[] 데이터를 Base64로 변환하여 문자열로 저장한 후, 복원 시 Base64 디코딩을 수행할 수 있습니다.



주의사항

  1. 데이터 크기:
    • Redis는 데이터 크기에 제한이 있습니다. (일반적으로 하나의 값당 최대 512MB)
    • 데이터 크기가 큰 경우 압축을 고려하세요.
  2. 성능:
    • Base64 인코딩은 약 33%의 데이터 크기 증가를 초래합니다.
    • 데이터를 효율적으로 처리하려면 직렬화 방식이 적합합니다.
  3. 호환성:
    • 저장된 데이터는 다른 언어/플랫폼에서 접근해야 할 경우 호환성을 고려하세요. Base64는 플랫폼 독립적이지만, 직렬화는 언어/플랫폼 종속적일 수 있습니다.

이제 필요에 따라 Base64 인코딩 또는 직렬화를 선택하여 Redis에 데이터를 저장하고 복원할 수 있습니다!




+ Recent posts