开发实践6_缓存^中间件

以下学习 朔宁夫 开发工程师 课程。

缓存可提高程序响应速度。数据库缓存(可过期)/ Redis缓存(Key:Value)/ Memcacheed缓存/ 程序层缓存。

一 缓存

1. 数据库缓存

创建缓存数据表 //

python manage.py createcachetable cache_table

setting //

# 缓存配置
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 
        # 数据库缓存 声明此时django项目使用数据库缓存方式进行缓存
        'LOCATION': 'cache_table'  
        # 指定数据库缓存表的名称
    }
}

创建新的演示 app //

 python manage.py startapp cache_app

setting注册、项目链接总路由、app创建子路由。

path('cache/',include('cache_app.urls', namespace="cache")),

views //

import time

from django.core.cache import caches
from django.http import HttpResponse
from django.shortcuts import render


def db_show(request):
    #  实例化缓存对象
    db_cache = caches["default"]
    #  判断缓存师傅存在
    cache_data = db_cache.get("data_cache")  # 缓存的数据
    if cache_data:
        print("命中缓存")
        return HttpResponse(cache_data)
    print("没有命中,开始查找······")
    time.sleep(10)
    data = ['new algorithm', 'new application', 'combining models', 'data mining']
    response = render(request, "advance.html", {"data": data})
    #  设置缓存
    db_cache.set("data_cache", response.content, timeout=30)
    return response

sub route//

app_name = "cache"

urlpatterns = [
    path('db/', db_show),
]

advance.html //

    {% for i in data %}
  • {{ i }}
  • {% endfor %}

2. Redis缓存

# 安装依赖 # pip install django-redis # pip install django-redis-cache

wget http://download.redis.io/releases/redis-5.0.3.tar.gz

or

Releases · tporadowski/redis · GitHub

Windows下安装Redis7.0.8_redis7.0.8解压版安装-CSDN博客

最终找资源安装了github上的7+需编译版。安装完成后

1) “服务” 启动 get readyxxx,redis 2项

2)管理员cmd cd /d D:\mysql\redis , redis-server.exe redis.conf , 

3)管理员cmd cd /d D:\mysql\redis , redis-cli.exe -h 127.0.0.1 -p 6379 , set a 1 ,  get a

4)django terminal  D:\mysql\redis> .\redis-cli.exe  , ping , select 15 , keys *。可见我的15号库是空的。

setting //

CACHES = {
    #  数据库缓存
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        # 数据库缓存 声明此时django项目使用数据库缓存方式进行缓存
        'LOCATION': 'cache_table'
        # 指定数据库缓存表的名称
    },
    #  Redis 缓存 (Redis有[0,15]个库select k, 默认0对应6379)
    #  安装依赖
    #  pip install django-redis
    #  pip install django-redis-cache
    'redis_cache': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/2',  # 设置为本机 2号库
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient'
        }
    }
}

views //

def redis_show(request):
    #  实例化缓存对象
    redis_cache = caches["redis_cache"]
    #  判断缓存师傅存在
    cache_data = redis_cache.get("data_cache")  # 缓存的数据
    if cache_data:
        print("命中缓存")
        return HttpResponse(cache_data)
    print("没有命中,开始查找······")
    time.sleep(10)
    data = ['new algorithm', 'new application', 'combining models', 'data mining']
    response = render(request, "advance.html", {"data": data})
    #  设置缓存
    redis_cache.set("data_cache", response.content, timeout=30)
    return response

访问页面,未过期时终端可见2号库中数据

开发实践6_缓存^中间件_第1张图片

3. memcached缓存

#  memcached
#  一个单独的服务系统,有自己的端口号
#  pip install python-memcached
'mem_cached': {
    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCach',  # 指定缓存使用的引擎
    'LOCATION': '127.0.0.1:11211'
}

4. 程序层缓存

django中使用最多的一种方式

① 用装饰器

views //

@cache_page(30)  #  先看有没有缓存,再绝对是否调用函数
def show(request):
    print('无系统缓存,执行对本函数的调用')
    data = ['new algorithm', 'new application', 'combining models', 'data mining']
    return render(request, "advance.html", {"data": data})

开发实践6_缓存^中间件_第2张图片

②放到urls中使用

url //

path('pro_url/', cache_page(30)(url_show))

views //

def url_show(request):
    print('无系统缓存,执行对本函数的调用')
    data = ['new algorithm', 'new application', 'combining models', 'data mining']
    return render(request, "advance.html", {"data": data})

二 中间件

中间件本质上是一个类。AOP思想。aspect oriented programming, 面向切面编程。AOP&OOP。实现:注册+添加方法。

需要复写的方法(自定义的middleware类中添加相关执行时机的方法):1)process_request(self,request)请求预处理方法;2)process(self, request, view, args, kwargs) View预处理方法;3)process_response(self, request, response)Response后处理方法;4)process_exception(self, request, exception) Exception后处理方法。

演示:

项目层new python package my_middleware

package下new my_middleware.py //

from urllib import response

from django.utils.deprecation import MiddlewareMixin


class MyFirstMiddleWare(MiddlewareMixin):
    def process_request(self, request):
        print("1--process_request")

    def process_view(self, request, view, args, kwargs):
        print("2--process_view")

    def process_response(self, request, response):
        print("3--precess_response")
        return response

class MySecondMiddleWare(MiddlewareMixin):
    def process_request(self, request):
        print("21--process_request")

    def process_view(self, request, view, args, kwargs):
        print("22--process_view")

    def process_response(self, request, response):
        print("23--precess_response")
        return response

注册 setting  注意列表元素有序,遍历先后问题//

MIDDLEWARE = [xxx,

'my_middleware.my_middleware.MyFirstMiddleWare',

'my_middleware.my_middleware.MySecondMiddleWare',]

访问某个页面 //

# 从前往后遍历中间件,但response从后往前

开发实践6_缓存^中间件_第3张图片

你可能感兴趣的:(缓存)