StackExchange.Redis 범용 Set/Get 쓰기 및 읽기
- 내부에서
IDatabase.StringSet()를 호출하여 Redis 문자열 타입 데이터를 저장합니다 - 직렬화 규칙:임의 객체 → JSON 문자열 → UTF8 바이트 배열로 Redis에 저장
- 역직렬화 규칙:바이트 배열 읽기 → JSON 문자열 → 제네릭 대상 객체
- 반환값:
true= 설정 성공,false= 설정 실패
가져와야 하는 네임스페이스
using StackExchange.Redis;
using Newtonsoft.Json;
using System.Text;Code language: CSS (css)
아래 예제는 Set에 키, 바이트 배열, 만료 시간을 전달하여 사용합니다.
/// <summary>
/// Redis 캐시에 쓰기
/// </summary>
/// <param name="key">캐시 키</param>
/// <param name="data">임의 객체</param>
/// <param name="cacheTime">만료 시간【분】</param>
/// <returns>true 성공 / false 실패</returns>
private bool Set(string key, object data, int cacheTime)
{
if (data == null)
{
return false;
}
byte[] entryBytes = Serialize(data);
TimeSpan expiresIn = TimeSpan.FromMinutes(cacheTime);
return db.StringSet(key, entryBytes, expiresIn);
}
/// <summary>
/// 객체 직렬화:object → byte[]
/// </summary>
private byte[] Serialize(object data)
{
string json = JsonConvert.SerializeObject(data);
return Encoding.UTF8.GetBytes(json);
}
/// <summary>
/// 키로 캐시 읽어오기
/// </summary>
/// <typeparam name="T">대상 타입</typeparam>
/// <param name="key">캐시 키</param>
/// <returns>캐시가 없으면 default(T) 반환</returns>
public T Get<T>(string key)
{
RedisValue rValue = db.StringGet(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);
}
string json = Encoding.UTF8.GetString(serializedObject);
return JsonConvert.DeserializeObject<T>(json);
}Code language: PHP (php)
주의사항
- 시간 단위
코드의TimeSpan.FromMinutes(cacheTime)은 입력값 단위가【분】입니다
폼에서Set(key,val,1000)호출하면 1000분 뒤 만료 되며 초가 아닙니다!
이전 폼 예제에서
1000을 사용했는데 자주 실수하는 부분입니다.
초 단위를 사용하려면TimeSpan.FromSeconds(cacheTime)으로 수정하세요
- 의존 패키지 설치
NuGet에서 두 패키지를 모두 설치해야 합니다:
StackExchange.RedisNewtonsoft.Json
- 데이터 저장 형식
모든 객체는 JSON 바이너리로 변환되어 Redis에 저장되며 Redis 클라이언트에서는 표준 JSON 텍스트로 보입니다. RedisValue호환db.StringGet(key)는RedisValue를 반환하며byte[]로 암시적 변환이 가능하므로 바로Deserialize<T>에 전달할 수 있습니다.- 스레드 안전 권장사항
IConnectionMultiplexer는 전역 싱글톤으로 유지하고 Redis 읽고 쓸 때마다 새 연결을 만들지 마세요.
사용 예시
// 쓰기 (30분 만료)
bool ok = Set("user:1001", new {Id = 1001, Name = "test"}, 30);
// 읽기
var user = Get<dynamic>("user:1001");
// 모델 클래스 읽기 예시
// var model = Get<UserInfo>("user:1001");Code language: JavaScript (javascript)
권장 사항
Redis 연결 코드와 이 메서드들을 RedisHelper.cs 독립 정적 헬퍼 클래스로 분리하고 Form 폼 코드에 넣지 않아야 관심사 분리가 이루어집니다.
값 쓰기
Previous: Redis 연결하기