目的
本关目的:实现使用Redis
缓存网页。
相关知识
本文将教会你掌握:1
.SETEX
命令,2
.hash()
方法。
在动态生成网页的时候,通常会使用模板(template
)来简化网页的生成,现在已经不再需要我们手写一整个页面。通常,一个网页包括头部,尾部,侧边栏,工具栏和内容域等部分组成,每个部分都会独立使用一个模板来编写。
尽管都是动态的生成网页了,但大多数网站的内容都不会经常变化(大的变化),大多数网页的内容也是在一定周期内保持不变,这些网页就不需要动态生成。
本关卡中,我们会通过缓存的方式避免生成这些页面,减少动态生成页面所花费的时间,降低服务器的负载,提高网页访问速度。
我们需要在请求被响应之前,通过一个缓存函数判断:
- 尝试从缓存中取出该请求的响应页面并返回
- 若上述缓存不存在(失效),则:
- 响应该请求,生成页面
- 缓存至
Redis
,生存时间为10
分钟 - 将该页面返回
我们可以使用字符串键来存储缓存页面,所以你可以使用 GET
命令尝试取出缓存页面,但当我们想要缓存页面时,则应该使用 SETEX
命令,该命令和 SET
命令的区别是,它是一个原子性(atomic
)操作,关联值和设置生存时间两个动作会在同一时间内 完成,所以它在 Redis
用作缓存时很常用。它的语法如下:
sql
conn.setex(key, value, seconds)
其中:seconds
是键的生存时间,单位为秒。
我们将真实的请求响应简化一下,变为返回一个字符串 "content for http://xxx"
,这样我们整个缓存方法就是:
python
def cache_request(request_url):
page_key = 'cache:' + str(hash(request_url))
content = conn.get(page_key)
if not content:
content = "content for " + request_url
conn.setex(page_key, content, 600)
return content
其中,我们使用了 hash()
方法将一个请求的 URL
地址通过哈希编码转化成为一个字符串,该字符串和 URL
一一对应,所以我们可以使用这个哈希值作为缓存的键。