您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

Go Redis客户端使用的方法有哪些

2024/4/24 4:43:04发布4次查看
介绍go-redis和redigo底层是通过调用的万能 do 方法实现, 但是
redigo:
由于输入是万能类型所以必须记住每个命令的参数和返回值情况, 使用起来非常的不友好,
参数类型是万能类型导致在编译阶段无法检查参数类型,
每个命令都需要花时间记录使用方法,参数个数等,使用成本高;
go-redis:
细化了每个redis每个命令的功能, 我们只需记住命令,具体的用法直接查看接口的申请就可以了,使用成本低;
其次它对数据类型按照redis底层的类型进行统一,编译时就可以帮助检查参数类型
并且它的响应统一采用 result 的接口返回,确保了返回参数类型的正确性,对用户更加友好;
性能对比benchmarkredis/redigo_client_benchmark-12 31406 36919 ns/opbenchmarkredis/go-redis_client_benchmark-12 29977 38152 ns/opbenchmarkredis/redigo_client_benchmark-12 27928 39923 ns/opbenchmarkredis/go-redis_client_benchmark-12 27127 46451 ns/op
从上图可以看出, go-redis虽然每次操作会比redigo慢10%左右, 但是redigo需要显示申请/关闭连接,所以总体上二者的性能差异其实不大
redigo库redigo 是redis数据库的go客户端, 操作redis基本和commands一样. redigo命令基本都是通过do方法来实现的.
do(ctx context.context, cmd string, args ...interface{}) (interface{}, error)
虽然调用do函数万能参数可以实现所有的功能,但是使用起来非常的不友好,参数类型是万能类型,所以在编译阶段无法检查参数类型, 其次每个命令都需要花时间记录使用方法,参数个数等,使用成本高;
演示演示基本的连接池建立, ping, string操作, hash操作, list操作, expire等操作
package mainimport ( "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提供了三种对应服务端的客户端模式,集群,哨兵,和单机模式,三种模式在连接池这一块都是公用的, 同时还提供了灵活的hook机制, 其底层实际也是调用的万能 do 方法.
但go-redis细化了每个redis每个命令的功能, 我们只需记住命令,具体的用法直接查看接口的申请就可以了,使用成本低;其次它对数据类型按照redis底层的类型进行统一,编译时就可以帮助检查参数类型, 并且它的响应统一采用 result 的接口返回,确保了返回参数类型的正确性,对用户更加友好;
演示演示基本的连接池建立, ping, string操作, hash操作, list操作, expire等操作
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 mainimport ( "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 = &amp;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( &amp;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/redigo_client_benchmark-12                26386         39110 ns/op
benchmarkredis/go-redis_client_benchmark
benchmarkredis/go-redis_client_benchmark-12              28186         37794 ns/op
以上就是go redis客户端使用的方法有哪些的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录