我们做为研发同学,经常会接到各种需求或项目,除了保证业务功能实现外,还会关注一个重要的指标,就是系统性能。如果一个系统发布上线后,扛不住一定的流量,很难得到客户的满意。
如何提升系统性能,有几种方式,做个简单回顾:
性能不够,缓存来凑。对于一个典型的互联网应用来讲,使用缓存可以解决绝大部分的性能问题,如果需要优化软件性能,那么可以优先考虑哪里可以使用缓存改善性能。“周期短、见效快”
计算机最核心两部分:计算(飞机)、存储(蜗牛)。木桶原理,整体性能由短板决定。针对速度相差较大的两种硬件,引入组件,协调两者数据传输速度的差异,称之为缓存!!! 如:CPU(1级、2级、3级)
复制两层含义:一种数据的直接拷贝镜像,数据异构;另一种原始数据二次加工,合、拆、转换。通过空间换时间,提升性能。
为什么使用缓存?性能角度,TPS:mysql(2K),redis(10W+)
微博Feed流、微信朋友圈,数据有热点属性,读占80%的流量。搜索不太适合,每个人的搜索词不同,效果不明显。
计算 y = F(x) 非常复杂,中间涉及很多步骤,发生了一系列的存储访问请求。如:一个直播需要在首页展示当前有多少用户同时在线,如果使用 MySQL 来存储当前用户状态,则每次获取这个总数都要“count(*)”大量数据,这样的操作无论怎么优化 MySQL,性能都不会太高。如果要实时展示用户同时在线数,则 MySQL 性能无法支撑。实时的可以借助Spark 、Flink。
命中率。系统 QPS 是 10000/s,每次调用会访问 10 次缓存或数据库,命中率减少 1%,数据库每秒就会增加 10000 * 10 * 1% = 1000 次请求。
注意:缓存并非银弹,需要接受一定时间区间内的数据不一致(最终一致性)
一般来说,我们都会在数据首次被访问的时候,顺便把这条数据放到缓存中。随着访问的数据越来越多,总有把缓存占满的时刻,这个时候就需要把缓存中的一些数据删除掉,以便存放新的数据,这个过程称为缓存置换。
缓存还是挺费钱的。像阿里云 8节点16G集群版,1年要近2W块钱。缓存还无法做到像磁盘那样廉价,考虑ROI 性价比,数据淘汰策略显得很重要。
缓存无处不在,我们来看下常见的几种缓存
本地缓存直接访问进程所属内存,不需要跨网络调度,避免网络交互带来的性能损耗,速度快
缓存内容不会改变。因为对多实例服务器来讲,当数据源更新后,每个单机很难感知,维护成本高。发布订阅模式
时效性要求低。能接受一定的延迟,设置较短过期时间,被动失效保持数据的新鲜度
注意事项:
全文共三篇,未完待续。。。