본문 바로가기
프로그래밍

👨‍💻 [Go] Go 에서 Redis (레디스) 와 연동하려면, 어떤 모듈을 사용하는 것이 가장 효율적인가요?

by 밝음의기둥 2025. 1. 24.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

Go 에서 Redis (레디스) 와 연동하려면, 어떤 모듈을 사용하는 것이 가장 효율적인지 간략히 알아보았습니다.


질문 >

Go 에서 Redis (레디스) 와 연동하려면, 어떤 모듈을 사용하는 것이 가장 효율적인가요?

답변 >

Go에서 Redis와 연동하려면, 효율적이고 널리 사용되는 라이브러리를 선택하는 것이 중요합니다. Go 생태계에서 가장 인기 있고 강력한 Redis 클라이언트 라이브러리 중 하나는 go-redis입니다.


1. go-redis

go-redis는 기능이 풍부하고, 성능이 뛰어나며, Redis의 다양한 기능을 지원하는 Go용 클라이언트입니다.

주요 특징:

  • Redis의 기본 데이터 타입 지원.
  • Pub/Sub, 트랜잭션, 파이프라인, Lua 스크립트 지원.
  • Redis Sentinel 및 Redis Cluster 지원.
  • 자동 재시도와 연결 풀 관리.

설치:

go-redis를 설치하려면, 아래 명령어를 실행하세요.

go get github.com/redis/go-redis/v9

사용 예제:

package main

import (
    "context"
    "fmt"
    "github.com/redis/go-redis/v9"
)

func main() {
    // Redis 클라이언트 생성
    rdb := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379", // Redis 서버 주소
        Password: "",               // 비밀번호 (설정된 경우)
        DB:       0,                // 기본 DB
    })

    ctx := context.Background()

    // 데이터 설정
    err := rdb.Set(ctx, "key", "value", 0).Err()
    if err != nil {
        panic(err)
    }

    // 데이터 가져오기
    val, err := rdb.Get(ctx, "key").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("key:", val)

    // 존재하지 않는 키 가져오기
    val2, err := rdb.Get(ctx, "missing_key").Result()
    if err == redis.Nil {
        fmt.Println("missing_key does not exist")
    } else if err != nil {
        panic(err)
    } else {
        fmt.Println("missing_key:", val2)
    }
}


2. Redis Cluster 사용

Redis Cluster 환경에서는 ClusterOptions를 사용해 클라이언트를 설정합니다.

package main

import (
    "context"
    "fmt"
    "github.com/redis/go-redis/v9"
)

func main() {
    // Redis Cluster 클라이언트 생성
    rdb := redis.NewClusterClient(&redis.ClusterOptions{
        Addrs: []string{
            "127.0.0.1:7000",
            "127.0.0.1:7001",
            "127.0.0.1:7002",
        },
    })

    ctx := context.Background()

    // Cluster에서 데이터 설정 및 가져오기
    err := rdb.Set(ctx, "cluster_key", "cluster_value", 0).Err()
    if err != nil {
        panic(err)
    }

    val, err := rdb.Get(ctx, "cluster_key").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("cluster_key:", val)
}


3. go-redis의 고급 기능

  • Pub/Sub: Redis의 Pub/Sub 메커니즘을 활용해 메시징 시스템을 구현할 수 있습니다.
pubsub := rdb.Subscribe(ctx, "channel1")
defer pubsub.Close()

ch := pubsub.Channel()

// 메시지 수신
go func() {
    for msg := range ch {
        fmt.Println(msg.Channel, msg.Payload)
    }
}()

// 메시지 발행
err := rdb.Publish(ctx, "channel1", "Hello, Redis!").Err()
if err != nil {
    panic(err)
}

  • 파이프라인: 여러 명령어를 한 번에 처리하여 성능을 향상시킬 수 있습니다.
_, err := rdb.Pipelined(ctx, func(pipe redis.Pipeliner) error {
    pipe.Set(ctx, "key1", "value1", 0)
    pipe.Set(ctx, "key2", "value2", 0)
    return nil
})
if err != nil {
    panic(err)
}

  • Lua 스크립트: 복잡한 로직을 Redis에서 실행할 수 있습니다.
script := redis.NewScript(`
    return redis.call("SET", KEYS[1], ARGV[1])
`)
_, err := script.Run(ctx, rdb, []string{"key"}, "value").Result()
if err != nil {
    panic(err)
}


4. 다른 Redis 클라이언트

다양한 Redis 클라이언트가 있지만, go-redis가 가장 널리 사용됩니다. 다른 클라이언트는 다음과 같습니다:


5. 선택 기준

클라이언트  주요 특징
go-redis 풍부한 기능, 성능 최적화, 유지 보수 활발. 대부분의 프로젝트에 적합.
redigo 경량 클라이언트, 간단한 사용. 그러나 최근 유지 보수가 부족함.
radix 고성능 및 병렬 처리 지원. 복잡한 Redis 환경(예: Cluster)에 적합.

6. 결론

Redis와 Go를 연동하려면 go-redis를 사용하는 것이 가장 효율적입니다. 이 라이브러리는 풍부한 기능을 제공하며, Redis의 거의 모든 기능을 지원합니다. 프로젝트 규모와 요구 사항에 따라 적합한 클라이언트를 선택하세요.



🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형