Django是动态网站,每次请求都会数据库中进行相应的操作。当访问量很大时,耗时就会增加。
缓存将某个views的返回值保存至内存或者memcache中,在设置的时间内,再有访问过来时,就不再执行view中的操作,而是直接从缓存中取值
缓存机制:每次有请求进来,先去看缓存是否有,有且未过期,直接拿值
如果缓存没有或者已过期,就要走视图,走数据库
Django中提供了6种缓存方式:
1.虚拟缓存
2.memchched缓存
3. 数据库缓存
4. 文件系统缓存
5.本地内存缓存
6.自定义缓存
1.虚拟缓存:在不做任何事情的情况下实现缓存接口
使用场景:
如果你的生产环境在多个地方重度使用缓存,但是生产/测试环境你不想用缓存,
而又不想因为特例而更改代码,虚拟缓存就很有用了
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎 'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存个数(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) }, } }
2.Memcached缓存
最快的,最高效的缓存系统,django提供原生支持,所有数据都存在内存
1.基于python-memcached模块
此缓存使用python-memcached模块连接memcache
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', '172.19.26.244:11213', ] } } 2.此缓存使用pylibmc模块连接memcache CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] } } 不足:缓存完全在内存中,一旦服务器崩溃,所有的数据将不复存在
3.数据库缓存 使用数据库缓存,需要在数据库中建立一个用于缓存的数据库表
python manage.py createcachetable [cache_table_name] CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', } 数据库缓存使用的是你配置文件中的数据库,(如DATABASES中是mysql,缓存使用的就是mysql数据库)
4.文件系统缓存
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', #'LOCATION': 'c:/foo/bar',#windows下的示例 } } LOCATION设置为缓存所在的位置,注意是绝对位置同时必须保证服务器对列出的路径具有读写权限
5.本地内存缓存:
想具有内存缓存的优点但有没有能力运行Memcached的时候,可以考虑本地内存缓存
特点:每个进程和线程都是安全的
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake' } } LOCATION用来区分每个内存存储,如果只有一个本地内存缓存,你可以忽略这个设置 不足:每个进程都有自己的私有缓存实例,本地内存缓存效率不是特别高,建议只是在内部开发测时使用
6.自定义缓存:
如使用redis缓存: 1.安装 pip install django-redis 2.在stting中配置CACHES,可以设置多个缓存,根据名字使用 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "密码", } } }, #另添加缓存 "JERD": { } 3.根据名字去连接池中获取连接 from django_redis import get_redis_connection conn = get_redis_connection("default")