提高查询速度,众所周知一般缓存到(缓存)redis,查询(缓存)redis。减少mysql查询
举个例子,java执行一条代码,从数据库取出两个数据,int a=4,int b=6, 把这个两个数相加。
执行的步骤,就是,先从数据库或者缓存中,把数据加载到内存中,数据再从内存交给cpu执行引擎进行处理。
咱们知道cpu从内存中查询数据是很快的, 但是对于计算机来说还是很慢的。
这里我输出一下我理解的,代码,如何减少cpu查询内存次数。提高速度。
cpu:
1:电脑有cpu和内存,从电脑开始起,cpu和内存都在不断的发展,但是内存跟不上cpu提升
cpu研发者,在cpu内镶嵌3级缓存。l1.l2.l3
2:每个cpu目前都是多核, l1,l2是每个核独有的,l3缓存是多核共享的。
3:当执行一个程序,cpu 内核1创建一个线程,会把数据从内存,复制到l3.再复制到,l2,l1,到寄存器
4:cpu有空间局部性,和时间局部性。
5: cpu的空间局部性,当cpu把内存中数据加载到缓存中,它会把该数据周围连续的数据加载缓存中去。
6:cpu的时间局部性,当一个数据被加载,cpu会认为一段时间,该数据还会被使用,不会立马清除
7:例子:一个long类型的二维数组,数据相加 ===== long[ 1024 ] [ 6 ]
一维数组是1024个数据,二维是6个数据,要把1024*6相加。
第一种方式:先加二维数组6个数据
第二种方式:先加一维数组1024个数据
=================================================================
先从内存中加载 [0][1] 到内存中去,根据cpu空间局部性,会把[0][1]这个数据的连续数据加载到内存中去。
如果按照第一种方式,它会把[0][1],[0][2],[0][3],[0][4],[0][5],[0][6]同时加载到内存中去
如果按照第二种方式,它会只把[0][1]加载到内存中去,其它的连续数据在其它维度里。不相邻
所以第一种方式,cpu请求内存1024次。第二种方式1024*6次。
优化1:空间局部性优化:尽量把代码程序,相加的数据,让它连续。 减少cpu请求内存
优化2:时间局部性:同一个变量加载多次,尽量先提前使用。,防止cpu清除缓存中的变量,再次请求cpu