✨前言php
最近须要把一批地理数据存到redis上面,方便做为一个地理范围检索的用途使用,可是奈何数据量几十万级的,动不动PHP就会报内存溢出了,这样子还得找办法解决redis
✨yield的出现数据库
在我苦思一顿以后(实际上是摸鱼摸出来的),发现了PHP居然有如此神功(yield),能够助我羽化登仙,呸呸呸。数组
✨实践是检验真理的惟一标注缓存
本质 其实yield的实质能够看做一个单向的链表,每一次取完数据就会日后移,直到到达了末尾bash
输出结果:spa
current:0
key:0
next:
valid:1
current:1
复制代码
当迭代生成器遍历完一次以后,想要继续遍历,会抛出异常,由此证实生成器在遍历完一次以后,就会失去了他本来的做用code
0
1
2
3
4
Fatal error: Uncaught Exception: Cannot traverse an already closed generator in C:\xampp\htdocs\test.php:32 Stack trace: #0 {main} thrown in C:\xampp\htdocs\test.php on line 32复制代码
占用内存 回到本次解决问题的中心点,就是要解决大量数据致使PHP内存溢出的问题,下面咱们来作一下简单的试验cdn
实验结果:对象
384056b
781032b
384056b
4578040b
复制代码
结果代表,生成器只是占用了存储自生对象的内存,不管数据再多,占用的内存不变,而通常的返回数组形式会致使数据越多占用的内存越高
结合实际状况分析 也有人会想到,那放在yield里面的操做换成读数据库或者调用其余接口获取数据再返回,会不会在遍历的时候,每遍历一次就会读一次库或者调一次接口?
实验结果:生成器所在的方法在遍历的时候只会被调用一次,而后后面都只是取数据-偏移的操做
yield存在的方法被调用
0
1
2
3
4 复制代码
若是你须要对一堆数据进行处理,好比把数据从数据库取出而后存储到redis缓存中,可使用yield这种方式去处理数据,已达到节省内存空间的效果。
有任何的意见或者错误的地方欢迎指出,虚心接收😝😝😝以为能够帮到本身的麻烦点个赞👍给点支持鼓励❤❤❤