1. Python

Django-缓存

一.写在前面

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