老哥们好,其实起这个标题不是很准确。但是我也不确定我这个问题起什么标题。是这样的,小弟目前的项目用到了通讯,项目是一个微信公众号,主要功能是提供学校学生公寓充值水电费。然后差不多每个操作都需要到客户端获取数据在返回主程序端。每个学校就是一个客户端,客户端放在学校本地。然后项目的session是放在redius。目前遇到一个内存泄露的问题。因为请求的时候需要到客户端获取数据,所以req,和res对象会存到一个数组,等获取到数据后传到主程序后在冲数组中获取req,和res对象。那么就会有问题,这个数组会越来越大而且几乎永远不会被释放。现在高峰期学生使用多的时候只能通过定时重启解决。不知道我这个描述老哥们是否看懂。如果有老哥看懂并且有什么办法的话希望能帮帮小弟。 12.png 这里传到客户端之前把req,res存起来key是当前的时间, 21.jpg 然后这个函数是客户端把数据传过来后执行数据操作的函数,这里根据刚刚的时间从数组中获取req,res对象。这样才能处理完这个请求,返回给前端数据或者是成功失败的状态。
@waitingsong 对,这个请求需要到客户端取获取数据回来操作,和客户端socket通讯的时候我吧req和res存起来,等数据回来在触发一个函数再从数组中获取req和res处理数据返回给前端。
个人拙见:首先这个key也就是order_no使用当前时间不严谨,可以拼接上定长的随机字符串,保证其唯一性; 每个请求对应一个client对象,client对象存在map里,请求完成,返回给前端后,删除该client对象。
const clients = new Map();
// set client
clients.set(order_no, client);
// get client
clients.get(order_no);
// delete client
clients.delete(order_no);
很好奇这样的流程:
- 第一接口访问调用主程序端
- 主程序端需要学校客户端的信息向客户端申请,获得信息。
- 主程序端执行后续操作
- 第二个接口访问主程序端
- 主程序端直接获取缓存的客户端信息
- 主程序端执行后续操作
- ... 问题在于, 第一个接口访问的时候应该提供访问客户端的凭证,单次充值的交易id,主程序端接收凭证访问客户端获取信息,记录在类似于redis里设置超时时间,生成访问token,后续接口需带上对应token和交易id。 交易完成后清除redis缓存
@fightAndLearn 缓存所有好像不太合适老哥,如果学生更换绑定宿舍之类的,不可能将所有信息都能存到redis,一些固定的参数信息我是一开始就存redis的。
老哥,看了你的描述,不知道理解的大概流程对不对,请求进来->访问别的服务获取数据->向前端返回获取到的结果。如果是这样的话,感觉好像没有必要把req,res存起来呀。
不懂为什么要把req和res都存进去 到一个代码中的数组中去,是有什么数据需要一直保存么,学生公寓交水费不应该是一个不是使用特别频繁的操作项目么,只要进来的时候获取到学校记录然后完成充值操作就可以删除掉这个记录信息了吧, 你缓存学校信息可以 况且如果你项目可以重启且保证用户使用正常的话 这不是证明这个数组里的数据可以二次获取到么,那么不保存有又什么问题呢
况且你找个键值对的数据集如果感觉不行就直接都扔到redis中不就行了么 redis还有各种清除策略,实在不行还可以加大redis的内存 你都用了redis 为啥不吧clients都用redis存取呢