阅读:2774回复:0
Golang周报第五期:拼sql、性能、gin进阶、连接池一、拼凑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 |
|
|