在小内存服务器上,高效处理 30 万次/天 API 请求的数据库与缓存优化方案?

171 天前
 mxdyeah

问题:
我有一个 Django 项目和一个 PHP 项目,用于提供 电子节目单( EPG ) 服务,每天大约 30 万次 API 请求。服务器配置较低,只有 4G 内存。我需要在 数据库( MySQL 、PostgreSQL )缓存( Redis 、Memcached ) 方面进行优化,以提高 API 响应速度并减少资源占用。

具体问题如下:

  1. 数据库选择:在 MySQL 和 PostgreSQL 之间,哪种更适合小内存环境?
  2. 数据库优化:如何设置 连接数、缓存、索引策略 以减少内存占用并提高查询效率?
  3. 缓存方案:Redis 和 Memcached 在 EPG API 场景下,哪种更合适?如何高效缓存查询结果?
  4. 具体配置建议:对于 低内存服务器,推荐哪些数据库和缓存配置参数?

示例场景:

希望大家能分享一些 小内存服务器优化 API 处理能力 的经验!谢谢!

6131 次点击
所在节点    程序员
49 条回复
IDAEngine
171 天前
PostgreSQL + Kvrocks
Vegetable
171 天前
这场景想不到为什么要优化呢,缓存都有点多余其实。几万条数据全量缓存都没多大,Django 也不吃多少内存。
Outshine
171 天前
我觉得你的场景 `sqlite` 都行,然后直接做静态化,定时生成更新静态文件即可
zoharSoul
171 天前
30 万次无需任何优化
mysql 随便抗
caola
171 天前
我一直都在使用 redis 替代品 kvrocks ,可以说是硬盘版 redis , 缓存无压力
sunpj
171 天前
哈哈 乍一看 30w qps 感觉难度还挺大的 后面发现是 30w 一天 直接数据库就没啥压力 mysql 或者 pgsql 都可以 只要没有代码没啥问题 数据库不太可能成为瓶颈的 用不到 redis
naeco
170 天前
无压力
ferstar
170 天前
你这根本毫无压力好吧

1. db 建议无脑 PostgreSQL
2. 没有什么是 explain analyze 解决不了的
3. Redis 足够了,Django 2.0 以后也支持了协程,你把所有同步方法改写成异步,阻塞任务丢 Celery
4. host 内核版本升到 6.13.x ,最近合入了一个大佬关于 swap 的优化,性能暴增 400%,开上 4~8GB 的 swapfile ,bbrv3 也开起来,抗压能力嗖嗖的
gyinbj
170 天前
先上 cdn 再静态化 再上 redis
abccccabc
170 天前
楼主,php 敢不敢用 8.4 的?敢不敢用它的扩展 APCu ,缓存数据放 apcu ,反正是单机跑。根据我的感观,php8.1 比 php7.4 快多了。8.4 比 8.1 又要快一些。

我汇集了一条龙优化方案:参考下: http://biji.sebcxy.com/forum.php?mod=viewthread&tid=268&extra=page%3D1

各位高手:如果我写的方案有错误或者某些点还可以再优化的话,可以 @我。我补充或修改一下
murmurkerman
170 天前
哈哈哈,真担心性能要用 redis+go ,https://eieio.games/blog/scaling-one-million-checkboxes/
raptor
170 天前
我还以为是 1G 以下的内存,都 4G 了不算小。特别是以读为主的情况,更新又不多的,加个 redis 就是了,控制一下 redis 的内存用量就好,比如过期时间设置得短点,只缓存最热的数据等。内存占用的话,个人体会是 pg 会小一些,我在 256M 的机器上正常使用过 PG ,但是 mysql 小于 512M 基本没法用。
bronyakaka
170 天前
单机你这场景可能不需要 redis ,直接进程内缓存读写,最最快
mayli
170 天前
直接 sqlite 应该最快,
》 目前数据库存储有 数万条节目单数据,查询主要基于 频道 + 日期
要是只有数万的话,sqlite ,或者直接放内存也够。

小内存一般来说,数据不多,直接放内存也是够的。
数据量大的话,比如 10m 行以下,sqlite+索引也够,你这 epg 明显是可以做个索引完事。
crackidz
170 天前
只要不是大量瞬时动态请求,这请求量也并不高
pony2335
170 天前
异步数据批量落盘,能用内存的就内存 不行就 redis 、最后才是数据库操作,这么干的话,一天随便 30 万
Ipsum
170 天前
顶多加个 redis 缓存,对每次查询做缓存,ttl 差不多 6H 。先从 redis 读,如果没有就从数据库读然后写入缓存。写的话直接写数据库或者先写 redis 然后异步数据库,但是每天就更新几次,建议直接写数据库。4G 内存不小了。
seansong
170 天前
你这个访问量和配置,其实只要不写有问题的逻辑代码在里面,一般正常水准的代码,应该不需要优化技巧,就能跑吧
securityCoding
170 天前
lru 就行
FgHh07ObvBiST5po
170 天前
我以为你每分钟 30 万次呢... 算了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1118618

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX