欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python中用memcached來減少數據庫查詢次數的教程

系統 1765 0

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

于是我發現SimpleCD在 生成首頁時,意外地竟然需要0.2秒左右,真真不能忍:對比Discuz論壇首頁平均生成才0.02秒,而Discuz論壇的首頁頁面無疑比 SimpleCD的主頁要復雜不少;這讓我情何以堪啊,因為這必然不是Python語言導致的差距,只能說是我完全沒做優化而Discuz程序優化得很好 的后果。


其實不用分析也能知道肯定是數據庫在拖累,SimpleCD在生成首頁時需要在sqlite的三個數據庫中進行42多次查詢,是歷史原因導致的極其低效的一個設計;但是這40多次查詢中,其實大部分是非常快的查詢,仔細分析一下就有兩個是性能大戶,其他都不慢。

第一個大戶就是:獲取數據個數
?

            
SELECT count(*) FROM verycd

          

這個操作每次都要花不少時間,這是因為每次數據庫都要鎖住然后遍歷一遍主鍵統計個數的緣故,數據量越大耗時就越大,耗時為O(N),N為數據庫大小;實際 上解決這個問題非常容易,只要隨便在哪存一個當前數據的個數,只有在增刪數據的時候改動就行了,這樣時間就是O(1)的了

第二個大戶就是:獲取最新更新的20個數據列表
?

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

          

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

接下來的是20條小case:取得發布人和點擊數信息
?

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

          

這里為什么沒用sql的join語句來省點事呢?因為架構原因這些數據放在不同的數據庫里,stat是點擊率一類的數據庫,因為需要頻繁的插入所以用 mysql存儲;而lock和verycd是需要大量select操作的數據庫,因為mysql悲劇的索引使用情況和分頁效率而存放在了sqlite3數 據庫,所以無法join -.-

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

所以縱觀我這個例子,優化網頁性能可以一言以蔽之,緩存數據庫查詢,即可。我相信大部分網頁應用都是這樣:)


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

memcached是很強大的工具,因為它可以支持分布式的共享內存緩存,大站都用它,對小站點來說,只要出得起內存,這也是好東西;首頁所需要的內存緩沖區大小估計不會超過10K,更何況我現在也是內存土豪了,還在乎這個?

配置運行:因為是單機沒啥好配的,改改內存和端口就行了
?

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

          

在python的網頁應用中使用之
?

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

          

memcache其實就是一個map結構,最常使用的就是兩個函數了:

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

于是對一個正常的sql查詢可以這么干

            
sql = 'select count(*) from verycd'
 
c = sqlite3.connect('verycd.db').cursor()
 
 
 
# 原來的處理方式
 
c.execute(sql)
 
count = c.fetchone()[0]
 
 
 
# 現在的處理方式
 
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分布更均勻,其他代碼很直觀我就不解釋了。


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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 性色欧美 | 国产日韩欧美在线观看不卡 | 91婷婷| 成人亚洲综合 | 国产欧美精品在线 | 精品伊人久久久 | 一级毛片免费播放视频 | 国产亚洲欧美日本一二三本道 | 国产精品三级久久久久久电影 | 成人一区二区三区在线 | 欧美精品一区在线 | 欧美日韩一区二区三区在线观看 | 欧美日韩视频网站 | 一级大片久久 | 日日夜夜天天久久 | 182tv成人网182tv香蕉 | 亚洲最大福利视频 | 色婷婷综合久久久中字幕精品久久 | 福利色| 99热国产精品 | 在线国产一区二区 | 国产精品九九久久99视频 | 免费观看www| 91精品免费观看 | 午夜草逼 | 成人国产精品色哟哟 | 欧美亚洲综合久久 | 天天狠狠色噜噜 | 久久免费福利 | 中文字幕一区二区精品区 | 欧美精品在线观看 | 欧美精品久久久久久久久老牛影院 | 久操伊人 | 精品视频| 日本黄色大片免费 | 999久久久 | 黄色影院在线看 | 中文字幕亚洲一区 | 国产精彩视频在线 | 青青在线香蕉精品视频免费看 | 免费视频大片在线观看 |