缓存网页

在有些网站上的首页不会经常发生大的变化,这些页面不需要每次载入都要动态生成的内容,我们可以使用缓存来降低网站处理相同负载所需的服务器数量,并让网站的速度变得更快。
Flask+Redis使用缓存页面的功能:
import redis from flaskimport 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.判断请求是否可以被缓存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 #判断此请求是否应该被缓存def can_cache(conn,request):return True # def hash_request(request):return str(hash(request)) def callback(request):return'
Hello World!
'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()#小于则需要缓存,大于则不需要ifnot nextor next[0][1] > now: time.sleep(.05)#获取对应id row_id = next[0][0]#根据id获取缓存的时间 delay = conn.zscore('delay:',row_id)if delay