>  기사  >  데이터 베이스  >  Go Redis 클라이언트는 어떤 방법을 사용하나요?

Go Redis 클라이언트는 어떤 방법을 사용하나요?

WBOY
WBOY앞으로
2023-06-03 09:01:38997검색

    소개

    go-redis, redigo의 하위 레이어는 범용 Do 메소드를 호출하여 구현하지만

    redigo:

    • 입력이 범용 타입이므로 매개변수를 기억하고 반환해야 합니다.

    • 매개변수 유형은 범용 유형이므로 컴파일 단계에서 매개변수 유형을 확인할 수 없습니다.

    • 각 명령마다 사용법을 기록하는 데 시간이 걸립니다. 메소드, 매개변수 수 등이 많고 사용 비용이 높습니다.

    go-redis:

    • 각 redis 명령의 기능을 자세히 설명하고 있으며, 명령만 기억하고 인터페이스 애플리케이션을 직접 확인하면 됩니다. 특정 용도의 경우 사용 비용이 낮습니다.

    • 두 번째로 기본 Redis 유형에 따라 데이터 유형을 통합하므로 컴파일 중에 매개변수 유형을 확인하는 데 도움이 됩니다.

    • 그리고 해당 응답은 다음을 사용하여 균일하게 반환됩니다. Result 인터페이스는 반환된 매개변수 유형의 정확성을 보장하고 더욱 사용자 친화적으로 만듭니다. ;

    성능 비교

    BenchmarkRedis/redigo_client_Benchmark-12     31406	     36919 ns/op
    BenchmarkRedis/go-redis_client_Benchmark-12   29977	     38152 ns/op
    BenchmarkRedis/redigo_client_Benchmark-12     27928	     39923 ns/op
    BenchmarkRedis/go-redis_client_Benchmark-12   27127	     46451 ns/op

    위 그림에서 볼 수 있듯이 go-redis는 redigo보다 약 10% 느리지만 각 작업에서 Redigo는 애플리케이션/닫는 연결을 표시해야 하므로 둘 사이의 전반적인 성능 차이는 실제로 작은

    Redigo 라이브러리

    redigo는 Redis 데이터베이스의 Go 클라이언트입니다. Redis를 작동하는 것은 기본적으로 명령과 동일합니다. Redigo 명령은 기본적으로 Do 메소드를 통해 구현됩니다.

    Do(ctx context.Context, cmd string, args ...interface{}) (interface{}, error)

    Do 함수를 호출하면 범용 매개변수가 모든 기능을 구현할 수 있지만, 사용하기에는 매우 불편한 매개변수 유형이므로 실행 중에는 매개변수 유형을 확인할 수 없습니다. 둘째, 각 명령은 사용 방법, 매개 변수 수 등을 기록하는 데 시간이 필요하므로 사용 비용이 많이 듭니다.

    데모

    기본 연결 풀 설정, 핑, 문자열 작업, 해시 작업, 목록 작업을 보여줍니다. 만료 및 기타 작업

    package main
    import (
       "fmt"
       "github.com/gomodule/redigo/redis"
    )
    func main() {
       // 新建一个连接池
       var pool *redis.Pool
       pool = &redis.Pool{
          MaxIdle:     10,  //最初的连接数量
          MaxActive:   0,   //连接池最大连接数量,(0表示自动定义),按需分配
          IdleTimeout: 300, //连接关闭时间 300秒 (300秒不使用自动关闭)
          Dial: func() (redis.Conn, error) { //要连接的redis数据库
             return redis.Dial("tcp", "localhost:6379")
          },
       }
       conn := pool.Get() //从连接池,取一个链接
       defer conn.Close()
       // 0. ping正常返回pong, 异常res is nil, err not nil
       res, err := conn.Do("ping")
       fmt.Printf("ping res=%v\n", res)
       if err != nil {
          fmt.Printf("ping err=%v\n", err.Error())
       }
       // string操作
       // set
       res, err = conn.Do("set", "name", "测试001")
       fmt.Printf("set res=%v\n", res)
       if err != nil {
          fmt.Printf("set err=%v\n", err.Error())
       }
       // get
       res, err = redis.String(conn.Do("get", "name"))
       fmt.Printf("get res=%v\n", res)
       if err != nil {
          fmt.Printf("get err=%v\n", err.Error())
       }
       // MSet   MGet
       res, err = conn.Do("MSet", "name", "测试001", "age", 18)
       fmt.Printf("MSet res=%v\n", res)
       if err != nil {
          fmt.Printf("MSet err=%v\n", err.Error())
       }
       r, err := redis.Strings(conn.Do("MGet", "name", "age"))
       fmt.Printf("MGet res=%v\n", r)
       if err != nil {
          fmt.Printf("MGet err=%v\n", err.Error())
       }
       // expire
       res, err = conn.Do("expire", "name", 5)
       fmt.Printf("expire res=%v\n", r)
       if err != nil {
          fmt.Printf("expire err=%v\n", err.Error())
       }
       // list操作
       // lpush lpop
       res, err = conn.Do("lpush", "hobby", "篮球", "足球", "乒乓球")
       fmt.Printf("lpush res=%v\n", r)
       if err != nil {
          fmt.Printf("lpush err=%v\n", err.Error())
       }
       // lpop
       rs, er := conn.Do("lpop", "hobby")
       fmt.Printf("lpop res=%v\n", rs)
       if er != nil {
          fmt.Printf("lpop err=%v\n", er.Error())
       }
       // hash 操作
       // hset
       res, err = conn.Do("HSet", "userinfo", "name", "lqz")
       fmt.Printf("HSet res=%v\n", r)
       if err != nil {
          fmt.Printf("HSet err=%v\n", err.Error())
       }
       // hget
       r4, er4 := conn.Do("HGet", "userinfo", "name")
       fmt.Printf("HGet res=%v\n", r4)
       if er4 != nil {
          fmt.Printf("HGet err=%v\n", er4.Error())
       }
    }

    go-redis 구성 요소 소개 및 사용

    go-redis는 서버, 클러스터 및 센티널에 해당하는 세 가지 클라이언트 모드와 독립형 모드를 제공하며 세 가지 모드는 연결 풀에서 공통이며, 또한 유연한 후크 메커니즘을 제공하며 그 맨 아래 레이어는 실제로

    Go Redis 클라이언트는 어떤 방법을 사용하나요?

    라고 합니다. 하지만 go-redis는 각 redis 명령의 기능만 기억하면 됩니다. 인터페이스의 적용을 확인하십시오. 둘째, 기본 유형의 redis에 따라 데이터 유형을 통합하여 컴파일 중에 매개변수 유형을 확인하는 데 도움이 되며 해당 응답은 Result 인터페이스를 사용하여 균일하게 반환됩니다. 반환된 매개변수 유형의 정확성을 보장하고 더욱 사용자 친화적입니다.

    데모

    기본 연결 풀 설정, 핑, 문자열 작업, 해시 작업, 목록 작업, 만료 및 기타 작업을 보여줍니다.

    func main() {
       var rdb = redis2.NewClient(
          &redis2.Options{
             Addr:     "localhost:6379",
             Password: "", DB: 1,
             MinIdleConns: 1,
             PoolSize:     1000,
          })
       ctx := context.Background()
       res, err = rdb.Ping(ctx).Result()
       fmt.Printf("ping res=%v\n", res)
       if err != nil {
          fmt.Printf("ping err=%v\n", err.Error())
       }
       // string操作
       // set
       res, err = rdb.Set(ctx, "name", "测试001", 0).Result()
       fmt.Printf("set res=%v\n", res)
       if err != nil {
          fmt.Printf("set err=%v\n", err.Error())
       }
       // get
       res, err = rdb.Get(ctx, "name").Result()
       fmt.Printf("get res=%v\n", res)
       if err != nil {
          fmt.Printf("get err=%v\n", err.Error())
       }
       // MSet   MGet
       res, err = rdb.MSet(ctx, "name", "测试001", "age", "18").Result()
       fmt.Printf("MSet res=%v\n", res)
       if err != nil {
          fmt.Printf("MSet err=%v\n", err.Error())
       }
       var ret []interface{}
       ret, err = rdb.MGet(ctx, "name", "age").Result()
       fmt.Printf("MGet res=%v\n", ret)
       if err != nil {
          fmt.Printf("MGet err=%v\n", err.Error())
       }
       // expire
       res, err = rdb.Expire(ctx, "name", time.Second).Result()
       fmt.Printf("expire res=%v\n", res)
       if err != nil {
          fmt.Printf("expire err=%v\n", err.Error())
       }
       // list操作
       // lpush lpop
       res, err = rdb.LPush(ctx, "hobby", "篮球", "足球", "乒乓球").Result()
       fmt.Printf("lpush res=%v\n", res)
       if err != nil {
          fmt.Printf("lpush err=%v\n", err.Error())
       }
       // lpop
       rs, err = rdb.LPop(ctx, "hobby").Result()
       fmt.Printf("lpop res=%v\n", rs)
       if er != nil {
          fmt.Printf("lpop err=%v\n", er.Error())
       }
       // hash 操作
       // hset
       res, err = rdb.HSet(ctx, "userinfo", "name", "lqz").Result()
       fmt.Printf("HSet res=%v\n", r)
       if err != nil {
          fmt.Printf("HSet err=%v\n", err.Error())
       }
       // hget
       r4, er4 = rdb.HGet(ctx, "userinfo", "name").Result()
       fmt.Printf("HGet res=%v\n", r4)
       if er4 != nil {
          fmt.Printf("HGet err=%v\n", er4.Error())
       }
    }

    성능 테스트

    package main
    import (
       "context"
       redis2 "github.com/go-redis/redis/v8"
       "github.com/gomodule/redigo/redis"
       "testing"
       "time"
    )
    func BenchmarkRedis(b *testing.B) {
       // 新建一个连接池
       var pool *redis.Pool
       pool = &redis.Pool{
          MaxIdle:     10,   //最初的连接数量
          MaxActive:   1000, //连接池最大连接数量,(0表示自动定义),按需分配
          IdleTimeout: 300,  //连接关闭时间 300秒 (300秒不使用自动关闭)
          Dial: func() (redis.Conn, error) { //要连接的redis数据库
             return redis.Dial("tcp", "localhost:6379")
          },
       }
       var rdb = redis2.NewClient(
          &redis2.Options{
             Addr:         "localhost:6379",
             Password:     "",
             MinIdleConns: 10,
             PoolSize:     1000,
          })
       b.Run("redigo client Benchmark", func(b *testing.B) {
    		for j := 0; j < b.N; j++ {
    			conn := pool.Get() //从连接池,取一个链接
    			conn.Do("set", time.Now().String(), 10000, time.Second)
    			conn.Do("get", time.Now().String())
    			conn.Close()
    		}
    	})
    	ctx := context.Background()
    	b.Run("go-redis client Benchmark", func(b *testing.B) {
    		for j := 0; j < b.N; j++ {
    			rdb.Set(ctx,  time.Now().String(), 1000, time.Second)
    			rdb.Get(ctx,  time.Now().String())
    		}
    	})
    }

    결과 출력

    goos: darwin
    goarch: amd64
    cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
    BenchmarkRedis
    BenchmarkRedis/redigo_client_Benchmark
    BenchmarkRedis /redis_client_Benchmark-12 37794 ns/op

    위 내용은 Go Redis 클라이언트는 어떤 방법을 사용하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제