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


    介绍

    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需要显示申请/关闭连接,所以总体上二者的性能差异其实不大

    Android数据格式解析对象JSON用法 WORD版 Android数据格式解析对象JSON用法 WORD版

    本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将J*a对象转成json格式的字符串,可以将json字符串转换成J*a。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

    Android数据格式解析对象JSON用法 WORD版 0 查看详情 Android数据格式解析对象JSON用法 WORD版

    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 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提供了三种对应服务端的客户端模式,集群,哨兵,和单机模式,三种模式在连接池这一块都是公用的, 同时还提供了灵活的Hook机制, 其底层实际也是调用的万能 Do 方法.

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

    但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 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: darwingoarch: amd64cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHzBenchmarkRedisBenchmarkRedis/redigo_client_BenchmarkBenchmarkRedis/redigo_client_Benchmark-12                26386         39110 ns/opBenchmarkRedis/go-redis_client_BenchmarkBenchmarkRedis/go-redis_client_Benchmark-12              28186         37794 ns/op

    以上就是Go Redis客户端使用的方法有哪些的详细内容,更多请关注其它相关文章!


    # 可以帮助  # 东莞网站建设方案书模板  # 珠海城市推广营销方案  # 做推广的网站靠谱  # 完成职教集团网站建设  # seo推广保举火星8  # asp网站建设专家  # 市场营销如果推广产品  # 上海专业网络营销推广招聘  # 网站建设工作室方案  # 武鸣做得好智能营销推广  # Go  # 时就  # 三种  # 只需  # 按需分配  # 都是  # 有哪些  # 数据格式  # 连接池  # 客户端  # redis 


    相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


    相关推荐: QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务  抖音网页版地址直接进入_抖音网页版在线观看入口  TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法  国际经济与贸易就业方向解析  《360浏览器》自动保存账号密码设置方法  《一起考教师》账号注销方法  《飞猪旅行》购买汽车票方法  Yandex俄罗斯搜索引擎官网入口 Yandex网页端直接访问  J*aScript调试技巧_性能分析与内存快照  如何在Podman容器中运行Composer_Docker替代品Podman的PHP与Composer容器化实践  poki官网最新入口 poki小游戏大全入口  如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色  TikTok视频播放中断怎么办 TikTok播放异常修复方法  iQOO手机信号差网络不稳定怎么办 信号问题原因排查与增强设置【攻略】  海外搜索引擎推广效果怎么样,怎么分析效果!  以下哪一项是古代兵书三十六计中的计谋  《百果园》充值余额方法  J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践  风神瞳获取全攻略  飞飞漫画漫画阅读官网_飞飞漫画漫画阅读官网进入阅读  口腔诊所管理软件推荐  电脑双系统如何安装和卸载 Windows和Linux双系统安装教程【详解】  使用Selenium在无头Chrome中交互动态菜单和复选框的策略  J*aScript装饰器_元编程实战  天堂漫画网页版在线阅读 天堂漫画手机版入口  店铺如何关联视频号推广?视频号推广有什么用?  QQ邮箱手机版网页版 QQ邮箱登录入口地址  《三国:谋定天下》平民全阶段通用阵容  键盘保修需要什么_键盘售后维修流程  PHP魔术方法__set与__isset:设计考量、性能权衡与静态分析的视角  照片整理的黄金法则是怎样的? 理解“收集-筛选-归档-备份”四步流程  Yandex浏览器官方入口_Yandex搜索引擎中文版  家里的小飞虫总是不断,用什么方法可以彻底根除?  《下一站江湖2》武器获取方法  《长生:天机降世》火塔小怪大全  《火花chat》搜索好友方法  Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件  小红书网页版首页入口 小红书网页版电脑端官方登录链接  sublime怎么在文件中显示代码结构大纲_sublime符号列表功能  哈尔滨城市通昵称修改方法  《sketchbook》选中部分图案移动方法  驱动人生:游戏修复指南  如何在CSS中清除浮动解决背景颜色不包裹内容问题_clear after技巧  掌握CSS :has() 选择器:父选择器、嵌套限制与常见陷阱解析  可米酷漫画在线阅读入口_ 可米酷漫画官网直达链接  CSS过渡如何实现按钮悬停效果_transition属性控制背景颜色变化  顺丰官方查单号入口 顺丰快递单号查询官网入口  Linux如何优化系统启动流程_Linux启动项优化方案  《虎扑》关闭社区内容推荐方法  食品生产用水只要符合国家规定的生活饮用水卫生标准就可以吗 

     2023-06-03

    了解您产品搜索量及市场趋势,制定营销计划

    同行竞争及网站分析保障您的广告效果

    点击免费数据支持

    提交您的需求,1小时内享受我们的专业解答。

    运城市盐湖区信雨科技有限公司


    运城市盐湖区信雨科技有限公司

    运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

     8156699

     13765294890

     8156699@qq.com

    Notice

    We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
    You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.