第55章 如果企鹅要做
「给常用查询栏位加索引,能到四千。」往上又标了一个。
【写到这里我希望读者记一下我们域名台湾小説网→??????????.??????】
叶明问:「那文本文件那块呢?还有优化的空间吗?」
张老师看了他一眼:「你那个文本文件,现在多大?」
「八百条事件。上线先用五百条,后面内容团队会继续写,很快能到三千条。」
张老师点头:「三千条事件,纯文本几百KB。就算以后到一万条,也就一两MB。你那台伺服器内存至少1G,这点量完全不是问题。」
叶明追问:「那除了把文件加载进内存,还有别的优化可以做吗?」
张老师想了想:「事件多了以后,你得考虑『热点』的问题。不是所有事件被触发的频率都一样。
有的事件可能一天触发几万次,有的可能几天才触发一次。
那些高频事件,你可以把计算结果缓存起来,不用每次都重新算一遍。」
他在白板上又画了一个框,标上「计算结果缓存」:「这叫『热点事件结果缓存』。跟你那个文本文件加载,一个解决的是IO问题,一个解决的是CPU计算问题。两个层面的东西。」
叶明把这些都记下来:「那怎么判断哪些是热点事件?」
张老师笑了:「上线跑起来就知道了。看日志,哪些事件触发次数最多,哪些事件让伺服器CPU飙得最高。数据会告诉你答案。做技术的人,不能靠猜,得靠数据说话。」
叶明点头,又问:「那排行榜呢?排行榜的压力怎么解决?」
张老师继续画:「把排行榜做成静态页面,五分钟更新一次。用户访问的时候直接读静态文件,不用查资料库。这样排行榜的访问压力就没了。」
叶明追问:「五分钟会不会太慢?用户看到的数据不是实时的。」
张老师看了他一眼:「你这个游戏,需要实时排名吗?
玩家在乎的是自己排在第几名,还是在乎『我比昨天进步了』?
想清楚这个问题,你就知道五分钟够不够用了。
很多时候,用户要的不是绝对实时,是『看起来实时』。」
叶明愣了一下,把这句话也记下来。
叶明又问:「那排行榜的静态页面放在哪里?放在自己伺服器上就行吗?」
张老师点头:「放你自己伺服器上就行。用户访问的时候直接读静态文件,压力小很多。」
叶明追问:「那如果流量再大呢?静态页面也扛不住的时候怎么办?」
张老师笑了,在白板上又画了几个框,连成一张图:「做负载均衡。
前面加一个分发器,后面挂多台伺服器。
用户的请求先到分发器,分发器决定交给哪台伺服器处理。
这样每台伺服器的压力都变小了,整体能扛的流量就上去了。」
叶明盯着白板看了一会儿:「那用户的数据怎么办?比如用户登录了,下次请求被分到另一台伺服器,不就丢了?」
张老师笑了:「问到点子上了。所以得把用户会话单独拎出来,放Redis里。
Redis是一种内存资料库,读写速度极快。
所有伺服器共享一份会话数据,用户不管被分到哪台机器,都能读到自己的登录状态。」
叶明追问:「Redis也是存在内存里的?那和MySQL有什么区别?」
张老师在白板上又画了一个框,标上Redis:「MySQL是硬碟资料库,数据存在硬碟上,读写慢,但容量大丶持久化。
Redis是内存资料库,数据存在内存里,读写快几十倍,但容量小丶断电就丢。
所以各司其职。MySQL存持久化数据,Redis存临时会话和缓存。」
叶明把这些都记下来,又问:「那事件库呢?多台伺服器共享,每台都得有一份?」
张老师点头:「对。事件库是文本文件,每台伺服器都得放一份。更新的时候要同步,麻烦一点,但也不是不能做。」