亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python中用memcached來減少數(shù)據(jù)庫查詢次數(shù)的教程

系統(tǒng) 1679 0

本來我一直不知道怎么來更好地優(yōu)化網(wǎng)頁的性能,然后最近做python和php同類網(wǎng)頁渲染速度比較時(shí),意外地發(fā)現(xiàn)一個(gè)很簡單很白癡但是 我一直沒發(fā)現(xiàn)的好方法(不得不BS我自己):直接像某些php應(yīng)用比如Discuz論壇那樣,在生成的網(wǎng)頁中打印出“本頁面生成時(shí)間多少多少秒”,然后在 不停地訪問網(wǎng)頁測試時(shí),很直觀地就能發(fā)現(xiàn)什么操作會(huì)導(dǎo)致瓶頸,怎樣來解決瓶頸了。

于是我發(fā)現(xiàn)SimpleCD在 生成首頁時(shí),意外地竟然需要0.2秒左右,真真不能忍:對(duì)比Discuz論壇首頁平均生成才0.02秒,而Discuz論壇的首頁頁面無疑比 SimpleCD的主頁要復(fù)雜不少;這讓我情何以堪啊,因?yàn)檫@必然不是Python語言導(dǎo)致的差距,只能說是我完全沒做優(yōu)化而Discuz程序優(yōu)化得很好 的后果。


其實(shí)不用分析也能知道肯定是數(shù)據(jù)庫在拖累,SimpleCD在生成首頁時(shí)需要在sqlite的三個(gè)數(shù)據(jù)庫中進(jìn)行42多次查詢,是歷史原因?qū)е碌臉O其低效的一個(gè)設(shè)計(jì);但是這40多次查詢中,其實(shí)大部分是非常快的查詢,仔細(xì)分析一下就有兩個(gè)是性能大戶,其他都不慢。

第一個(gè)大戶就是:獲取數(shù)據(jù)個(gè)數(shù)
?

            
SELECT count(*) FROM verycd

          

這個(gè)操作每次都要花不少時(shí)間,這是因?yàn)槊看螖?shù)據(jù)庫都要鎖住然后遍歷一遍主鍵統(tǒng)計(jì)個(gè)數(shù)的緣故,數(shù)據(jù)量越大耗時(shí)就越大,耗時(shí)為O(N),N為數(shù)據(jù)庫大小;實(shí)際 上解決這個(gè)問題非常容易,只要隨便在哪存一個(gè)當(dāng)前數(shù)據(jù)的個(gè)數(shù),只有在增刪數(shù)據(jù)的時(shí)候改動(dòng)就行了,這樣時(shí)間就是O(1)的了

第二個(gè)大戶就是:獲取最新更新的20個(gè)數(shù)據(jù)列表
?

            
SELECT verycdid,title,brief,updtime FROM verycd
 
  ORDER BY updtime DESC LIMIT 20;

          

因?yàn)樵趗pdtime上面做了索引,所以其實(shí)真正查詢時(shí)間也就是搜索索引的時(shí)間而已。然則為什么這個(gè)操作會(huì)慢呢?因?yàn)槲业臄?shù)據(jù)是按照publish time插入的,按update time進(jìn)行顯示的話就肯定需要在至少20個(gè)不同的地方做I/O,這么一來就慢了。解決的方法就是讓它在一個(gè)地方做I/O。也就是,除非數(shù)據(jù)庫加入新數(shù)據(jù) /改變原有數(shù)據(jù),否則把這條語句的返回結(jié)果緩存起來。這么一來又快了20倍:)

接下來的是20條小case:取得發(fā)布人和點(diǎn)擊數(shù)信息
?

            
SELECT owner FROM LOCK WHERE id=XXXX;
 
SELECT hits FROM stat WHERE id=XXXX;

          

這里為什么沒用sql的join語句來省點(diǎn)事呢?因?yàn)榧軜?gòu)原因這些數(shù)據(jù)放在不同的數(shù)據(jù)庫里,stat是點(diǎn)擊率一類的數(shù)據(jù)庫,因?yàn)樾枰l繁的插入所以用 mysql存儲(chǔ);而lock和verycd是需要大量select操作的數(shù)據(jù)庫,因?yàn)閙ysql悲劇的索引使用情況和分頁效率而存放在了sqlite3數(shù) 據(jù)庫,所以無法join -.-

總之這也不是問題,跟剛才的解決方法一樣,統(tǒng)統(tǒng)緩存

所以縱觀我這個(gè)例子,優(yōu)化網(wǎng)頁性能可以一言以蔽之,緩存數(shù)據(jù)庫查詢,即可。我相信大部分網(wǎng)頁應(yīng)用都是這樣:)


終于輪到memcached了,既然打算緩存,用文件做緩存的話還是有磁盤I/O,不如直接緩存到內(nèi)存里面,內(nèi)存I/O可就快多了。于是memcached顧名思義就是這么個(gè)東東。

memcached是很強(qiáng)大的工具,因?yàn)樗梢灾С址植际降墓蚕韮?nèi)存緩存,大站都用它,對(duì)小站點(diǎn)來說,只要出得起內(nèi)存,這也是好東西;首頁所需要的內(nèi)存緩沖區(qū)大小估計(jì)不會(huì)超過10K,更何況我現(xiàn)在也是內(nèi)存土豪了,還在乎這個(gè)?

配置運(yùn)行:因?yàn)槭菃螜C(jī)沒啥好配的,改改內(nèi)存和端口就行了
?

            
vi /etc/memcached.conf
 
/etc/init.d/memcached restart

          

在python的網(wǎng)頁應(yīng)用中使用之
?

            
import memcache
 
mc = memcache.Client(['127.0.0.1:11211'], debug=0)

          

memcache其實(shí)就是一個(gè)map結(jié)構(gòu),最常使用的就是兩個(gè)函數(shù)了:

  1. ??? 第一個(gè)就是set(key,value,timeout),這個(gè)很簡單就是把key映射到value,timeout指的是什么時(shí)候這個(gè)映射失效
  2. ??? 第二個(gè)就是get(key)函數(shù),返回key所指向的value

于是對(duì)一個(gè)正常的sql查詢可以這么干

            
sql = 'select count(*) from verycd'
 
c = sqlite3.connect('verycd.db').cursor()
 
 
 
# 原來的處理方式
 
c.execute(sql)
 
count = c.fetchone()[0]
 
 
 
# 現(xiàn)在的處理方式
 
from hashlib import md5
 
key=md5(sql)
 
count = mc.get(key)
 
if not count:
 
  c.execute(sql)
 
  count = c.fetchone()[0]
 
  mc.set(key,count,60*5) #存5分鐘

          

?

其中md5是為了讓key分布更均勻,其他代碼很直觀我就不解釋了。


優(yōu)化過語句1和語句2后,首頁的平均生成時(shí)間已經(jīng)降低到0.02秒,和discuz一個(gè)量級(jí)了;再經(jīng)過語句3的優(yōu)化,最終結(jié)果是首頁生成時(shí)間降低到了 0.006秒左右,經(jīng)過memcached寥寥幾行代碼的優(yōu)化,性能提高了3300%。終于可以挺直腰板來看Discuz了)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 精品偷拍模特露出丝袜在线 | 国产一久久香蕉国产线看观看 | 精品四虎 | 美美女高清毛片视频黄的一免费 | 亚洲精品一二三四 | 国产男女性特黄录像 | 国产激情 | 青青久草在线视频 | 毛片免费看看 | 在线a网| 久草新视频 | 中文字幕在线观看国产 | 久久久精| 亚洲成a人v| 国产麻豆久久 | 欧美性视频在线 | 2021精品综合久久久久 | 99久久免费精品视频 | 精品一本久久中文字幕 | 久久精品影院永久网址 | 尤物视频在线观看 | 久久这里一区二区精品 | 日本欧美视频在线 | 青青青青青青久久久免费观看 | 级毛片| 日韩欧美高清在线观看 | 在线播放亚洲 | 日本中文字幕在线精品 | 一级毛片在线看在线播放 | 成人毛片高清视频观看 | 久久www香蕉免费人成 | 99在线视频播放 | 国产精品亚洲片在线牛牛影视 | 四虎亚洲国产成人久久精品 | 神马影院午夜剧场 | 日本免费不卡视频一区二区三区 | 国产一级理论免费版 | 久久一er精这里有精品 | 亚洲韩精品欧美一区二区三区 | 国产视频福利在线 | 久久久不卡国产精品一区二区 |