shenyi
管理员
管理员
  • UID1
  • 粉丝45
  • 关注0
  • 发帖数832
阅读:2068回复:0

Golang周报第五期:拼sql、性能、gin进阶、连接池

楼主#
更多 发布于:2020-09-26 13:12


 一、拼凑SQL很累吗?
   这个库可以帮助到你,用一下,很丝滑。https://github.com/Masterminds/squirrel
    示例代码:
    sql, args, err := sq.Insert(“users
).Columns(name, age).Values(moe, 13).Values(larry, sq.Expr(? + 5, 12)).ToSql()

 二、浅谈下Go的一些性能话题(以后再扩展)
   基本的工具大家都懂,不懂的搜pprof
   关于GOGC :
      Go不像java那样可以设置新生代、老年代比例。目前Go有一个环境变量可设置就是GOGC
      GOGC:自上次GC后heap size已经增长了100%时才触发GC。譬如上次是10M,这回是也是10M(增长了100%,就是一倍)则触发GC,填200就是2倍。适当提高可能、仿佛有助于提高GC性能。
      sync.Pool :重复使用的对象且拥有较多引用时,考虑使用sync.Pool提高对象复用率,但也不要滥用
      涉及到锁的部分: 如是单值多线程安全操作,考虑用 atomic代替或配合mutex互斥锁  。可以参考sync.Once的实现


 三、关于数据库连接池

    有很多同学一看连接数不够了,立刻想到加连接池数量。结果还是不够,然后继续加。加着加着崩了。。。
    这里面优化SQL、由于数据库配置、系统配置等 是首要的,而不是一不够立刻加池。对于连接池的设置,业内有个比较流行的公式,一般有效连接数 不会超过 ((核数 * 2) + 有效磁盘数,设置太大并没啥用
     当然,具体要看业务场景,不能千篇一律。 譬如前台譬如查询为主,那么往往设置一个很小的连接数性能更高 (譬如,10-20,具体看场景,不要硬记数字)。涉及到后台或中台的,连接池设置大一些,毕竟长事务较多,前台可以用缓存来填补的
    另外有一个点: 见过一些同学取出连接后,用多协程操作该连接进行数据抽插。 注意:连接池是线程安全的,连接并不是。。。


  四、关于golang里面的map
  众所周知,golang提供的默认map 是线程不安全的。纯读无妨,如需抽插需要加锁
  如果不想加锁呢? 之前我们课程讲过,用sync.Map  。这是线程安全的,因为内部加锁。当然,一旦有锁的机制产生,必定会有性能影响,这好比mysql的表锁。大量读少量写是可以用的
  另外,涉及到大数据量的map。有个第三方库可以使用 https://github.com/orcaman/concurrent-map  
  其原理是把大map进行hash后干成N个小map,这样就减少了锁的颗粒度。性能显著提升


  五、关于Gin的各种深度使用
   之前开了些和Gin相关的基础课,后面根据大家的需求逐步扩展了一些课程,给大家做个进阶。
   1、基于gin做的一个脚手架 https://www.jtthink.com/course/127
   2、一个redis脚手架(缓存部分)https://www.jtthink.com/course/130
   3、gin的技巧篇。各种代码逼格的提升 https://www.jtthink.com/course/134
   4、gin+casebin的学习和封装 https://www.jtthink.com/course/132


  六、一个基于epoll的网络库
   众所周知,go提供了标准库中net包,用它来开发server异常丝滑。 那如果就是要用epoll和kqueue呢。 这个推荐个第三方库,大家可以参考和学习、使用
    https://github.com/tidwall/evio


 
会讲故事的程序员
游客

返回顶部