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

xiaopi

问题描述

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

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

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

134 3 1
3个回答

故人重来

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

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

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

  • 故人重来 1天前

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

  • xiaopi 1天前

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

六次元

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

  • xiaopi 1天前

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

rbb

就redis就好了啊,

  • 暂无评论
×
🔝