Redis緩存網頁及數據行


 

緩存網頁

在有些網站上的首頁不會經常發生大的變化,這些頁面不需要每次載入都要動態生成的內容,我們可以使用緩存來降低網站處理相同負載所需的服務器數量,並讓網站的速度變得更快。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM