Redis는 데이터베이스, 캐시 및 메시지 브로커로 사용되며, 메모리에 데이터를 저장하지만 파일에 데이터를 영구적으로 저장하도록 구성할 수도 있습니다.
C#에서 Redis를 사용하려면 StackExchange.Redis 라이브러리를 활용할 수 있습니다.
Redis의 데이터 영구성은 두 가지 주요 메커니즘으로 지원됩니다:
- RDB 스냅샷: 특정 간격마다 데이터를 디스크에 저장.
- 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. 예제 실행 순서
- Redis 서버가 실행 중인지 확인하고, RDB/AOF 설정을 활성화합니다.
- 위 코드를 실행하여 데이터를 Redis에 저장하고 SAVE 명령으로 디스크에 기록합니다.
- Redis 서버를 재시작한 뒤 데이터를 다시 읽어와 복원되었는지 확인합니다.
4. 참고 사항
- server.Save(SaveType.Foreground)는 Redis 서버의 데이터를 디스크에 저장하도록 강제로 트리거합니다. (RDB 방식)
- AOF 방식은 데이터 변경 시 자동으로 기록되며, 이를 코드에서 명시적으로 호출할 필요는 없습니다.
- 복구된 데이터를 확인하려면 Redis 서버를 종료한 후 재시작하고, 기존 데이터를 읽어옵니다.
Redis의 영구성 설정과 StackExchange.Redis 라이브러리를 조합하면 안정적으로 데이터를 저장하고 복원할 수 있습니다.
1. 패키지 설치
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. 예제 출력
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 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. 코드 설명
- Redis 데이터 저장
- StringSetAsync와 HashSetAsync를 사용하여 데이터를 Redis에 저장합니다.
- JSON으로 직렬화
- Redis에서 데이터를 가져온 뒤 JsonConvert.SerializeObject를 사용하여 JSON으로 직렬화합니다.
- 파일로 저장
- File.WriteAllTextAsync를 사용하여 JSON 데이터를 파일에 저장합니다.
- 파일에서 읽기 및 복원
- File.ReadAllTextAsync로 JSON 데이터를 읽어온 뒤, 이를 JsonConvert.DeserializeObject로 다시 역직렬화하여 객체로 변환합니다.
- 데이터를 Redis에 복원합니다.
4. 예제 실행 결과
Redis에 저장된 데이터:
파일에 저장된 JSON:
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: RDB 스냅샷 파일명 (예: mycustomfile.rdb)
- dir: 파일이 저장될 디렉토리 경로
AOF(Append-Only File) 파일명 지정
AOF 방식은 모든 쓰기 작업을 로그 파일로 기록합니다:
2. 명령줄에서 파일명 지정
Redis 서버를 실행할 때 명령줄에서 파일명을 지정할 수도 있습니다:
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 데이터 디렉토리에 복사하고 다시 시작합니다:
AOF 복원
- Redis 서버를 종료한 뒤, AOF 파일을 지정된 디렉토리에 복사하고 다시 시작합니다:
5. 중요 참고사항
- Redis 서버 설정에서 지정한 파일명은 자동으로 사용되며,
코드에서 Redis 데이터를 백업하거나 복원할 때 파일명을 명시적으로 지정해야 합니다. - RDB와 AOF는 각각 장단점이 있으므로, 필요에 따라 둘 중 하나를 선택하거나 둘 다 활성화할 수 있습니다.
Redis 서버 설정 및 백업/복원 스크립트를 적절히 활용하면 특정 파일명을 이용한 데이터 관리가 가능합니다.
Caution) 중요한 데이타의 경우에 Redis 서버 설정 및 백업/복원 스크립트 작성해서, ReBoot시에 대비한다.
'REDIS' 카테고리의 다른 글
ServiceStack의 Redis 요청에 대한 무료 할당량을 초과(6000 Redis requests per hour) (0) | 2025.01.11 |
---|---|
REDIS 데이터 영구화를 위한 옵션(코드에서 사용자가 지정한 파일명과 별도임) (0) | 2025.01.09 |
Redis에서 시스템에서 사용할 수 있는 최대 메모리를 확인 (0) | 2025.01.04 |
Redis에 할당된 전체 메모리 용량을 확인 (0) | 2025.01.04 |
Redis에서 각 키에 해당하는 데이터 유형을 확인/리스트의 크기 (0) | 2025.01.04 |