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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?