Redis는 데이터베이스, 캐시 및 메시지 브로커로 사용되며, 메모리에 데이터를 저장하지만 파일에 데이터를 영구적으로 저장하도록 구성할 수도 있습니다.

C#에서 Redis를 사용하려면 StackExchange.Redis 라이브러리를 활용할 수 있습니다.

Redis의 데이터 영구성은 두 가지 주요 메커니즘으로 지원됩니다:

  1. RDB 스냅샷: 특정 간격마다 데이터를 디스크에 저장.
  2. AOF(Append-Only File): 모든 쓰기 작업을 로그로 기록.

아래는 Redis 데이터를 파일로 저장하고 다시 읽어오는 과정을 C#으로 구현하는 예제입니다.


1. Redis 서버 설정

Redis의 redis.conf 파일에서 다음 설정을 확인하거나 수정하세요:

  • RDB 스냅샷 설정:
     
    save 900 1 # 900초(15분) 동안 1개 이상의 키가 변경되었을 때 스냅샷 저장 save 300 10 save 60 10000
  • AOF 활성화:
     
    appendonly yes

Redis 서버가 데이터를 디스크에 저장하도록 설정되어야 합니다.


2. C# 코드 작성

C# 코드에서는 StackExchange.Redis 라이브러리를 사용하여 Redis와 상호작용합니다.

using System;
using StackExchange.Redis;
using Systehttp://m.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // Redis 서버 연결
        var redisConnectionString = "localhost"; // Redis 서버 주소
        var redis = ConnectionMultiplexer.Connect(redisConnectionString);
        IDatabase db = redis.GetDatabase();

        // 1. 데이터 저장
        Console.WriteLine("Saving data to Redis...");
        await db.StringSetAsync("key1", "value1");
        await db.StringSetAsync("key2", "value2");
        Console.WriteLine("Data saved!");

        // 2. Redis에 저장된 데이터 확인
        Console.WriteLine("Reading data from Redis...");
        string value1 = await db.StringGetAsync("key1");
        string value2 = await db.StringGetAsync("key2");
        Console.WriteLine($"key1: {value1}");
        Console.WriteLine($"key2: {value2}");

        // 3. Redis의 데이터를 파일로 저장(RDB 또는 AOF는 Redis 서버에서 수행)
        Console.WriteLine("Triggering Redis SAVE operation...");
        var server = redis.GetServer(redisConnectionString, 6379);
        server.Save(SaveType.Foreground);
        Console.WriteLine("Data saved to disk!");

        // 4. Redis 서버를 재시작하면 데이터 복원 확인 가능
        Console.WriteLine("Restart Redis server and verify the data persistence.");

        redis.Dispose();
    }
}
 

3. 예제 실행 순서

  1. Redis 서버가 실행 중인지 확인하고, RDB/AOF 설정을 활성화합니다.
  2. 위 코드를 실행하여 데이터를 Redis에 저장하고 SAVE 명령으로 디스크에 기록합니다.
  3. Redis 서버를 재시작한 뒤 데이터를 다시 읽어와 복원되었는지 확인합니다.

4. 참고 사항

  • server.Save(SaveType.Foreground)는 Redis 서버의 데이터를 디스크에 저장하도록 강제로 트리거합니다. (RDB 방식)
  • AOF 방식은 데이터 변경 시 자동으로 기록되며, 이를 코드에서 명시적으로 호출할 필요는 없습니다.
  • 복구된 데이터를 확인하려면 Redis 서버를 종료한 후 재시작하고, 기존 데이터를 읽어옵니다.

Redis의 영구성 설정과 StackExchange.Redis 라이브러리를 조합하면 안정적으로 데이터를 저장하고 복원할 수 있습니다.

 
Newtonsoft.Json은 JSON 데이터를 처리하기 위한 인기 있는 C# 라이브러리입니다. 이를 사용하면 JSON 데이터를 쉽게 직렬화(Serialization) 및 역직렬화(Deserialization)할 수 있습니다.

1. 패키지 설치

 
dotnet add package Newtonsoft.Json

2. 사용 예제

아래는 Newtonsoft.Json을 사용하여 객체를 JSON 문자열로 변환(직렬화)하고, JSON 문자열을 객체로 변환(역직렬화)하는 간단한 예제입니다.

2.1 코드 예제

 
using System;
using Newtonsoft.Json;

namespace NewtonsoftJsonExample
{
    // Sample class
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string[] Hobbies { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // 1. 객체를 JSON으로 직렬화
            var person = new Person
            {
                Name = "John Doe",
                Age = 30,
                Hobbies = new[] { "Reading", "Traveling", "Gaming" }
            };

            string json = JsonConvert.SerializeObject(person, Formatting.Indented);
            Console.WriteLine("Serialized JSON:");
            Console.WriteLine(json);

            // 2. JSON 문자열을 객체로 역직렬화
            string jsonString = @"{
                ""Name"": ""Jane Smith"",
                ""Age"": 25,
                ""Hobbies"": [""Cooking"", ""Hiking""]
            }";

            var deserializedPerson = JsonConvert.DeserializeObject<Person>(jsonString);
            Console.WriteLine("\nDeserialized Object:");
            Console.WriteLine($"Name: {deserializedPerson.Name}");
            Console.WriteLine($"Age: {deserializedPerson.Age}");
            Console.WriteLine($"Hobbies: {string.Join(", ", deserializedPerson.Hobbies)}");
        }
    }
}
 

3. 예제 출력

 
Serialized JSON: { "Name": "John Doe", "Age": 30, "Hobbies": [ "Reading", "Traveling", "Gaming" ] } Deserialized Object: Name: Jane Smith Age: 25 Hobbies: Cooking, Hiking

4. 주요 메서드

  • JsonConvert.SerializeObject(object, Formatting)
    객체를 JSON 문자열로 변환합니다.
    Formatting.Indented를 사용하면 보기 좋은 포맷으로 JSON을 출력합니다.
  • JsonConvert.DeserializeObject<T>(string)
    JSON 문자열을 지정된 타입의 객체로 변환합니다.

5. 추가 사용 예제

5.1 JSON 데이터에서 특정 키값 추출

using Newtonsoft.Json.Linq;

string json = @"{ 'Name': 'Alice', 'Age': 22 }";
var jsonObject = JObject.Parse(json);

string name = jsonObject["Name"]?.ToString();
int age = (int)jsonObject["Age"];
Console.WriteLine($"Name: {name}, Age: {age}");
 

5.2 Dictionary로 JSON 처리

using System.Collections.Generic;

string jsonString = @"{ 'Key1': 'Value1', 'Key2': 'Value2' }";
var dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonString);

foreach (var kvp in dictionary)
{
    Console.WriteLine($"{kvp.Key}: {kvp.Value}");
}
 

Newtonsoft.Json은 유연하고 강력한 JSON 처리 라이브러리로, 다양한 JSON 형식과 작업을 지원합니다.

 

Redis의 데이터를 JSON 형식으로 저장하고, 이를 파일에 저장한 뒤 다시 읽어오는 C# 예제를 작성하겠습니다.
이 작업은 Newtonsoft.Json과 StackExchange.Redis를 조합하여 수행할 수 있습니다.


1. 패키지 설치

 
dotnet add package StackExchange.Redis
dotnet add package Newtonsoft.Json

2. 코드 예제

아래는 Redis 데이터를 JSON 형식으로 저장하고 파일에 저장한 뒤, 파일에서 다시 읽어서 Redis에 복원하는 예제입니다.

using System;
using System.IO;
using Systehttp://m.Threading.Tasks;
using StackExchange.Redis;
using Newtonsoft.Json;

namespace RedisJsonExample
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // Redis 연결
            var redisConnectionString = "localhost"; // Redis 서버 주소
            var redis = ConnectionMultiplexer.Connect(redisConnectionString);
            IDatabase db = redis.GetDatabase();

            // Redis 데이터 저장
            Console.WriteLine("Saving data to Redis...");
            await db.StringSetAsync("key1", "value1");
            await db.StringSetAsync("key2", "value2");
            await db.HashSetAsync("hash1", new HashEntry[] {
                new HashEntry("field1", "valueA"),
                new HashEntry("field2", "valueB")
            });
            Console.WriteLine("Data saved to Redis!");

            // Redis 데이터 읽기
            Console.WriteLine("Reading data from Redis...");
            var data = new
            {
                Key1 = await db.StringGetAsync("key1"),
                Key2 = await db.StringGetAsync("key2"),
                Hash1 = await db.HashGetAllAsync("hash1")
            };

            // 데이터를 JSON으로 직렬화
            string json = JsonConvert.SerializeObject(data, Formatting.Indented);
            Console.WriteLine("Serialized JSON:");
            Console.WriteLine(json);

            // JSON 파일로 저장
            string filePath = "redis_data.json";
            await File.WriteAllTextAsync(filePath, json);
            Console.WriteLine($"Data saved to file: {filePath}");

            // JSON 파일에서 데이터 읽기
            Console.WriteLine("\nReading data from file...");
            string jsonFromFile = await File.ReadAllTextAsync(filePath);
            var deserializedData = JsonConvert.DeserializeObject<dynamic>(jsonFromFile);
            Console.WriteLine("Deserialized Data:");
            Console.WriteLine(jsonFromFile);

            // Redis에 데이터 복원
            Console.WriteLine("\nRestoring data to Redis...");
            await db.StringSetAsync("key1", (string)deserializedData.Key1);
            await db.StringSetAsync("key2", (string)deserializedData.Key2);

            foreach (var hashEntry in deserializedData.Hash1)
            {
                await db.HashSetAsync("hash1", (string)hashEntry.Name, (string)hashEntry.Value);
            }

            Console.WriteLine("Data restored to Redis!");

            redis.Dispose();
        }
    }
}
 

3. 코드 설명

  1. Redis 데이터 저장
    • StringSetAsync와 HashSetAsync를 사용하여 데이터를 Redis에 저장합니다.
  2. JSON으로 직렬화
    • Redis에서 데이터를 가져온 뒤 JsonConvert.SerializeObject를 사용하여 JSON으로 직렬화합니다.
  3. 파일로 저장
    • File.WriteAllTextAsync를 사용하여 JSON 데이터를 파일에 저장합니다.
  4. 파일에서 읽기 및 복원
    • File.ReadAllTextAsync로 JSON 데이터를 읽어온 뒤, 이를 JsonConvert.DeserializeObject로 다시 역직렬화하여 객체로 변환합니다.
    • 데이터를 Redis에 복원합니다.

4. 예제 실행 결과

Redis에 저장된 데이터:

 
key1: value1 key2: value2 hash1: { field1: valueA, field2: valueB }

파일에 저장된 JSON:

 
{ "Key1": "value1", "Key2": "value2", "Hash1": [ { "Name": "field1", "Value": "valueA" }, { "Name": "field2", "Value": "valueB" } ] }

Redis로 복원된 데이터:

  • key1, key2, hash1가 원래 데이터와 동일하게 복원됩니다.

이 방식으로 Redis 데이터를 JSON 파일로 저장하고 복원할 수 있습니다. Newtonsoft.Json을 사용하여 데이터 직렬화 및 역직렬화를 처리하며, Redis 데이터 백업 및 복원 시 유용합니다.

 

Redis에서 특정 파일명을 지정하여 데이터를 저장하거나 복원하려면 Redis 서버 설정 파일(redis.conf) 또는 명령줄 옵션을 사용하여 파일명을 지정할 수 있습니다. Redis는 데이터의 영구 저장을 위해 RDB 스냅샷AOF(Append-Only File) 방식을 지원합니다.


1. Redis 설정 파일(redis.conf)에서 파일명 지정

Redis의 설정 파일을 수정하여 데이터 저장 파일명을 지정할 수 있습니다.

RDB 스냅샷 파일명 지정

RDB 방식은 특정 시점의 데이터를 디스크에 저장합니다. 설정 파일에서 dbfilename 값을 변경합니다:

 
dbfilename dump.rdb dir /path/to/directory
  • dbfilename: RDB 스냅샷 파일명 (예: mycustomfile.rdb)
  • dir: 파일이 저장될 디렉토리 경로

AOF(Append-Only File) 파일명 지정

AOF 방식은 모든 쓰기 작업을 로그 파일로 기록합니다:

 
appendfilename "appendonly.aof" dir /path/to/directory

2. 명령줄에서 파일명 지정

Redis 서버를 실행할 때 명령줄에서 파일명을 지정할 수도 있습니다:

 
redis-server --dbfilename mycustomfile.rdb --dir /path/to/directory

3. C#에서 특정 파일명을 사용한 Redis 데이터 저장 및 복원

Redis 서버 설정을 이용해 특정 파일명을 지정했다면, 서버 측에서 파일 관리가 이루어집니다. 그러나 C# 코드에서 직접 Redis 데이터를 읽어 특정 파일에 저장하거나 복원하려면 StackExchange.Redis와 Newtonsoft.Json을 사용할 수 있습니다.

C# 예제

using System;
using System.IO;
using Systehttp://m.Threading.Tasks;
using StackExchange.Redis;
using Newtonsoft.Json;

namespace RedisFileExample
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // Redis 연결
            var redisConnectionString = "localhost";
            var redis = ConnectionMultiplexer.Connect(redisConnectionString);
            IDatabase db = redis.GetDatabase();

            // Redis 데이터 저장
            await db.StringSetAsync("key1", "value1");
            await db.StringSetAsync("key2", "value2");

            // 특정 파일에 저장
            string filePath = "custom_redis_data.json";
            var data = new
            {
                Key1 = await db.StringGetAsync("key1"),
                Key2 = await db.StringGetAsync("key2")
            };
            string json = JsonConvert.SerializeObject(data, Formatting.Indented);
            await File.WriteAllTextAsync(filePath, json);
            Console.WriteLine($"Data saved to file: {filePath}");

            // 파일에서 데이터 읽어 Redis 복원
            string jsonFromFile = await File.ReadAllTextAsync(filePath);
            var deserializedData = JsonConvert.DeserializeObject<dynamic>(jsonFromFile);
            await db.StringSetAsync("key1", (string)deserializedData.Key1);
            await db.StringSetAsync("key2", (string)deserializedData.Key2);

            Console.WriteLine("Data restored to Redis!");
            redis.Dispose();
        }
    }
}
 

4. 데이터 복원 시 파일 경로 지정

Redis의 redis-cli를 사용하여 데이터를 특정 파일에서 복원할 수도 있습니다.

RDB 복원

  • Redis 서버를 종료한 뒤, 원하는 RDB 파일을 Redis 데이터 디렉토리에 복사하고 다시 시작합니다:
 
cp /path/to/mycustomfile.rdb /var/lib/redis/dump.rdb redis-server

AOF 복원

  • Redis 서버를 종료한 뒤, AOF 파일을 지정된 디렉토리에 복사하고 다시 시작합니다:
 
cp /path/to/appendonly.aof /var/lib/redis/appendonly.aof redis-server

5. 중요 참고사항

  • Redis 서버 설정에서 지정한 파일명은 자동으로 사용되며,
    코드에서 Redis 데이터를 백업하거나 복원할 때 파일명을 명시적으로 지정해야 합니다.
  • RDB와 AOF는 각각 장단점이 있으므로, 필요에 따라 둘 중 하나를 선택하거나 둘 다 활성화할 수 있습니다.

Redis 서버 설정 및 백업/복원 스크립트를 적절히 활용하면 특정 파일명을 이용한 데이터 관리가 가능합니다.

Caution) 중요한 데이타의 경우에 Redis 서버 설정 및 백업/복원 스크립트 작성해서, ReBoot시에 대비한다.


Redis에서 시스템에서 사용할 수 있는 최대 메모리를 확인하려면, INFO MEMORY 명령어와 함께 maxmemory 설정을 통해 Redis가 할당할 수 있는 최대 메모리 용량을 확인할 수 있습니다.

1. maxmemory 설정 확인

Redis는 메모리 사용에 제한을 둘 수 있는 설정(maxmemory)이 있으며, 이 값을 확인하려면 CONFIG GET 명령어를 사용합니다.

redis-cli CONFIG GET maxmemory

이 명령어는 Redis 서버가 할당할 수 있는 최대 메모리의 값을 반환합니다. 예를 들어, maxmemory가 설정되지 않은 경우 0이 반환되며, 이는 제한 없이 Redis가 사용할 수 있음을 의미합니다.

예시:

redis-cli CONFIG GET maxmemory

출력 예시:

1) "maxmemory" 2) "1073741824"

위 예시에서는 maxmemory가 1073741824 (1GB)로 설정되어 있음을 나타냅니다. 만약 maxmemory가 0이라면 Redis는 메모리에 제한 없이 사용할 수 있습니다.

2. 전체 시스템 메모리 확인

Redis가 할당할 수 있는 최대 메모리는 운영 체제에서 Redis 프로세스에 할당된 메모리와도 관련이 있습니다. INFO MEMORY 명령어로 전체 시스템의 메모리 크기를 확인할 수 있습니다.

redis-cli INFO MEMORY

출력 예시:

# Memory used_memory:12345678 used_memory_human:11.77M used_memory_rss:98765432 used_memory_peak:23456789 mem_fragmentation_ratio:1.78 total_system_memory:8388608000

위 예시에서 **total_system_memory**는 시스템 전체 메모리 용량을 나타내며, 이는 Redis가 실행되고 있는 서버의 전체 RAM 용량입니다.

요약:

  • Redis가 사용할 수 있는 최대 메모리는 CONFIG GET maxmemory 명령어로 확인할 수 있습니다.
  • 전체 시스템 메모리는 INFO MEMORY 명령어에서 total_system_memory 항목으로 확인할 수 있습니다.
  • maxmemory 설정이 0인 경우 Redis는 시스템 전체 메모리의 사용에 제한이 없습니다.



My Case)

C:\Users\xterm>redis-cli CONFIG GET maxmemory
1) "maxmemory"
2) "1572864000"

C:\Users\xterm>redis-cli INFO MEMORY
# Memory
used_memory:9875616
used_memory_human:9.42M
used_memory_rss:9816928
used_memory_peak:9875616
used_memory_peak_human:9.42M
used_memory_lua:36864
mem_fragmentation_ratio:0.99
mem_allocator:jemalloc-3.6.0
 
C:\Users\xterm>redis-cli CONFIG GET maxmemory
1) "maxmemory"
2) "1572864000"
 

1 메가바이트(MB)는 1,048,576 바이트입니다. 따라서:

1572864000 bytes÷1048576=1500 MB1572864000 \, \text{bytes} \div 1048576 = 1500 \, \text{MB}

따라서, 1572864000 바이트는 **1500 메가바이트(MB)**입니다.

Redis에 할당된 전체 메모리 용량을 확인하려면 INFO MEMORY 명령어를 사용하여 메모리 관련 정보를 확인할 수 있습니다. 이 명령어는 Redis 서버의 메모리 사용 상태를 종합적으로 보여줍니다.

INFO MEMORY 명령어

redis-cli INFO MEMORY

이 명령어를 실행하면 Redis 서버의 메모리 상태에 대한 상세한 정보를 얻을 수 있습니다. 그 중에서 전체 메모리와 관련된 정보는 다음과 같습니다:

주요 항목:

  • used_memory: Redis가 현재 사용 중인 메모리의 총량 (바이트 단위)
  • used_memory_human: 사람이 읽기 쉬운 형식으로 표시된 사용 중인 메모리 (예: 10.5M, 2.3G 등)
  • used_memory_rss: Redis 프로세스가 운영 체제에서 실제로 할당받은 메모리 (Resident Set Size)
  • used_memory_peak: Redis가 사용한 최대 메모리
  • total_system_memory: Redis가 실행되고 있는 시스템의 전체 물리적 메모리 (이 값은 시스템의 RAM 크기를 나타냄)

예시:

 
C:\Users\xterm>redis-cli INFO MEMORY
# Memory
used_memory:930832
used_memory_human:909.02K
used_memory_rss:872960
used_memory_peak:7590400
used_memory_peak_human:7.24M
used_memory_lua:36864
mem_fragmentation_ratio:0.94
mem_allocator:jemalloc-3.6.0

C:\Users\xterm>redis-cli INFO MEMORY
# Memory
used_memory:1049312
used_memory_human:1.00M
used_memory_rss:1049152
used_memory_peak:7590400
used_memory_peak_human:7.24M
used_memory_lua:36864
mem_fragmentation_ratio:1.00
mem_allocator:jemalloc-3.6.0

C:\Users\xterm>redis-cli INFO MEMORY
# Memory
used_memory:2683728
used_memory_human:2.56M
used_memory_rss:2624288
used_memory_peak:7590400
used_memory_peak_human:7.24M
used_memory_lua:36864
mem_fragmentation_ratio:0.98
mem_allocator:jemalloc-3.6.0

C:\Users\xterm>redis-cli INFO MEMORY
# Memory
used_memory:3072672
used_memory_human:2.93M
used_memory_rss:3013984
used_memory_peak:7590400
used_memory_peak_human:7.24M
used_memory_lua:36864
mem_fragmentation_ratio:0.98
mem_allocator:jemalloc-3.6.0

C:\Users\xterm>redis-cli INFO MEMORY
# Memory
used_memory:3052144
used_memory_human:2.91M
used_memory_rss:3051984
used_memory_peak:7590400
used_memory_peak_human:7.24M
used_memory_lua:36864
mem_fragmentation_ratio:1.00
mem_allocator:jemalloc-3.6.0

C:\Users\xterm>redis-cli INFO MEMORY
# Memory
used_memory:3063568
used_memory_human:2.92M
used_memory_rss:3063472
used_memory_peak:7590400
used_memory_peak_human:7.24M
used_memory_lua:36864
mem_fragmentation_ratio:1.00
mem_allocator:jemalloc-3.6.0

C:\Users\xterm>redis-cli INFO MEMORY
# Memory
used_memory:3106944
used_memory_human:2.96M
used_memory_rss:3048256
used_memory_peak:7590400
used_memory_peak_human:7.24M
used_memory_lua:36864
mem_fragmentation_ratio:0.98
mem_allocator:jemalloc-3.6.0

C:\Users\xterm>redis-cli INFO MEMORY
# Memory
used_memory:3116048
used_memory_human:2.97M
used_memory_rss:3057360
used_memory_peak:7590400
used_memory_peak_human:7.24M
used_memory_lua:36864
mem_fragmentation_ratio:0.98
mem_allocator:jemalloc-3.6.0

C:\Users\xterm>redis-cli INFO MEMORY
# Memory
used_memory:3124208
used_memory_human:2.98M
used_memory_rss:3065520
used_memory_peak:7590400
used_memory_peak_human:7.24M
used_memory_lua:36864
mem_fragmentation_ratio:0.98
mem_allocator:jemalloc-3.6.0

C:\Users\xterm>redis-cli INFO MEMORY
# Memory
used_memory:3135760
used_memory_human:2.99M
used_memory_rss:3077072
used_memory_peak:7590400
used_memory_peak_human:7.24M
used_memory_lua:36864
mem_fragmentation_ratio:0.98
mem_allocator:jemalloc-3.6.0

C:\Users\xterm>redis-cli INFO MEMORY
# Memory
used_memory:4905536
used_memory_human:4.68M
used_memory_rss:4846848
used_memory_peak:7590400
used_memory_peak_human:7.24M
used_memory_lua:36864
mem_fragmentation_ratio:0.99
mem_allocator:jemalloc-3.6.0

주요 항목 설명:

  1. used_memory: Redis가 현재 실제로 사용하고 있는 메모리의 크기입니다.
  2. used_memory_rss: Redis 프로세스가 운영 체제에서 실제로 할당받은 메모리입니다. 이는 used_memory보다 많을 수 있으며, 메모리 단편화로 인해 실제 할당된 메모리 공간이 더 크면 used_memory_rss가 커집니다.
  3. total_system_memory: 시스템의 전체 물리적 메모리 크기입니다. 예를 들어, 8388608000은 약 8GB의 메모리입니다.

used_memory / used_memory_rss 둘은 서로 비례해서 늘기도 하고, 줄기도 한다.

INFO MEMORY 명령어를 사용하면 전체 Redis 메모리 상태를 자세히 알 수 있으며, 특히 시스템 전체 메모리와 Redis에서 사용 중인 메모리를 비교하여 시스템 리소스가 어떻게 사용되고 있는지 파악할 수 있습니다.

Redis에서 각 키에 해당하는 데이터 유형을 확인하고, 해당 유형에 맞는 명령어를 통해 리스트의 크기를 확인할 수 있습니다. Redis는 다양한 데이터 유형(예: 문자열, 리스트, 집합 등)을 지원하므로, 리스트 타입에 대해 구체적으로 크기를 확인하려면 아래 방법을 사용합니다.

C:\Users\xterm>redis-cli LLEN QCS:11270016379155155155155
(integer) 0

C:\Users\xterm>redis-cli LLEN QCS:11270016379155155155155
(integer) 0

C:\Users\xterm>redis-cli LLEN QCS:11270016379155155155155
(integer) 0

C:\Users\xterm>redis-cli LLEN QCS:11270016379155155155155
(integer) 0

C:\Users\xterm>redis-cli LLEN QCS:11270016379155155155155
(integer) 0

C:\Users\xterm>redis-cli LLEN QCS:11270016379155155155155
(integer) 0
 

1. 키의 데이터 유형 확인

먼저, 특정 키가 리스트인지 확인하려면 TYPE 명령어를 사용할 수 있습니다:

redis-cli TYPE <key>

예를 들어, mylist라는 키가 리스트인 경우:

redis-cli TYPE mylist

이 명령어가 list를 반환하면 해당 키는 리스트입니다.

2. 리스트의 크기 확인

리스트의 크기를 확인하려면 LLEN 명령어를 사용합니다. LLEN 명령어는 리스트의 요소 수를 반환합니다:

redis-cli LLEN <key>

예를 들어, mylist라는 키의 리스트 크기를 확인하려면:

redis-cli LLEN mylist

이 명령어는 mylist 키에 저장된 리스트의 길이를 반환합니다.

3. 리스트에 저장된 모든 요소 가져오기 (선택 사항)

리스트의 모든 요소를 확인하고 싶다면, LRANGE 명령어를 사용할 수 있습니다:

redis-cli LRANGE <key> 0 -1

이 명령어는 리스트의 모든 요소를 반환합니다. 예를 들어:

redis-cli LRANGE mylist 0 -1

이 명령어는 mylist 리스트의 모든 항목을 반환합니다.

예시

  1. 리스트 데이터 유형 확인:
  2.  
    redis-cli TYPE mylist # => list
  3. 리스트 길이 확인:
  4.  
    redis-cli LLEN mylist # => 5 (리스트에 5개의 요소가 있을 경우)
  5. 리스트의 모든 요소 가져오기:
  6.  
    redis-cli LRANGE mylist 0 -1 # => 1) "value1" # 2) "value2" # 3) "value3" # 4) "value4" # 5) "value5"

이렇게 하여 Redis에서 특정 키가 리스트일 때, 해당 리스트의 요소 개수를 확인하고, 필요한 경우 모든 요소를 가져올 수 있습니다.

 
 
 

 

 
 

Redis의 MONITOR 명령어는 Redis 서버에서 실행되는 모든 명령어를 실시간으로 보여줍니다. 
제공된 로그를 분석해 보겠습니다.

1734668509.318594 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668509.425162 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668519.504719 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668519.612482 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668529.678985 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668529.784129 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668539.847388 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668539.953286 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668550.015080 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668550.122723 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668560.195185 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668560.300094 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668570.331758 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668570.439404 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668580.507469 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668580.612993 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668590.665583 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668590.771936 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668600.852657 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668600.959458 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668610.892517 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668610.997436 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668620.962275 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668621.069678 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668631.063810 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668631.169203 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668641.161092 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668641.266712 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"
1734668651.240528 [0 127.0.0.1:15996] "BRPOP" "CLI" "10"
1734668651.346548 [0 127.0.0.1:15997] "BRPOP" "CLK" "10"

형식 분석
각 라인의 구조는 다음과 같습니다:

[타임스탬프] [데이터베이스 번호 클라이언트 정보] "명령어" "키" "옵션"

타임스탬프
로그의 첫 번째 값(예: 1734668438.713544)은 Unix Epoch 시간입니다. 초 단위와 밀리초 단위로 명령이 실행된 시점을 나타냅니다.

데이터베이스 번호 및 클라이언트 정보
[0 127.0.0.1:15996]에서 [0]은 Redis 데이터베이스 번호(기본값은 0)이고, 127.0.0.1:15996은 명령을 실행한 클라이언트의 IP와 포트입니다.

명령어와 인자
"BRPOP" "CLI" "10"는 Redis 명령어와 그 인자입니다.

BRPOP: 블로킹 팝 명령으로, 리스트의 마지막 요소를 제거하고 반환합니다. 리스트가 비어 있으면 지정된 시간 동안 대기합니다.
"CLI"와 "CLK": 각각 대기하려는 리스트의 키 이름입니다.
"10": 대기 시간(10초)을 의미합니다.

로그의 의미
동작
클라이언트 두 개(127.0.0.1:15996과 127.0.0.1:15997)가 BRPOP 명령어를 주기적으로 호출하고 있습니다.
각각 CLI와 CLK라는 키를 대상으로 10초 동안 대기합니다.
결과 추정
로그에서 주기적으로 BRPOP 호출이 반복되고 있습니다. 이는 리스트에서 요소를 가져오려는 시도지만, 리스트에 항목이 없기 때문에 BRPOP의 대기 시간이 끝난 뒤 명령이 다시 호출되는 것으로 보입니다.

주요 내용
주기적인 호출: 두 클라이언트가 각각 10초 간격으로 BRPOP을 호출하며, 대기 시간이 끝난 뒤 다시 명령을 재시도하고 있습니다.
리스트 상태: CLI와 CLK 키에 매핑된 리스트들이 비어 있는 상태일 가능성이 큽니다.
실제로 리스트에 데이터가 있었다면 BRPOP은 즉시 데이터를 반환하고, 명령이 재호출되는 주기가 더 불규칙적일 것입니다.

개선 또는 검토할 점
리스트 상태 확인
CLI와 CLK 리스트가 의도한 대로 데이터가 푸시되고 있는지 확인하세요. 리스트에 항목이 없다면 데이터 생산자(프로듀서)의 작업 상태를 점검해야 합니다.

논블로킹 대안 검토
반복적으로 BRPOP을 호출하는 대신, 데이터 생산자와 소비자 간의 데이터 흐름이 원활하게 이루어지도록 설계해야 합니다. 
예를 들어 Pub/Sub 모델을 사용하는 방안을 고려할 수 있습니다.

성능 영향
빈 리스트에 대해 계속 BRPOP을 호출하면 Redis 서버에 불필요한 부하가 생길 수 있습니다. 
호출 주기와 데이터 흐름을 최적화해야 합니다.

#USING
using ServiceStack.Redis;

#DELCARE
RedisClient sendRedis = null;
RedisClient receiveRedis = null;

#CONNECT
sendRedis = new RedisClient("10.245.1.65", 9111);
recvRedis = new RedisClient("10.245.1.65", 9111);

#PUSH
byte[] sendbytes = Encoding.UTF8.GetBytes(qryText);

int resultcode = sendRedis.RPush("QCS", sendbytes);

if(resultcode==1){}

#POP
string sendFormatText = "CLI:/cli/admin/" + "127.0.0.1" + "/" + "45645";

byte[][] recvbytes = null;
recvbytes = recvRedis.BLPop(sendFormatText, 1);
for(int ii=0; ii<recvbytes.Length; ii++)
{
byte[] jsonbyte = new byte[recvbytes[ii].Length];
recvbytes[ii].CopyTo(jsonbyte, 0);

formatText = Encoding.UTF8.GetString(jsonbyte);

if(ii==1){}
}

#COMPILE
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc /reference:Newtonsoft.Json.Net20.dll,ServiceStack.dll,ServiceStack.Interfaces.dll,ServiceStack.ServiceInterface.dll /out:send_shmqry.exe send_shmqry.cs

Redis 기본 자료 구조 및 명령어

Strings

일반적으로 사용되는 Key - Value의 형식을 가지는 자료구조입니다. 
key와 value의 관계는 1 : 1이 됩니다.

기본 명령어 - get, set, del

get key - key에 해당하는 value를 가져옵니다.
set key value - key에 value를 저장합니다.
del key - key를 삭제합니다.

List

Redis Collection 중 하나인 List입니다. 
List는 redis Strings의 묶음 자료구조입니다. 
Last 또는 First에 삽입, 삭제가 가능합니다. 
Redis는 List의 자료구조로 Quick List를 사용한다고 합니다. 
Quick List의 자세한 내용은 문서를 참고해주세요.

기본 명령어 - lpush, rpush, lpop, rpop, lrange

lpush key value - List의 index 0 쪽으로 데이터를 넣습니다. ( redis의 list index는 0부터 시작합니다.)
rpush key value - List의 index last 쪽으로 데이터를 넣습니다.
lrange key start end - List의 start부터 end까지의 element를 반환합니다.
lpop key - List의 index 0의 데이터를 뺍니다.
rpop key - List의 index last의 데이터를 뺍니다.

#기본적으로, push는 데이타를 입력하는것이고, pop은 데이타를 빼는것이다.
#pop은 데이타를 빼는것이며, 빼어낸 데이타는 LIST에서 사라지게 될것이다.

+ Recent posts