1
helone 2014-01-09 01:58:43 +08:00
压力来自数据库吧?
|
2
virushuo 2014-01-09 02:46:42 +08:00 via iPad
把热点放在内存通常都能解决,大到内存解决不了的问题考虑mapreduce方式分布。
|
3
beordle 2014-01-09 02:56:00 +08:00 5
这种需求本来最好在python里面完成,加上一个计数变量x,定时写入数据库。不过稍微大一些的python项目可以说是类似tornado的那样多个进程的架构了,进程间内存不能共享,所以python本身基本不能解决或者说代价比较大。必须使用memcache和redis这样的有独立进程的缓存程序。
如果直接操作数据库,点赞300次。就要 读 锁 写 各300次。性能非常差。如果加一个redis 的话。其中有一个定时dump机制,非常适合高并发。读写都在内存中。每隔一段时间才会写入硬盘。性能高2个数量级。 具体的实现 可以这样,写一个 给 get set都弄上一个 装饰器。连接到 redis的 incr就行了 |
4
beordle 2014-01-09 02:59:19 +08:00
说的是具体实现,可能不太详细 把 python函数装饰器实现cache python的redis库 redis的incr文档 这些关键字google一下就行了。
|
5
chenniaoc 2014-01-09 06:57:22 +08:00
redis弱点是单线程,是个瓶颈.
|
6
cloudzhou 2014-01-09 09:51:03 +08:00
@chenniaoc 单线程不会成为瓶颈的,这个和网络复用有关,nginx也是单进程模式,当然你可以开启多个。
这个问题应该不难,redis生成临时计数器,按照一定时间回写到数据库。 |
7
emohacker 2014-01-09 10:04:20 +08:00
@chenniaoc 多线程也有多线程的弊病,线程间的切换也是有开销滴,开发也没单线程来得纯粹,总之单线程也有单线程的好处,木有绝对完美滴解决方案,性能的优化都是基于实际需求遇到的困难为出发点的。
|
8
vietor 2014-01-09 10:18:07 +08:00
做一个Command队列,牺牲实时性
|
9
akira 2014-01-09 10:34:51 +08:00
队列+内存数据库
|
10
est 2014-01-09 12:28:58 +08:00
统计多少次赞容易,但是每个人点一下一条行为记录就麻烦了。
|
13
arzusyume 2014-01-09 19:42:27 +08:00
前阵子在解决某站点高并发投票的问题
程序本身是 PHP+MySQL.所有的写操作(投票/PV/验证码session)都完全交给了 memcache, IP日志的分析交给nginx去拦截刷票. 大概是每2分钟用 crontab 触发一个 php 把 memcache 的内容写入 MySQL 中.(一开始想直接全部读出写入,结果抛了个事务锁错误OTL, 改成每次读写XX条) 此外验证码也可以优化成预生成,不过考虑成本没去做 好吧说了半天和python无关的,总之就是尽可能的减少IO次数,多用缓存,减少计算量 |