服务性能出现瓶颈,有些逻辑需要多次进行 reids 访问。 虽然每次 redis 访问时间较短,但是总体下来网络开销还是吃不消。
现在明确的解决方案是使用 进程内的缓存 来解决。调研了几个现有的 缓存 库,都不太满足需求。
不知道 python 中是否有个缓存组件能够同时支持:
如果没有,就只能自己在基于上面的几个缓存组件修改。
1
kkfnui OP 需要功能是和 java guava 库中的 LoadingCache 一样的
|
2
cabing 2017-12-14 10:07:28 +08:00 1
搭个本机的缓存应该就符合你的要求了吧?
比如本机的 redis。或者用 leveldb 在本机重复造个轮子。 |
4
cabing 2017-12-14 10:27:08 +08:00
性能瓶颈是网络 io ?
如果磁盘 io 低的话,可以使用基于文件的 nosql。 1 如果时间不着急可以自己造轮子啊 2 如果比较急 或者看看能不能找个共享内存的库,你的四点基于轮子去做. |
5
cabing 2017-12-14 10:28:08 +08:00 1
抱歉啊,实在是不是特别了解 python。只能提供一点点思路,希望能帮到你哦~
|
6
kkfnui OP |
7
billion 2017-12-14 10:38:44 +08:00 1
你的这个网络开销,是从 redis 传数据回来的时间,还是 redis 读取的时间?如果是前者,使用异步模型可解。
|
8
cabing 2017-12-14 10:42:12 +08:00 1
@kkfnui
思路一 如果只是内存问题的话,建议看看走磁盘的 nosql。做成一个服务,通过 socket 调用,自己封装下就行 思路二 python 开源库,找一个比较原始的能够实现多进程共享内存的组件,其他的业务逻辑可以自己封装。 思路三 用 c 重复造个轮子。短平快你是不用考虑了~ |
9
mooncakejs 2017-12-14 10:42:16 +08:00 1
也找不到合适的,最后自己写了一个,发现其实代码没多少行。
|
10
VYSE 2017-12-14 10:47:12 +08:00 1
自己用 PYLRU 改过,选其他一些不成熟实现遇到过坑,比如某用 C 实现 LRU 说自己很快然后 crash 一堆
|
11
Kilerd 2017-12-14 12:01:13 +08:00 1
from functools import lru_cache
|
12
kkfnui OP |
14
kkfnui OP @mooncakejs 恩,还是自己写了一个。
|
16
Buffer2Disk 2018-11-13 11:41:00 +08:00
@kkfnui
最近也在研究这一块,可以讨论讨论,网上找了一个支持 timeout 的 lru_cache , 是基于 python 官方的 orderedDict 实现的, 测试后发现,orderedDict 貌似有内存泄漏的问题 ---> https://stackoverflow.com/a/46935255/2379891 不知道你后来是怎么解决的? |