코젤브

[Redis] C# ASP.NET Core - CloudStructures 본문

컴공의 일상/C#

[Redis] C# ASP.NET Core - CloudStructures

코딩하는 젤리 2024. 7. 19. 11:34

C# ASP.NET Core 에서 Redis는 어떻게 사용할까?

 

바로 CloudStructures 라이브러리를 사용하면 아주 쉽게 사용할 수 있다!! 

기존 StackExchange.Redis를 기반으로 만든 Redis client이다.

 

데이터 직렬화 관련해서 클래스나 구조체를 Redis에 저장 시 기본 Json 포맷으로 자동 직렬화해주기 때문에 편하다

 

CloudStructures 가 지원하는 Redis의 Data Structure는 아래와 같다 (모두 async)

 

 

 

NuGet에서 추가하면 된다.

 

아래처럼 using으로 사용하기

using CloudStructures.Structures;
using CloudStructures;

 

연결 객체 생성

private readonly RedisConnection _redisConn;

 

생성자 : DI를 통해 필요한 설정값과 객체를 주입받음

public MemoryDb(IOptions<DbConfig> dbConfig, ILogger<MemoryDb> logger)
{
    _logger = logger;
    // Redis 설정을 사용하여 Redis 연결 초기화
    RedisConfig config = new RedisConfig("default", dbConfig.Value.RedisGameDBConnection);
    _redisConn = new RedisConnection(config);
    _redisExpiryHours = dbConfig.Value.RedisExpiryHours;
}

- 나의 경우 logger를 사용해서 로깅설정까지 해주었다.

- dbconfig에 지정해둔 Redis의 주소와 포트번호를 가지고 연결하고 있다!

 

Redis에 클래스 형식으로 저장하는 메서드 예시

// 사용자 로그인 정보를 Redis에 저장하는 메서드
public async Task<bool> SaveUserLoginInfo(string userId, string token)
{
    var key = KeyGenerator.UserLogin(userId);  // 키 생성
    var loginInfo = new LoginInfo
    {
        UserId = userId,
        Token = token
    };

    var redis = new RedisString<PlayerLoginInfo>(_redisConn, key, TimeSpan.FromHours(2));
    bool result = await redis.SetAsync(playerLoginInfo);  // Redis에 데이터 저장
    if (result)
    {
        _logger.LogInformation("Successfully saved login info for UserId: {UserId}", userId);
    }
    else
    {
        _logger.LogWarning("Failed to save login info for UserId: {UserId}", userId);
    }
    return result;
}

- value 값을 내가 커스텀한 객체 형식으로 넣으면, json으로 만들어서 String 형식으로 Redis에 저장해준다! 정말 편하죠

- 또한 Redis에 저장할 때 꼭 3번째 인자에 만료 시간을 넣어줘야 한다!
(까먹으면 영원히 삭제되지 않아 Redis가 아파할수 있다.......)

위 코드에서는 매직넘버로 사용하고 있지만 상수화 시켜서 관리하는 것이 좋다!

 

SET 외에도 GET을 할 수 있는데 GET 예제는 아래와 같다.

 

Redis에서 데이터 조회하는 메서드

// Redis에서 게임 데이터를 조회하는 메서드
public async Task<byte[]> GetGameDataAsync(string key)
{
    try
    {
        var redisString = new RedisString<byte[]>(_redisConn, key, TimeSpan.FromMinutes(20)); // 조회할 때마다 만료 시간 갱신
        var result = await redisString.GetAsync();

        if (result.HasValue)
        {
            _logger.LogInformation("Successfully retrieved data for Key={Key}", key);
            return result.Value;
        }
        else
        {
            _logger.LogWarning("No data found for Key={Key}", key);
            return null;
        }
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Failed to retrieve data for Key={Key}", key);
        return null;
    }
}

- 이때 조회할 때도 만료시간을 정해야하는데 이 부분이 일반적으로 "데이터를 가져올 때 만료 시간을 갱신하는 역할"을 수행한다고 한다.

- 내가 코드를 작성할 때 만료시간을 작성하지 않으면 오류가 발생해서 생성 시간과 똑같이 작성했던 것 같다.

 

물론 데이터 삭제 함수도 있다 

redisString.DeleteAsync(); // 데이터 삭제

 

 

 

간편하게 Redis를 사용할 수 있어서 아주 좋다

더 많은 사용법은 공식 문서를 추천한다

[깃허브 공식문서] https://github.com/xin9le/CloudStructures

 

GitHub - xin9le/CloudStructures: Redis Client based on StackExchange.Redis.

Redis Client based on StackExchange.Redis. Contribute to xin9le/CloudStructures development by creating an account on GitHub.

github.com