Rumah  >  Artikel  >  pangkalan data  >  Apakah kaedah yang digunakan oleh pelanggan Go Redis?

Apakah kaedah yang digunakan oleh pelanggan Go Redis?

WBOY
WBOYke hadapan
2023-06-03 09:01:38998semak imbas

    Pengenalan

    Lapisan bawah go-redis dan redigo dilaksanakan dengan memanggil kaedah Do universal, tetapi

    redigo:

    • Memandangkan input adalah jenis universal, anda mesti mengingati parameter dan nilai pulangan setiap arahan, yang sangat tidak mesra untuk digunakan

    • Jenis parameter adalah universal. Jenis ini menjadikannya mustahil untuk menyemak jenis parameter semasa fasa kompilasi

    • Setiap arahan memerlukan masa untuk merekodkan kaedah penggunaan, bilangan parameter, dsb. ., yang mahal untuk digunakan;

    go-redis:

    • Memperhalusi fungsi setiap arahan redis perintah dan semak terus aplikasi antara muka untuk penggunaan khusus , kos penggunaan yang rendah; taip semasa penyusunan

    • Dan responsnya dikembalikan secara seragam menggunakan antara muka Hasil, memastikan ketepatan jenis parameter pulangan dan menjadi lebih mesra pengguna;

      Perbandingan prestasi
    • 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
    • Seperti yang dapat dilihat dari gambar di atas Dapat dilihat bahawa walaupun setiap operasi go-redis adalah kira-kira 10% lebih perlahan daripada redigo, redigo perlu memaparkan permintaan/tutup sambungan, jadi perbezaan prestasi keseluruhan antara kedua-duanya sebenarnya tidak besar

      Pustaka Redigo
    redigo ialah klien Go bagi pangkalan data Redis pada asasnya sama dengan arahan Redigo pada asasnya melalui kaedah Do peringkat penyusunan. Kedua, setiap arahan memerlukan masa untuk merekodkan kaedah penggunaan, bilangan parameter, dsb., yang mahal untuk digunakan; operasi rentetan, operasi cincang, operasi senarai, tamat tempoh dan operasi lain

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

    Pengenalan dan penggunaan komponen go-redis

    go -Redis menyediakan tiga mod klien yang sepadan dengan pelayan, kelompok, sentinel, dan mod bersendirian. Ketiga-tiga mod ini adalah biasa dalam kumpulan sambungan Ia juga menyediakan mekanisme Cangkuk yang fleksibel, dan lapisan asasnya sebenarnya universal dalam panggilan.

    Tetapi go-redis memperhalusi fungsi setiap arahan redis Kami hanya perlu mengingati arahan dan terus menyemak aplikasi antara muka untuk kegunaan tertentu Ya, kos penggunaannya adalah rendah jenis redis yang mendasari, yang boleh membantu menyemak jenis parameter semasa penyusunan, dan responsnya dikembalikan secara seragam menggunakan antara muka Hasil, memastikan ketepatan jenis parameter pulangan Lebih mesra pengguna Do

    Demonstrasi

    Menunjukkan penubuhan kumpulan sambungan asas, ping, operasi rentetan, operasi cincang, operasi senarai, tamat tempoh dan operasi lain

    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())
       }
    }

    Ujian prestasi

    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())
       }
    }

    Keluaran hasil

    goos: darwinApakah kaedah yang digunakan oleh pelanggan Go Redis?goarch: amd64

    cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz

    BenchmarkRedis

    BenchmarkRedis/redigo_client_Benchmark-1 Tanda Aras           26386 39110 ns/op

    BenchmarkRedis/go-redis_client_Benchmark

    BenchmarkRedis/go-redis_client_Ben chmark-12 28186 37794 ns/op

    Atas ialah kandungan terperinci Apakah kaedah yang digunakan oleh pelanggan Go Redis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam