震惊!Django缓存中的数据频频丢失,究竟谁是幕后黑手!

导语: Django Cache 内容不同步的真相

1.起因

昨天晚上尝试使用celery对Django缓存进行定时任务的更新, 但是发现定时任务并不能刷新到Django中, 由此开始了一阵debug

2.经过

2.1问题出现的场景

想使用一个后台任务在缓存中存放一些信息,然后在Django中有request的时候可以快速获取到页面信息, 但是失败了,用户在进入主页的时候并没有获取到后台任务在缓存中存放的信息

2.2尝试解决问题经过

首先使用celery打出cache对象的内存地址以及一些简单信息

代码逻辑如下

发现和views.py中的打出的cache内存不一

原因: 不同py进程在from django.core.cache import cache中获取的 cache 只是原型的复制品,并不是同一块内存

2.3 解决问题的过程

当然,我们的问题并没有解决,真正的原因是因为我一开始使用的是

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
}

我所使用的 LocMemCache 它的机制是不能做同步缓存的 (*见第三小节)

在更改为DatabaseCache之后,问题解决

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'django_cache',
    }
}

3.结论与文档

废话不多说,直接上官方文档吧:

Local-memory caching

This is the default cache if another is not specified in your settings file. If you want the speed advantages of in-memory caching but don’t have the capability of running Memcached, consider the local-memory cache backend. This cache is per-process (see below) and thread-safe. To use it, set BACKEND to “django.core.cache.backends.locmem.LocMemCache”. For example:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
}

The cache LOCATION is used to identify individual memory stores. If you only have one locmem cache, you can omit the LOCATION; however, if you have more than one local memory cache, you will need to assign a name to at least one of them in order to keep them separate.

Note that each process will have its own private cache instance, which means no cross-process caching is possible. This obviously also means the local memory cache isn’t particularly memory-efficient, so it’s probably not a good choice for production environments. It’s nice for development.

着重标记最后一段文档:

Note that each process will have its own private cache instance, which means no cross-process caching is possible. 注意每个进程都有自己的私有缓存实例,这意味着不可能有跨进程缓存

所以说,LocMemCache是不能用来做同步缓存的! 请使用别的任意Cache!

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

Khalil的专栏

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hadoop实操

如何使用Oozie API接口向非Kerberos环境的CDH集群提交Spark作业

在CDH集群外的节点向集群提交Spark作业的方式有多种,前面Fayson介绍了Livy相关的文章主要描述如何在集群外节点通过RESTful API接口向CDH...

3037
来自专栏猛牛哥的博客

使用Nginx反向代理做小偷站

3316
来自专栏Hadoop数据仓库

HAWQ取代传统数仓实践(五)——自动调度工作流(Oozie、Falcon)

        一旦数据仓库开始使用,就需要不断从源系统给数据仓库提供新数据。为了确保数据流的稳定,需要使用所在平台上可用的任务调度器来调度ETL定期执行。调度...

3416
来自专栏一个会写诗的程序员的博客

8.2 Spring Boot集成Groovy、Grails开发小结参考资料

本章介绍Spring Boot集成Groovy,Grails开发。我们将开发一个极简版的pms(项目管理系统)。

583
来自专栏友弟技术工作室

PHP相关概念及配置

php MIME,http,html MIME:MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型 ...

34913
来自专栏一个会写诗的程序员的博客

RESTFeel: 一个企业级的API管理&测试平台。RESTFeel帮助你设计、开发、测试您的APIRESTFeel功能简介:MongoDB configuration:Building From

The build file is configured to download and use an embedded Tomcat server. So t...

884
来自专栏木宛城主

SharePoint 2013 创建 Site Collection

在之前的文章中,通过SharePoint Central Administration 创建了Web Application。在这篇文章中将继续SharePo...

1826
来自专栏Aloys的开发之路

J2EE相关总结

Java Commons The Java™ Tutorials: http://docs.oracle.com/javase/tutorial/index.h...

17310
来自专栏NetCore

尝试使用Memcached遇到的狗血问题

乘着有时间,尝试下利用Memcached进行分布式缓存,其中遇到了不少问题及狗血的事情,开篇记录下,希望对您有帮助。 我之前的项目为:Asp.Net MVC4 ...

2025
来自专栏AndroidTv

读书笔记--Android Gradle权威指南(下)前言笔记后记

1243

扫码关注云+社区