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는 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는 각 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!