Redis快取網頁及資料行

2022-04-03 02:12:31 字數 3100 閱讀 6747

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

flask+redis使用快取頁面的功能:

import

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)

關於flask其他快取方面:使用 flask-cache 快取應用

前面提到了快取網頁來提速,這種方式在有些情況是不適合的,比如電商**中**活動,**不能對整個**頁面進行快取,因為會導致使用者看到錯誤的商品剩餘數量,但是使用者每次重新整理都走資料庫,會給資料庫帶來巨大的壓力,並導致我們花費額外的成本擴充套件資料庫。

我們應該怎麼做?整個頁面需要更新的只是商品資訊,我們可以只對資料行進行快取(商品在資料庫對應的一行)。具體做法:編寫應該持續執行的守護程序函式,讓這個函式將將指定的資料行快取到redis中,並不定期的對這些快取資料進行更新,快取資料編碼為json字典儲存到redis字串中,資料列的名字被對映為json字典的鍵,資料行的值被對映為json字典的值。怎麼更新,通過ajax技術將快取非同步重新整理。

import

time

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...