Redis 값 가져오기 Get
- 하위 API:
IDatabase.StringGet(key),Redis에서 문자열 타입 데이터를 읽으며 반환 타입은RedisValue RedisValue.HasValue:key 존재 여부와 데이터 유무 확인true:key가 존재함;false:key가 존재하지 않음
- 이진 데이터를 읽은 뒤 역직렬화를 진행해 원본 객체로 복원해야 합니다
- 존재하지 않으면
default(T)반환- 값 형식(int/DateTime):0, 최소 시간 반환
- 참조 형식(class):null 반환
예시
using StackExchange.Redis;
using Newtonsoft.Json;
using System.Text;
/// <summary>
/// Key로 캐시 객체 읽어오기
/// </summary>
/// <typeparam name="T">대상 객체 타입</typeparam>
/// <param name="key">캐시 키 이름</param>
/// <returns>존재하면 객체 반환, 없으면 default(T) 반환</returns>
public T Get<T>(string key)
{
// redis에서 데이터 읽기
RedisValue rValue = db.StringGet(key);
// key가 없는 경우 판단
if (!rValue.HasValue)
{
return default(T);
}
// 이진 데이터 역직렬화로 엔티티 복원
T result = Deserialize<T>(rValue);
return result;
}
/// <summary>
/// 역직렬화:byte[] → T 객체
/// </summary>
private T Deserialize<T>(byte[] serializedObject)
{
if (serializedObject == null)
{
return default(T);
}
// byte 배열을 json 문자열로 변환
string json = Encoding.UTF8.GetString(serializedObject);
// json을 대상 엔티티로 변환
return JsonConvert.DeserializeObject<T>(json);
}
/// <summary>
/// 객체 직렬화 메서드(Set과 짝지어 사용)
/// </summary>
private byte[] Serialize(object data)
{
string json = JsonConvert.SerializeObject(data);
return Encoding.UTF8.GetBytes(json);
}Code language: C# (cs)
유의사항
- 타입 암시적 변환
RedisValue는byte[]로 직접 암시 변환이 가능하므로rValue를 그대로Deserialize<T>(byte[])에 넘기면 컴파일러가 자동으로 처리합니다. - 읽기‑쓰기 짝지은 흐름
Set 쓰기 흐름:엔티티 → Serialize → byte[] → Redis
Get 읽기 흐름:Redis → byte[] → Deserialize → 엔티티Code language: CSS (css)
- 호출 예시
// 예시1:커스텀 엔티티 읽기
var user = Get<User>("user_1001");
// 예시2:단순 문자열 읽기
string text = Get<string>("msg");
// 예시3:숫자 읽기
int count = Get<int>("visit_count");Code language: C# (cs)
- 직렬화·역직렬화 타입 불일치
저장할 때User를 넣고 읽을 때Student로 받으면 Json 역직렬화 오류가 발생합니다. - default(T)로 인한 null 검사 누락 주의
var model = Get<User>("key");
// 참조 타입이 없으면 model=null 이므로 model.Name 직접 접근 시 null 참조 오류 발생
if(model != null)
{
}Code language: C# (cs)
- 인코딩 통일
쓰기와 읽기 모두Encoding.UTF8을 통일해서 사용해야 하며 그렇지 않으면 깨진 문자가 나타납니다.
값 가져오기