首页 > 技术文章 > django的缓存

niuyeji648 2021-07-06 20:34 原文

数据库的表类型(存储引擎)有:MyISAM(mysql8.0以后移除)/ InnoDB(mysql5.0版本以后新增)/ memory(内存)

缓存

  • 缓存就是一种优化网站性能的方案,是一个利刃,用的好可以给服务器大量降压,用得不好,反而成为压垮骆驼的最后一根草。

  • 所谓的缓存,实际上往往是把数据库中数据提取出来,并临时存放到一个第三方设备/文件中。

  • 一般常见的缓存存储介质:内存(redis/memcached/mysql的内存表),硬盘文件中,CDN(内容分发网络)

  • 对于中等流量的网站来说,尽可能地减少开销是必要的。缓存数据就是为了保存那些需要很多计算资源的结果,这样的话就不必在下次重复消耗计算资源

  • Django自带了一个健壮的缓存系统来保存动态页面,避免对于每次请求都重新计算

  • Django提供了不同级别的缓存粒度:可以缓存特定视图的输出、可以仅仅缓存那些很难生产出来的部分、或者可以缓存整个网站

    • 视图缓存

    • 模板缓存

    • 缓存API

设置缓存

  • 通过设置决定把数据缓存在哪里,是数据库中、文件系统还是在内存中

  • 通过settings文件的CACHES配置来实现

  • 参数TIMEOUT:缓存的默认过期时间,以秒为单位,这个参数默认是300秒,即5分钟;设置TIMEOUT为None表示永远不会过期,值设置成0造成缓存立即失效

CACHES={
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'TIMEOUT': 60,
    }
}

需要安装包并配置如下:

安装包:pip install django-redis-cache 或者 pip install django_redis

CACHES = {
    "default": {
        
        "BACKEND": "redis_cache.cache.RedisCache", # django-redis-cache
        # "BACKEND": "django_redis.cache.RedisCache", #  django_redis
        "LOCATION": "redis://:@127.0.0.1:6379/1",  # 数据源格式连接写法  mysql://账号:密码@IP:端口/数据库名称?
        'TIMEOUT': 60, # 缓存失效时间,这里60秒只是为了测试而已
    },
}

可以连接redis查看存的数据

# 终端下连接redis,进行redis交互终端:
redis-cli
# 切换数据库:
select 1
# 设置一个数据,保存到指定变量名中 set 变量 值
set name xiaoming
# 查看数据的变量(键/key):
keys *
# 获取指定变量名的数据:
get 键

视图缓存

  • django.views.decorators.cache定义了cache_page装饰器,用于对视图的输出进行缓存

  • 示例代码如下:

from django.views.decorators.cache import cache_page
# 函数视图
@cache_page(60 * 15)
def index(request):
    return HttpResponse('hello!')

# 类视图
from django.views.decorators.cache import cache_page  # 这个方法方法只能用于装饰函数视图
# 针对一些只能用于装饰函数视图的装饰器,想要在类视图方法中使用必须要使用 method_decorator 来改写
class Home(View):
    @method_decorator(cache_page(60 * 15))
    def get(self,request):
        print("hello") # 执行了这里的hello,则表示缓存失效了。
        return HttpResponse('Hello, async base view!')
  • cache_page接受一个参数:timeout,秒为单位,上例中缓存了15分钟

  • 视图缓存与URL无关,如果多个URL指向同一视图,每个URL将会分别缓存

缓存API

from django.core.cache import cache
设置:cache.set(键,值,有效时间)
获取:cache.get(键)
删除:cache.delete(键)
清空:cache.clear() # 慎用

视图

from django.core.cache import cache
class CacheView(View):
    def get(self,request):
        # 通过缓存api先查询缓存
        student_list = cache.get("student_list")
        if not student_list:
            print("如果没有缓存,则到数据库查询")
            student_list = Student.objects.all()
            # 查询完成建立缓存
            cache.set("student_list", student_list, 60)
        print(student_list)
        return HttpResponse("ok")

 

 

推荐阅读