緩存網頁
在有些網站上的首頁不會經常發生大的變化,這些頁面不需要每次載入都要動態生成的內容,我們可以使用緩存來降低網站處理相同負載所需的服務器數量,並讓網站的速度變得更快。
Flask+Redis使用緩存頁面的功能:
import redis from flask import Flask,request app = Flask(__name__) @app.route('/index') def index(): conn = redis.Redis(connection_pool=pool) content = cache_request(conn,request.url,callback) return content def cache_request(conn,request,callback): # 1.判斷請求是否可以被緩存 if not can_cache(conn,request): return callback(request) # 2.生成key page_key = "cache" + hash_request(request) print("page_key:",page_key) #3.判斷是否已經被緩存 content = conn.get(page_key) #如果沒有被緩存,則生成緩存,過期時間300秒 if not content: content = callback(request) conn.setex(page_key,300,content) return content #判斷此請求是否應該被緩存 def can_cache(conn,request): return True # def hash_request(request): return str(hash(request)) def callback(request): return '<h1>Hello World!</h1>' if __name__ == '__main__': pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) app.run(host='127.0.0.1',port=8080,debug=True) # pool = redis.ConnectionPool(host='localhost', password='密碼',port=6379, decode_responses=True) # pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
關於flask其他緩存方面:使用 Flask-Cache 緩存應用
緩存數據行
前面提到了緩存網頁來提速,這種方式在有些情況是不適合的,比如電商網站中促銷活動,網站不能對整個促銷頁面進行緩存,因為會導致用戶看到錯誤的商品剩余數量,但是用戶每次刷新都走數據庫,會給數據庫帶來巨大的壓力,並導致我們花費額外的成本擴展數據庫。
我們應該怎么做?整個頁面需要更新的只是商品信息,我們可以只對數據行進行緩存(商品在數據庫對應的一行)。具體做法:編寫應該持續運行的守護進程函數,讓這個函數將將指定的數據行緩存到redis中,並不定期的對這些緩存數據進行更新,緩存數據編碼為json字典存儲到redis字符串中,數據列的名字被映射為json字典的鍵,數據行的值被映射為json字典的值。怎么更新,通過ajax技術將緩存異步刷新。

import time import json def schedule_row_cache(conn,row_id,delay): #兩個有序集合 #存儲對應id數據的緩存時間 conn.zadd('delay:',row_id,delay) #存儲對應id數據下次更新時間 conn.zadd('schedule:', row_id, time.time()) def cache_rows(conn): while 1: # zrange返回有序集 key 中,指定區間內的成員。 # 其中成員的位置按 score 值遞增(從小到大)來排序。 #這里一直獲取第一個成員 #返回一個或者零個元組的列表 next = conn.zrange('schedule:',0,0,withscores=True) now = time.time() #小於則需要緩存,大於則不需要 if not next or next[0][1] > now: time.sleep(.05) #獲取對應id row_id = next[0][0] #根據id獲取緩存的時間 delay = conn.zscore('delay:',row_id) if delay <= 0: conn.zrem('delay:', row_id) conn.zrem('delay:', row_id) conn.delete('inv:'+ row_id) continue #從數據庫獲取對應id下的數據 row = get(row_id) # 更新 conn.zadd('schedule:',row_id,now + delay) #更新緩存 conn.set('inv:' + row_id, json.dumps(row.to_dict())) def get(id): pass
