在有些**上的首頁不會經常發生大的變化,這些頁面不需要每次載入都要動態生成的內容,我們可以使用快取來降低**處理相同負載所需的伺服器數量,並讓**的速度變得更快。
flask+redis使用快取頁面的功能:
import關於flask其他快取方面:使用 flask-cache 快取應用redis
from flask import
flask,request)'
/index')
defindex():
conn = redis.redis(connection_pool=pool)
content =cache_request(conn,request.url,callback)
return
content
defcache_request(conn,request,callback):
#1.判斷請求是否可以被快取
ifnot
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秒
ifnot
content:
content =callback(request)
conn.setex(page_key,300,content)
return
content
#判斷此請求是否應該被快取
defcan_cache(conn,request):
return
true
#def
hash_request(request):
return
str(hash(request))
defcallback(request):
return''
if__name__ == '
__main__':
pool = redis.connectionpool(host='
localhost
', port=6379, decode_responses=true)
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)
前面提到了快取網頁來提速,這種方式在有些情況是不適合的,比如電商**中**活動,**不能對整個**頁面進行快取,因為會導致使用者看到錯誤的商品剩餘數量,但是使用者每次重新整理都走資料庫,會給資料庫帶來巨大的壓力,並導致我們花費額外的成本擴充套件資料庫。
我們應該怎麼做?整個頁面需要更新的只是商品資訊,我們可以只對資料行進行快取(商品在資料庫對應的一行)。具體做法:編寫應該持續執行的守護程序函式,讓這個函式將將指定的資料行快取到redis中,並不定期的對這些快取資料進行更新,快取資料編碼為json字典儲存到redis字串中,資料列的名字被對映為json字典的鍵,資料行的值被對映為json字典的值。怎麼更新,通過ajax技術將快取非同步重新整理。
importtime
import
json
defschedule_row_cache(conn,row_id,delay):
#兩個有序集合
#儲存對應id資料的快取時間
conn.zadd('
delay:
',row_id,delay)
#儲存對應id資料下次更新時間
conn.zadd('
schedule:
', row_id, time.time())
defcache_rows(conn):
while 1:
#zrange返回有序集 key 中,指定區間內的成員。
#其中成員的位置按 score 值遞增(從小到大)來排序。
#這裡一直獲取第乙個成員
#返回乙個或者零個元組的列表
next = conn.zrange('
schedule:
',0,0,withscores=true)
now =time.time()
#小於則需要快取,大於則不需要
ifnot 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()))
defget(id):
pass
Ajax非同步載入資料及Redis快取
針對網頁分類條目的動態載入,圖為頁面的head部分。categorylistservlet 準備分類資料 productservice service new productservice list categorylist service.findallcategorylist response....
用Redis快取Web網頁的分頁資料
zset資料結構補充 redis中存放資料都是將資料序列化放入記憶體中,所以將物件序列化有兩種方式 流序列和json zadd key,score,members 向key的鍵下面新增元素,排序方式預設是以score的字典公升序,score是double型別的值,不能傳錯了。這裡的key可以認為是指...
redis快取資料
快取資料的步驟 查詢快取,如果沒有資料,則查詢資料庫 查詢資料庫,如果資料不為空,將結果寫入快取 快取資料容易造成如下問題 快取穿透 快取擊穿 快取失效 快取穿透 什麼叫快取穿透?一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 如果key對應的v...