一、Django六种缓存方式(都是在settings中设置)
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) }, 'KEY_PREFIX': '', # 缓存key的前缀(默认空) 'VERSION': 1, # 缓存key的版本(默认1) 'KEY_FUNCTION' 函数名 # 生成key的函数(默认函数会生成为:【前缀:版本:key】) } } # 自定义key 可用于‘KEY_FUNCTION' def default_key_func(key, key_prefix, version): """ 自定义生成key的函数 """ return '%s:%s:%s' % (key_prefix, version, key) def get_key_func(key_func): """ 如果key_func是空 默认使用 default_key_func 否则,则使key_func函数 """ if key_func is not None: #检查该函数是否可以调用 if callable(key_func): return key_func else: return import_string(key_func) return default_key_func
2、内存缓存
# 此缓存将内容保存至内存的变量中 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', #设置一个唯一值 } } # 注:其他配置同开发调试版本,就是将开发调试版本里面的这几句换成上面这个即可
3、文件缓存(适合小网站)
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', #缓存文件路径 } }
#其他配置跟开发调试一样
4、数据库
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', # 数据库表 } }
#其他设置跟开发调试的一样
5.1、Memcache缓存(python-memcached模块)
#方式1 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', #指定缓存服务器IP地址和端口 } } #方式2 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
# 指定指定局域网内的主机名加socket套接字为Memcache缓存服务器 'LOCATION': 'unix:/tmp/memcached.sock', } } # 方式3 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ #指定一台或多台主机IP地址和端口为缓存服务器 '172.19.26.240:11211', '172.19.26.242:11211', ] } } # 方式4 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ #以元组的形式,第一个放缓存服务器的IP跟端口 #第二个参数放权重 ('172.19.26.240:11211',5), ('172.19.26.242:11211',1) ] } }
# 注:其他配置同开发调试版本,就是将开发调试版本里面的这几句换成上面这个即可
5.2、Memcache缓存(pylibmc模块)
#方式1 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '127.0.0.1:11211', #指定IP和端口为缓存服务器 } } # 方式2 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', #指定局域网内的主机名加socket套接字为Memcache缓存服务器 'LOCATION': '/tmp/memcached.sock', } } #方式3 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': [ #分布式缓存,程序会把以下多台服务器当作一个单独的缓存, #不会再每台服务器上复制缓存值 '172.19.26.240:11211', '172.19.26.242:11211', ] } }
# 注:其他配置同开发调试版本,就是将开发调试版本里面的这几句换成上面这个即可
6、Redis缓存(需要安装django-redis)
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": "密码", } } }
# 视图中操作 from django_redis import get_redis_connection conn = get_redis_connection("default")
二、缓存应用
1、前后端混合开发使用
(1)全站缓存
在settings文件中的中间件最上跟最下分别配置一个update,fetch中间件
MIDDLEWARE = [ # Update必须放在第一个, 'django.middleware.cache.UpdateCacheMiddleware', # 其他中间件... #Fetch必须放在最后一个 'django.middleware.cache.FetchFromCacheMiddleware', ]
CACHE_MIDDLEWARE_SECONDS = 10 #全站缓存的时间
(2)单页面缓存
#方法一:在视图函数上加装饰器 from django.views.decorators.cache import cache_page @cache_page(5) #缓存5秒 def test(request): ctime=time.time() return render(request,'test.html',locals()) #方法二:在路由上配置装饰器 from django.views.decorators.cache import cache_page urlpatterns=[ url(r'test',cache_page(5)(views.test)), ]
(3)页面局部缓存
# a. 引入TemplateTag {% load cache %} # b. 使用缓存 {% cache 5000 缓存key %} 缓存内容 {% endcache %} #例子: {% load cache %} # key可以随便取 {% cache 10 'name' %} <h2>{{ ctime }}</h2> {% endcache %}
2、前后端分离的使用
from django.core.cache import cache cache.set('key',value可以是任意数据类型) cache.get('key')
#例子 from django.core.cache import cache def test(request): if cache.get('key'): ctime=cache.get('key') else: ctime=time.time() cache.set('key',ctime) return render(request,'test.html',locals())