一.写在前面
Django缓存可分为内置缓存,redis缓存;也可以将他们混合在一起使用,本次测试主要围绕着Django缓存设置开展。
二.内置缓存方式(数据库)
1.首先在数据库中创建一个缓存表
C:\Users\Michael Jiang\Desktop\django_test\mysite>py manage.py createcachetable my_cache
2.在项目设置setting.py中添加CACHES配置
# cache setting
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache',
'TIMEOUT': 300,
}
}
3.编写一个新闻news的路由
path('news', views.news, name='news'),
4.在views.py中编写对应的视图函数
def news(requests):
news_list = []
for i in range(10):
news_list.append("关于打赢脱贫攻坚战,牢记习近平的这些叮嘱 %d" % i)
time.sleep(5)#假装获取新闻延时
data = {
'news_list': news_list,
}
return render(requests, 'news.html', context=data)
5.编写对应模板news.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>News</title>
</head>
<body>
{% for news in news_list%}
<h2>{{news}}</h2>
{% endfor %}
</body>
</html>
打开chrome测试一下,没有问题。
这是模拟没有缓存的情况,每次加载都延迟5S
第一种装饰器方式
@cache_page(30)
def news(requests):
news_list = []
for i in range(10):
news_list.append("关于打赢脱贫攻坚战,牢记习近平的这些叮嘱 %d" % i)
time.sleep(5)
data = {
'news_list': news_list,
}
return render(requests, 'news.html', context=data)
只需简单添加一行@cache_page(30)
即可实现缓存!
再去刷新,第一次需要等待,以后再刷就秒开了
去数据库中看一下里面存的什么东西
下面在看第二种手动方式:
# @cache_page(30)
def news(requests):
result = cache.get("news")
if result:
return HttpResponse(result)
news_list = []
for i in range(10):
news_list.append("关于打赢脱贫攻坚战,牢记习近平的这些叮嘱 %d" % i)
time.sleep(5)
data = {
'news_list': news_list,
}
response= render(requests, 'news.html', context=data)
cache.set("news", response.content, timeout =60)
return response
三.Redis缓存
巧了昨天开坑今天就用上了,哈哈
目前Django官方还没有推出Redis的原生资瓷,所以得手动安装两个包
pip install django-redis -i https://pypi.mirrors.ustc.edu.cn/simple
pip install django-redis-cache -i https://pypi.mirrors.ustc.edu.cn/simple
然后去VM中把Redis起起来,顺便看一下IP地址
接下来配置设置setting.py
# cache setting
CACHES = {
'default': {
# 'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
# 'LOCATION': 'my_cache',
# 'TIMEOUT': 300,
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://192.168.31.116/1",
"OPTIONS":{
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "123456",
}
}
}
配置好后重启服务器,把虚拟机的Redis也起起来
打开chrome然后报错如下
由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
好吧,顺手把虚拟机的linux防火墙关了(centos7)
查看防火墙状态
systemctl list-unit-files|grep firewalld.service
关闭防火墙
systemctl stop firewalld.service
禁止防火墙自启
systemctl disable firewalld.service
OK?
OK!
接下来打开Redis客户端看看
[root@MiWiFi-R3-srv bin]# ./redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> KEYS *
(empty list or set)
127.0.0.1:6379[1]> KEYS *
1) ":1:news"
127.0.0.1:6379[1]> GET :1:news
"\x80\x04\x95\xd7\x03\x00\x00\x00\x00\x00\x00B\xd0\x03\x00\x00<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n
<meta charset=\"UTF-8\">\n <title>News</title>\n</head>\n<body>\n \n <h2>\xe5\x85\xb3\xe4\xba\x8e
\xe6\x89\x93\xe8\xb5\xa2\xe8\x84\xb1\xe8\xb4\xab\xe6\x94\xbb\xe5\x9d\x9a\xe6\x88\x98\xef\xbc\x8c\xe7\x89\xa2
\xe8\xae\xb0\xe4\xb9\xa0\xe8\xbf\x91\xe5\xb9\xb3\xe7\x9a\x84\xe8\xbf\x99\xe4\xba\x9b\xe5\x8f\xae\xe5\x98\xb1
0</h2>\n \n <h2>\xe5\x85\xb3\xe4\xba\x8e\xe6\x89\x93\xe8\xb5\xa2\xe8\x84\xb1\xe8\xb4\xab\xe6\x94\
xbb\xe5\x9d\x9a\xe6\x88\x98\xef\xbc\x8c\xe7\x89\xa2\xe8\xae\xb0\xe4\xb9\xa0\xe8\xbf\x91\xe5\xb9\xb3\xe7\x9a\
x84\xe8\xbf\x99\xe4\xba\x9b\xe5\x8f\xae\xe5\x98\xb1 1</h2>\n \n <h2>\xe5\x85\xb3\xe4\xba\x8e\xe6\x
89\x93\xe8\xb5\xa2\xe8\x84\xb1\xe8\xb4\xab\xe6\x94\xbb\xe5\x9d\x9a\xe6\x88\x98\xef\xbc\x8c\xe7\x89\xa2\xe8\x
ae\xb0\xe4\xb9\xa0\xe8\xbf\x91\xe5\xb9\xb3\xe7\x9a\x84\xe8\xbf\x99\xe4\xba\x9b\xe5\x8f\xae\xe5\x98\xb1 2</h2
>\n \n <h2>\xe5\x85\xb3\xe4\xba\x8e\xe6\x89\x93\xe8\xb5\xa2\xe8\x84\xb1\xe8\xb4\xab\xe6\x94\xbb\xe5\
x9d\x9a\xe6\x88\x98\xef\xbc\x8c\xe7\x89\xa2\xe8\xae\xb0\xe4\xb9\xa0\xe8\xbf\x91\xe5\xb9\xb3\xe7\x9a\x84\xe8\xb
f\x99\xe4\xba\x9b\xe5\x8f\xae\xe5\x98\xb1 3</h2>\n \n <h2>\xe5\x85\xb3\xe4\xba\x8e\xe6\x89\x93\xe8\x
b5\xa2\xe8\x84\xb1\xe8\xb4\xab\xe6\x94\xbb\xe5\x9d\x9a\xe6\x88\x98\xef\xbc\x8c\xe7\x89\xa2\xe8\xae\xb0\xe4\xb9
xa0\xe8\xbf\x91\xe5\xb9\xb3\xe7\x9a\x84\xe8\xbf\x99\xe4\xba\x9b\xe5\x8f\xae\xe5\x98\xb1 4</h2>\n \n
<h2>\xe5\x85\xb3\xe4\xba\x8e\xe6\x89\x93\xe8\xb5\xa2\xe8\x84\xb1\xe8\xb4\xab\xe6\x94\xbb\xe5\x9d\x9a\xe6\x88\x
98\xef\xbc\x8c\xe7\x89\xa2\xe8\xae\xb0\xe4\xb9\xa0\xe8\xbf\x91\xe5\xb9\xb3\xe7\x9a\x84\xe8\xbf\x99\xe4\xba\x9b
127.0.0.1:6379[1]>
有了。
四.多缓存
还是修改setting.py
# cache setting
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache',
'TIMEOUT': 300,
},
'redis_backend': {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://192.168.31.116:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "123456",
}
}
}
修改视图函数(手动缓存版本)
# @cache_page(30)
def news(requests):
cache = caches['redis_backend']
result = cache.get("news")
if result:
return HttpResponse(result)
news_list = []
for i in range(10):
news_list.append("关于打赢脱贫攻坚战,牢记习近平的这些叮嘱 %d" % i)
time.sleep(5)
data = {
'news_list': news_list,
}
response= render(requests, 'news.html', context=data)
cache.set("news", response.content, timeout=60)
return response
cache = caches['redis_backend']
多出来的这句是指定当前要缓存的地方。
当然也可以使用装饰器方式
@cache_page(30, cache='redis_backend')
def news(requests):
news_list = []
for i in range(10):
news_list.append("关于打赢脱贫攻坚战,牢记习近平的这些叮嘱 %d" % i)
time.sleep(5)
data = {
'news_list': news_list,
}
response = render(requests, 'news.html', context=data)
return response
OK,NICE