当前位置: 首页 > 科技观察

程序员如何开发高效程序,这项技术值得了解

时间:2023-03-22 13:56:45 科技观察

几乎每个网站都有这样的设计模式,首先是前端访问层,然后是一些后台逻辑服务,最后是数据库。大家都知道,做一个10个人都可以访问的节目很简单,但是做一个同时满足10000人和100万人的节目就非常难了。今天我们就来介绍下程序员高并发架构中的池化技术。在谈池化技术之前,先说一个现实生活中的例子。我相信每个人都去过网吧。十几年前,当时SSD硬盘还是很贵的。很多网吧用的是普通盘,启动很慢。为了提高用户体验,网吧会提前帮你开机,这样上网的时候就不用开机,直接上网。这就是池化技术。早上上网的人比较少,网管可能只开了10台机器。晚上可能人比较多,网络管理员会开30台机器。这就是池化技术中的池大小调整。程序员的技术栈中有很多池,比如线程池、连接池、对象池、内存池等。今天我们就简单介绍一下各种矿池。相信每个程序员对连接池都不陌生。我们在使用Redis等缓存或者Mysql等数据库时,往往需要配置连接池。相信每个Java程序员都配置过C3P0或者HikariCP的连接池。我们为什么需要它?连接池,它有什么用?如果没有连接池,我们访问数据库会怎么样,首先我们要建立连接,建立连接,以为要握三次手,需要几毫秒,紧接着,不是每个人可以访问数据库。数据库还需要验证登录账号密码,这又需要1.2毫秒,然后真正的数据查询可能需要1.2毫秒。一个10毫秒的请求可能会浪费80%的时间。其次,连接池可以让服务更稳定。比如下游数据库支持1000并发,但是业务层支持10000并发,这时候可能会出现什么情况,业务层同时请求10000个数据库超过了下游系统的最大负载。这不会杀死服务吗?连接池允许我们为不同的业务分配不同数量的连接,使其总数不超过系统的最大值。对象池在Java语言中,垃圾回收是一个非常头疼的问题,尤其是FullGC总会带来一些问题,不仅是Java很多语言都有这样的问题。例如,如果我们开发一个游戏,士兵对象的一个??实例代表一个长矛士兵。可能玩家想在一场比赛中杀死几千名士兵,那么每有一个士兵死亡,我们就得注销这个实例,每次刷新一个士兵我们都会创建一个新的实例。大家都知道向操作系统申请内存是有代价的。可能你是单机游戏,但如果是大型网络游戏,页面上玩家之间的打斗就很频繁。这时候我们最好使用对象池技术。当一名士兵死亡时,它会被回收而不是直接释放。下次出现新兵,直接重用。对象池技术减少了程序向操作系统频繁申请内存,尤其是大块内存。我们需要借助对象池技术,更好的优化内存的使用,减少垃圾回收的次数,让程序更加优化。线程池类似于对象池。我们可以理解为线程也是操作系统使用的一个对象。在现代计算机开发中,多线程是非常普遍和必要的。可以有效利用CPU多核的特性,但是操作系统创建线程和线程销毁有一定的开销,所以我们可以使用池化技术,但是操作系统运行完一个线程后,不销毁它立即执行,但让空闲线程继续等待新任务的执行。Memorypool内存池,这个可能用C++比较多的同学会用到,最有代表性的有Google开发的TcMalloc和Facebook开发的JeMalloc。其实Java开发中也用到了内存池。Java中有一些Unsafe方法可以直接管理内存。我们在开发一些中间件的时候经常会用到它们。内存池最大的作用就是减少内存碎片。什么是内存碎片?很多同学不明白什么是内存碎片。让我们举个例子。我们得到了一块木头,想用它来做一把椅子。如果我们不把椅子每个部分所需要的木头都规划好,想用就把木头砍下来,那么最终这块木头的利用率肯定不会高。记忆也是如此。如果每个申请都是随机分配的,很容易形成大量的内存碎片,最后拖慢程序。总结完毕,今天就分享到这里,希望对大家有所启发。欢迎大家关注我,我会和大家一起学习和分享电脑相关的知识。您的支持是我继续聊天的动力。