![]() | 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 ![]() 这种需求本来最好在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次数,多用缓存,减少计算量 |