該用緩存還是得用緩存

后臺用了一年多厚者,現(xiàn)在查詢報表變得很卡中贝,大概要15~180秒梢莽,運營經(jīng)常反映報表加載不出來萧豆,我去服務器一看日志奸披,原來查詢花了200多秒昏名,nginx直接超時了……

先優(yōu)化一下 SQL

我的想法是優(yōu)化報表的 SQL 語句,因為我發(fā)現(xiàn)查個 sql 居然加起來要 10幾秒阵面。

我們的 sql 分為2條轻局,一條是先查總數(shù),這是為了下一步分頁用样刷。另一條是查詳情仑扑。

查總數(shù)的 sql 我看了下,index 都有用到置鼻,但是在 explain 中多出了 using temporary; using file sort; 這2項镇饮。于是我把 group by date 去掉,這2項就沒了箕母。

于是吭哧吭哧地把數(shù)據(jù)都加載出來储藐,然后在代碼里 group by,雖然比較費內(nèi)存和 CPU嘶是,但總比讓數(shù)據(jù)庫做好啊對不對钙勃?

后來想著對第二條也這樣優(yōu)化,但是發(fā)現(xiàn)不行聂喇,因為第二條有個分頁辖源,不 group by 的話,就沒法分頁了……這個暫時沒想到替代方法希太】巳模可憐代碼已經(jīng)寫了2小時了,只好先不用了誊辉。

代碼寫完了矾湃,本地測試一下,發(fā)現(xiàn)查詢速度從 9s 降到 1s芥映,果然有效洲尊!
于是趕緊弄上服務器远豺,然后一試,變成 32s 了坞嘀!而且 cpu 躯护、內(nèi)存狂漲!
無語了丽涩,趕緊回滾了棺滞。

事后分析,大概是因為數(shù)據(jù)量太大矢渊,服務器也處理不過來了……

試試緩存继准?

這事只好作罷,心里想矮男,慢點就慢點吧移必,反正也是自己人用。
但是渠道那邊又來找了毡鉴,說是我們的 api 拉取超時了崔泵。這下就比較難辦了,渠道那邊超時猪瞬,可能會影響我們正常的業(yè)務憎瘸。況且這種現(xiàn)象如果聽之任之,最終可能引發(fā)雪崩效應陈瘦,到時就麻煩了幌甘。

但是現(xiàn)在數(shù)據(jù)庫優(yōu)化很蛋疼,怎么辦呢痊项?這時還是應該從業(yè)務角度考慮锅风,渠道要的數(shù)據(jù)并不是實時數(shù)據(jù),所以完全可以用緩存頂一下嘛线婚。

django 的話遏弱,直接用 django-cacheops 就行了,挺好用的塞弊,直接在 queryset 后面加個 .cache() 就可以啟用緩存了漱逸,當然配置里面要設置一下,不然它默認對所有查詢都緩存就不好了游沿,畢竟運營要看到的是實時數(shù)據(jù)饰抒。

代碼改好了,部署上去诀黍,加載時間立即縮短了10倍袋坑!而且不是光 api 接口,連報表的查詢也大大縮短了眯勾!真是意外的驚喜啊枣宫。

所以從這件事可以總結(jié)出2個道理:

  1. sql 查詢變慢了婆誓,不一定是這條 sql 本身,可能是慢查詢太多也颤,導致它被拖累了
  2. 緩存一定要用上洋幻,減少數(shù)據(jù)庫的壓力是非常有必要的。

redis 的問題

不過翅娶,剛高興沒多久呢文留,也就1、2分鐘吧竭沫,接口就報 500 錯誤了燥翅,異常信息提示 Connection closed by server ,郁悶蜕提,趕緊回滾森书。然后就在本地測,結(jié)果一點問題沒有贯溅。我猜可能是配置不一樣拄氯,但具體是哪個參數(shù)我也不知道了。

然后就是上網(wǎng)查資料它浅,發(fā)現(xiàn)一個參數(shù) timeout 貌似有用。分別在本地和服務器端看了下镣煮,原來本地 timeout = 0姐霍,服務器是 timeout = 60 。把它改過來之后典唇,終于正常了镊折。

不過呢,最近遇到的 redis 的問題挺多的介衔,比如服務器上經(jīng)常遇到 use of closed network connection 恨胚,這個就挺郁悶的,完全不知道怎么下手炎咖。

現(xiàn)在疏理一下赃泡,timeout 是 redis 用來控制客戶端連接的。如果 timeout > 0 的話乘盼,如果客戶端持續(xù) timeout 秒沒有活動升熊,redis 就會關(guān)閉這個連接。

如果設置成 timeout = 0绸栅,就表示永遠不關(guān)閉级野。

問題在于,admin 服務器請求量小粹胯,確實可能 60s 里沒有活動蓖柔,redis 可以關(guān)閉它辰企,但是廣告服務器請求量很大,為什么還是會關(guān)閉呢况鸣?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蟆豫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子懒闷,更是在濱河造成了極大的恐慌十减,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愤估,死亡現(xiàn)場離奇詭異帮辟,居然都是意外死亡,警方通過查閱死者的電腦和手機玩焰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門由驹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昔园,你說我怎么就攤上這事蔓榄。” “怎么了默刚?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵甥郑,是天一觀的道長。 經(jīng)常有香客問我荤西,道長澜搅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任邪锌,我火速辦了婚禮勉躺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘觅丰。我一直安慰自己饵溅,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布妇萄。 她就那樣靜靜地躺著蜕企,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嚣伐。 梳的紋絲不亂的頭發(fā)上糖赔,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音轩端,去河邊找鬼放典。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的奋构。 我是一名探鬼主播壳影,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弥臼!你這毒婦竟也來了宴咧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤径缅,失蹤者是張志新(化名)和其女友劉穎掺栅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纳猪,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡氧卧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了氏堤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沙绝。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鼠锈,靈堂內(nèi)的尸體忽然破棺而出闪檬,到底是詐尸還是另有隱情,我是刑警寧澤购笆,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布粗悯,位于F島的核電站,受9級特大地震影響由桌,放射性物質(zhì)發(fā)生泄漏为黎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一行您、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剪廉,春花似錦娃循、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泉沾,卻和暖如春捞蚂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跷究。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工姓迅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓丁存,卻偏偏與公主長得像肩杈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子解寝,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容