如何将所有worker进程的内存缓存清空?

xiaopi

问题描述

webman中,为了加快处理的效率并减少IO,做了内存缓存。即根据请求的数据,从数据库中查询到数据后加载到了静态数组LoadData::$data中,供下次请求直接使用。
请问如何解决用户删除了对应数据后,内存缓存也要删除的问题, 需要每个worker进程都清理,请问该如何处理?
由于考虑到性能因素,所以没使用apcu等共享内存机制。在不使用共享内存存放$data的前提下,怎么处理呢?

为此你搜索到了哪些方案及不适用的原因

考虑每个worker进程订阅redis的频道,然后推送,但是可能存在不稳定的情况。

260 4 1
4个回答

故人重来

你这不是脱裤子放屁吗?在乎这点点性能还不如好好优化下SQL语句和数据表设计加缓存来得快。你这样有可能会造成内存泄漏
架构师眼里:没有是加一层解决不了问题,一层不够就加二层。
给你一个多级缓存思路;

  • 采用 OpenResty+Lua
    • 一级缓存放在 nginx 这一层
    • 二级缓存放在 redis 这一层,去更新 一级缓存
    • 三级才直接查询数据库,去更新 一二级缓存
      当然这样优化在不是超高频率访问下,有可能还不如直接webman+cache性能
      后期上面那种多级缓存维护起来还是有点点麻烦的(特别是做了负载均衡)
  • xiaopi 15天前

    并发大概2000 request/sec ,主要是业务上会审核数据,数据审核以后就固定了,所以才考虑采用这种内存缓存方式,确实太过于设计了。

  • 故人重来 15天前

    没必要用apcu,直接redis缓存吧。成熟方案,还支持持久化。

  • xiaopi 15天前

    感谢,用redis设计上会简单不少

六次元

如果对数据过期不是很敏感,可以定时从数据库读,然后缓存到内存。
如果敏感感觉用apcu最好。apcu性能绝对够用,我们公司测试过,每秒读写上千万次。

  • xiaopi 15天前

    确实,都加载到worker进程中,太浪费内存了

rbb

就redis就好了啊,

  • 暂无评论

虚假的减少io:无脑将数据填入本地内存
真实的减少io:合理分析自己的应用场景,为每一类数据选择合适的缓存方式
枚举类数据是可以直接加载到内存的,用户token,热门商品详情可以加载到redis这类缓存当中(使用更快的io而并非减少),文章详情这类本身内容多的数据,但是查询条件只有id的场景,缓存的意义几乎没有。
LoadData::$data这种数据,如果遇到频繁更新其中某个数据的场景每次变动一行重载整个缓存往往得不偿失

  • xiaopi 1小时前

    我的业务场景是用户添加自己的问答库,包括关键词、回答等,问答库审核通过后进行发布,发布实际就是把问答库所有内存加载到文件xxx.json中。 使用就是有很多请求携带问答库的ID进来走不同的问答库逻辑。现在实现的事:当咨询请求进入后,加载对应的问答库内容到内存中,并进行问答库分支逻辑,直到用户结束咨询。自动释放: 当该问答库在20分钟内没有被咨询时,系统自动释放这部分内存。手动释放:当重新发布后,手动释放回答库的内存。 每个worker进程都释放的是通过在afterWorker中添加定时器,定时扫描。

×
🔝