django-redis配置
REDIS = True
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
},
"redis": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://...",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": None,
}
}
}
CACHE_MIDDLEWARE_KEY_PREFIX = ''
CACHE_MIDDLEWARE_SECONDS = 600
CACHE_MIDDLEWARE_ALIAS = 'redis' if REDIS else 'default'
REDIS_SENTINELADDRESS = [
]
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = 'redis' if REDIS else 'default'
SESSION_COOKIE_AGE = 60 * 60 * 12
SESSION_SAVE_EVERY_REQUEST = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
设置静态化页面
确保 settings.py里面开启了缓存(redis=True)
from django.views.decorators.cache import cache_page
@cache_page(15 * 60)
def index(request):
pass
if REDIS:
MIDDLEWARE.insert(0, 'django.middleware.cache.UpdateCacheMiddleware', )
MIDDLEWARE.append('django.middleware.cache.FetchFromCacheMiddleware')
{% load cache %}
{% cache 时间(秒) 变量(字符串) %}
...缓存内容...
{% endcache %}
优化表读取频率(可以极大减少访问mysql的次数)
from django.core.cache import caches
conn = caches['redis']
def cache_for_orm(cache_key_prefix, conn=conn, timeout=60 * 60):
"""
django ORM 缓存器
>>> area_model = Area().get_by_id(31)
Out: <Area: 新疆>
>>> id(area_model)
Out: 2772707219216
>>> area_model.get_by_id(30)
Out: <Area: 宁夏>
>>> id(area_model)
Out: 2772707219216
食用方式:
在model中添加
------------------------------------------
@classmethod
@cache_for_orm('area: {}', cache_store)
def get_by_id(cls, _id, state):
return cls.objects.get(pk=_id), state
------------------------------------------
关于重置缓存(可以使数据即时生效):
在model中添加
----------------------------------------------------------------
def set_cache(self, cache_key_prefix, conn, timeout=60 * 60):
model = __class__.objects.get(pk=self.pk)
conn.set(cache_key_prefix.format(model.pk), model, timeout)
return model
----------------------------------------------------------------
:param cache_key_prefix:
缓存的键 确保唯一
:param conn:
django缓存模块,你可以从这里导入它
from django.core.cache import caches
redis_cache = caches['redis']
:param timeout:
缓存时间/秒,默认为1小时
:return: ORM model
"""
def wraps(cls_method):
def get_by_id(cls, _id, cache_state=True):
key = cache_key_prefix.format(_id)
model = conn.get(key, None)
if model is None:
model, cache_state = cls_method(cls, _id, cache_state)
if cache_state:
conn.set(key, model, timeout)
return model
return get_by_id
return wraps