Do(ctx context.Context, cmd string, args ...interface{}) (interface{}, error)
Do(ctx context.Context, cmd string, args ...interface{}) (interface{}, error)
Apakah kaedah yang digunakan oleh pelanggan Go Redis?
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 - 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 besarPustaka Redigo
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
Do(ctx context.Context, cmd string, args ...interface{}) (interface{}, error)
Salin selepas log masuk
Pengenalan dan penggunaan komponen go-redisgo -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. Do(ctx context.Context, cmd string, args ...interface{}) (interface{}, error)
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
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()) } }
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())
}
}
Salin selepas log masukKeluaran hasil
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()) } }
goos: darwingoarch: amd64
BenchmarkRedis
BenchmarkRedis/redigo_client_Benchmark-1 Tanda Aras 26386 39110 ns/opBenchmarkRedis/go-redis_client_Benchmark
BenchmarkRedis/go-redis_client_Ben chmark-12 28186 37794 ns/opAtas ialah kandungan terperinci Apakah kaedah yang digunakan oleh pelanggan Go Redis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Dalam Go, mesej WebSocket boleh dihantar menggunakan pakej gorila/soket web. Langkah khusus: Wujudkan sambungan WebSocket. Hantar mesej teks: Panggil WriteMessage(websocket.TextMessage,[]bait("Mesej")). Hantar mesej binari: panggil WriteMessage(websocket.BinaryMessage,[]bait{1,2,3}).

Kebocoran memori boleh menyebabkan memori program Go terus meningkat dengan: menutup sumber yang tidak lagi digunakan, seperti fail, sambungan rangkaian dan sambungan pangkalan data. Gunakan rujukan yang lemah untuk mengelakkan kebocoran memori dan objek sasaran untuk pengumpulan sampah apabila ia tidak lagi dirujuk dengan kuat. Menggunakan go coroutine, memori tindanan coroutine akan dikeluarkan secara automatik apabila keluar untuk mengelakkan kebocoran memori.

Dalam pembangunan PHP, mekanisme caching meningkatkan prestasi dengan menyimpan sementara data yang kerap diakses dalam memori atau cakera, dengan itu mengurangkan bilangan akses pangkalan data. Jenis cache terutamanya termasuk memori, fail dan cache pangkalan data. Caching boleh dilaksanakan dalam PHP menggunakan fungsi terbina dalam atau perpustakaan pihak ketiga, seperti cache_get() dan Memcache. Aplikasi praktikal biasa termasuk caching hasil pertanyaan pangkalan data untuk mengoptimumkan prestasi pertanyaan dan caching halaman output untuk mempercepatkan pemaparan. Mekanisme caching berkesan meningkatkan kelajuan tindak balas laman web, meningkatkan pengalaman pengguna dan mengurangkan beban pelayan.

Dalam Go, anda boleh menggunakan ungkapan biasa untuk memadankan cap masa: susun rentetan ungkapan biasa, seperti yang digunakan untuk memadankan cap masa ISO8601: ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ . Gunakan fungsi regexp.MatchString untuk menyemak sama ada rentetan sepadan dengan ungkapan biasa.

Bahasa Go dan Go adalah entiti yang berbeza dengan ciri yang berbeza. Go (juga dikenali sebagai Golang) terkenal dengan kesesuaiannya, kelajuan penyusunan pantas, pengurusan memori dan kelebihan merentas platform. Kelemahan bahasa Go termasuk ekosistem yang kurang kaya berbanding bahasa lain, sintaks yang lebih ketat dan kekurangan penaipan dinamik.

Menulis dokumentasi yang jelas dan komprehensif adalah penting untuk rangka kerja Golang. Amalan terbaik termasuk mengikut gaya dokumentasi yang ditetapkan, seperti Panduan Gaya Pengekodan Google. Gunakan struktur organisasi yang jelas, termasuk tajuk, subtajuk dan senarai, serta sediakan navigasi. Menyediakan maklumat yang komprehensif dan tepat, termasuk panduan permulaan, rujukan API dan konsep. Gunakan contoh kod untuk menggambarkan konsep dan penggunaan. Pastikan dokumentasi dikemas kini, jejak perubahan dan dokumen ciri baharu. Sediakan sokongan dan sumber komuniti seperti isu dan forum GitHub. Buat contoh praktikal, seperti dokumentasi API.

Cara mengintegrasikan GoWebSocket dengan pangkalan data: Sediakan sambungan pangkalan data: Gunakan pakej pangkalan data/sql untuk menyambung ke pangkalan data. Simpan mesej WebSocket ke pangkalan data: Gunakan pernyataan INSERT untuk memasukkan mesej ke dalam pangkalan data. Dapatkan semula mesej WebSocket daripada pangkalan data: Gunakan pernyataan SELECT untuk mendapatkan semula mesej daripada pangkalan data.

Terdapat dua langkah untuk mencipta Goroutine keutamaan dalam bahasa Go: mendaftarkan fungsi penciptaan Goroutine tersuai (langkah 1) dan menentukan nilai keutamaan (langkah 2). Dengan cara ini, anda boleh mencipta Goroutine dengan keutamaan yang berbeza, mengoptimumkan peruntukan sumber dan meningkatkan kecekapan pelaksanaan.
