我怀疑这甚至是可能的,但这是问题和建议的解决方案(建议解决方案的可行性是这个问题的对象):
我有一些“全局数据”需要可用于所有请求。我将这些数据保存到 Riak 并使用 Redis 作为缓存层以提高访问速度(目前......)。数据被分成大约 30 个逻辑块,每个大约 8 KB。
每个请求都需要读取这些 8KB 块中的 4 个,从而从 Redis 或 Riak 读取 32KB 的数据。这是对任何需要读取的特定于请求的数据的补充(这是相当多的)。
假设每秒甚至 3000 个请求(这不是实时服务器,所以我没有实数,但 3000ps 是一个合理的假设,可能会更多),这意味着从 Redis 或 Riak 传输 96KBps 到已经不是- 从应用程序逻辑进行的其他无关紧要的调用。此外,Python每秒
解析 3000 次这些 8KB 对象的 JSON 。
所有这些——尤其是 Python 必须反复反序列化数据——似乎完全是一种浪费,一个完美优雅的解决方案是将反序列化的数据缓存在 Python 的内存本机对象中,我可以定期刷新它和当所有这些“静态”数据变得陈旧时。几分钟(或几小时)一次,而不是每秒 3000 次。
但我不知道这是否可能。您实际上需要一个“始终运行”的应用程序来缓存其内存中的任何数据。而且我知道在 nginx+uwsgi+python 组合中情况并非如此(相对于节点之类的东西)-据我所知, python 内存数据不会在所有请求中持久保存,除非我大错特错。
不幸的是,这是一个我“继承”的系统,因此无法在基础技术方面进行太多更改,我也不了解 nginx+uwsgi+python 组合在启动 Python 进程和持久化方面的工作原理Python 内存数据——这意味着我可能对上面的假设大错特错!
因此,关于该解决方案是否可行的直接建议+ 对可以帮助我了解 nginx+uwsgi+python 在启动新进程和内存分配方面如何工作的材料的参考将大有帮助。
PS:
已经阅读了 nginx、uwsgi 等的一些文档,但还没有完全理解我的用例的后果。希望现在能在这方面取得一些进展
如果内存中的事情可以解决,我会放弃 Redis,因为我只缓存我上面提到的静态数据。这使得进程内持久的内存中 Python 缓存对我来说更具吸引力,减少了系统中的一个移动部分,并且每个请求至少有四个网络往返。