震惊!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 条评论
登录 后参与评论

相关文章

来自专栏木可大大

漫谈计算机架构

一说到计算机架构(Computer Architecture),大家可能会有疑问:计算机架构到底是个什么东西?引用维基百科对计算机架构的定义:

751
来自专栏菩提树下的杨过

JAVA CDI 学习(3) - @Produces及@Disposes

上一节学习了注入Bean的生命周期,今天再来看看另一个话题: Bean的生产(@Produces)及销毁(@Disposes),这有点象设计模式中的工厂模式。在...

1885
来自专栏冷冷

Spring Boot Admin 2 值得了解的新变化

6.19号,spring团队发布了期待已久的 Spring Cloud Finchley.RELEASE 版本。 期间Spring Boot Admin 也发布...

2491
来自专栏IT技术精选文摘

跟着实例学习ZooKeeper的用法: Leader选举

Leader Election Barriers Queues Locks Two-phased Commit 其它应用如Name Service, Confi...

2289
来自专栏坚毅的PHP

困扰我多年的Connection reset问题

第一次出现:是thrift的python client去请求server,发现偶尔出现这个问题 第二次:接入第三方的api,去请求数据时,发现一个接入方的api...

1.4K6
来自专栏阿杜的世界

HttpClient使用总结

根据业务量级决定使用同步调用或异步调用:异步回调方式的并发性非常高,缺点是代码可读性一般,在开发中,我会首先选择同步实现,在遇到性能问题后再考虑优化为异步回调方...

562
来自专栏大学生计算机视觉学习DeepLearning

c++ 网络编程(三)TCP/IP LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现

原文链接:https://www.cnblogs.com/DOMLX/p/9613027.html

1544
来自专栏木可大大

漫谈计算机架构

一说到计算机架构(Computer Architecture),大家可能会有疑问:计算机架构到底是个什么东西?引用维基百科对计算机架构的定义:

4247
来自专栏向治洪

备忘录模式

概念 备忘录模式:又叫做快照模式,属于行为模式的一种,指在不破坏封装性的前提下,获取到一个对象的内部状态,并在对象之外记录或保存这个状态。在有需要的时候可将该对...

1728
来自专栏小筱月

spring+springMVC 整合 MongoDB 实现注册登录

发现一入手 MongoDB,便无法脱离,简要说一下,MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的...

1372

扫码关注云+社区