django的缓存
数据库的表类型(存储引擎)有: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 键
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!')
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")