django-redis 配置 + 缓存

3 篇文章 0 订阅
2 篇文章 0 订阅

django-redis配置

# settings.py
REDIS = True  # 设置切换的可灵活切换选项

# 缓存redis设置
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    },
    "redis": {
        "BACKEND": "django_redis.cache.RedisCache",  # 缓存模块
        "LOCATION": "redis://...",  # redis服务器地址    		< - - - < - - - < - - - 
        "OPTIONS": {  # 设置session缓存地址为redis
            "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 = [  # 哨兵配置
    # ('127.0.0.1', 26381),
]

# session设置
SESSION_ENGINE = "django.contrib.sessions.backends.cache"  # 缓存模块
SESSION_CACHE_ALIAS = 'redis' if REDIS else 'default'  # 缓存方式
SESSION_COOKIE_AGE = 60 * 60 * 12  # 12小时 缓存时间
SESSION_SAVE_EVERY_REQUEST = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True  # 关闭浏览器,则COOKIE失效

设置静态化页面

确保 settings.py里面开启了缓存(redis=True)

# 1. 静态化单个页面
# views.py
from django.views.decorators.cache import cache_page

@cache_page(15 * 60)  # 缓存时间  不设置为settings里面默认时间
def index(request):  # 任何缓存页面的视图函数
    pass

# 2. 整个服务器静态化
# settings.py
if REDIS:  # 在中间件之后(MIDDLEWARE)
    MIDDLEWARE.insert(0, 'django.middleware.cache.UpdateCacheMiddleware', )  # 必须放在第一个 缓存
    MIDDLEWARE.append('django.middleware.cache.FetchFromCacheMiddleware')  # 必须放在最后一个 缓存

# 3. template 模板碎片化缓存
{% 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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值