Client programming c#

이번에는 redis의 sentinel을 client에서 사용하는 방법을 알아보겠습니다.

redis standalone 사용하기

cd standalone
docker-compose up -d

내 컴퓨터에 6379 포트로 redis가 실행되었습니다.

이제 c# 코드를 만들어 보자.

https://redis.io/docs/connect/clients/dotnet/ 참고한다.

dotnet add package NRedisStack
using Microsoft.AspNetCore.Mvc;
using NRedisStack;
using NRedisStack.RedisStackCommands;
using StackExchange.Redis;

namespace ThreadTest.Controllers;

[ApiController]
[Route("values")]
public class ValuesController : ControllerBase
{
    private readonly ILogger<ValuesController> _logger;

    public ValuesController(ILogger<ValuesController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public OkResult Get()
    {
        ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
        IDatabase db = redis.GetDatabase();

        System.Console.WriteLine(db.Database.ToString());

        db.StringSet("foo", "bar");
        Console.WriteLine(db.StringGet("foo")); // prints bar


        return Ok();
    }
}
...

curl http://localhost:5007/value

![alt text](images/sentinel-client/image.png)

bar를 찍는걸 볼수있다 로컬에 있는 레디스에 저장이 되고 그 값을 가져온것이다.

cli로 확인해보자.

```sh
docker run -it --rm bitnami/redis:7.2 redis-cli -h host.docker.internal -p 6379

get foo
alt text

결과가 잘 나온다.

foreach (EndPoint endpoint in redis.GetEndPoints())
{
    Console.WriteLine(endpoint.ToString());
}

이 코드를 추가해서 실행해보자.

alt text
Unspecified/localhost:6379

이라는 결과가 나온다.

redis replica(main-secondary) 사용하기

cd replica-multi-node
docker-compose up -d
docker ps
alt text
name
port

main

6379

secondary-1

6380

secondary-2

6381

모든 노드를 ,로 구분해서 넣어주면 된다.

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379,localhost:6380,localhost:6381");
if (redis == null) return Ok();
if (!redis.IsConnected) return Ok();

IDatabase db = redis.GetDatabase(); //database 0 을 사용한다.

Console.WriteLine(db.Database.ToString());

db.StringSet("foo1", "bar1");

Console.WriteLine(db.StringGet("foo")); // prints bar

자동으로 master를 알아내서 그곳에다 데이터를 입력시켜준다. 읽기는 자동으로 secondary에서 읽어온다.

alt text

database는 0번이고 값은 bar이고 endpoint는 localhost:6379이다.

replica에서 확인해보자.

docker run -it --rm bitnami/redis:7.2 redis-cli -h host.docker.internal -p 6380
alt text

replica에서도 값이 잘 입력되있다.

db를 선택하지

  • 레디스 서버는 여러개의 데이터베이스를 가질 수 있다.

  • 기본 값은 16이다.

  • DB 번호 0부터 15까지 16개의 데이터베이스를 갖는다.

  • 확인하는법

CONFIG GET databases
INFO keyspace
alt text

데이터베이스를 선택하는 방법

SELECT 1

code에서 db를 선택하는 방법

IDatabase db = redis.GetDatabase(); // 0번을 리턴

// 1번을 사용하려면
IDatabase db = redis.GetDatabase(1); //database 1 을 사용한다.

redis sentinel 사용하기

cd sentinel
docker-compose up -d

sentinel은 service name이라는 것이 있다 확인해보자.

docker run -it --rm bitnami/redis-sentinel:7.2 redis-cli -h host.docker.internal -p 26379
info sentinel
> master0:name=mymaster,status=ok,address=172.30.0.2:6379,slaves=4,sentinels=3
alt text

mymaster가 이름이다.

connection string에 서비스 이름을 지정하면 sentinel 모드가 실행

var sentinelConfig = new ConfigurationOptions
{
    AllowAdmin = false,
    AbortOnConnectFail = false,
    CommandMap = CommandMap.Sentinel,
    EndPoints =
        {
            "host.docker.internal:26379",
            "host.docker.internal:26380",
            "host.docker.internal:26381"
        },
};

var masterConfig = new ConfigurationOptions
{
    CommandMap = CommandMap.Default,
    ServiceName = "mymaster",
};

var redis = ConnectionMultiplexer.SentinelConnect(sentinelConfig, Console.Out);

var conn = redis.GetSentinelMasterConnection(masterConfig, Console.Out);
var db = conn.GetDatabase(0);

db.StringSet("foo2", "bar2");

Console.WriteLine(db.StringGet("foo")); // prints bar

redis.Close();
alt text

동작한다.

redis cluster 사용하기

string connectString = "host.docker.internal:6371,host.docker.internal:6372,host.docker.internal:6373,host.docker.internal:6374,host.docker.internal:6375,host.docker.internal:6379";
var options = ConfigurationOptions.Parse(connectString);
var redisCluster = ConnectionMultiplexer.Connect(options);

IDatabase db = redisCluster.GetDatabase();
db.StringSet("foo3", "bar3");

Console.WriteLine(db.StringGet("foo3")); // prints bar3
redisCluster.Close();

이렇게 하면 동작한다.

todo

  • 일반적으로 이렇게 코딩하는데 이러면 connection을 매번 맺는다. 문제가 된다.

  • 꼭 Async를 사용하기 바란다.

참고

connection string에 쓸수 있는 추가 옵션들

https://stackexchange.github.io/StackExchange.Redis/Configuration#configuration-options

Last updated

Was this helpful?