• django自带的cache无法多进程共享


    • 问题:
    from django.core.cache import cache
    在登录接口中我使用 django 自带的cache 来进行缓存token, 
    同时使用 uwsgi 来部署django项目,配置了 4 个 worker 来接收用户请求,
      当用户请求带着token到达时,用户携带的token需要和内存中的token进行比较
    请问此时 4 个worker 是共享内存中的token吗?如果不是,有什么解决方案吗
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 答案:
    在使用 uWSGI 部署 Django 项目时,配置了多个 worker 的情况下,每个 worker 实际上是运行在自己的进程中。因此,这些 worker 进程不会共享内存。这意味着,如果您在一个 worker 进程中使用 Django 的内建缓存系统(默认使用本地内存缓存)来存储 token,这个缓存不会被其他 worker 进程所共享。
    
    这种情况下,如果一个用户的请求被一个 worker 处理并在那个 worker 的内存中缓存了 token,另一个请求即使带着相同的 token 到达不同的 worker,也无法访问第一个 worker 的内存中的 token。这就会导致一致性问题。
    
    • 1
    • 2
    • 3
    解决方案:
    为了解决这个问题,您需要使用一个共享的、中央化的缓存系统,这样所有的 worker 都可以访问同一个缓存数据。常见的解决方案包括:
    Redis:
    
    1. Redis 是一个非常流行的内存中数据结构存储系统,通常用作数据库、缓存和消息代理。它支持多种类型的数据结构,如字符串、散列、列表、集合、有序集合等。
    使用 Redis 作为 Django 的缓存后端可以确保所有 worker 都能访问和修改同一个 token 缓存。
    Memcached:
    
    2. Memcached 是另一个广泛使用的高性能分布式内存对象缓存系统,适合用于加速动态 Web 应用程序,通过减轻数据库负载。
    它也可以作为 Django 缓存后端,提供给多个 worker 共享的缓存。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    实施步骤:
    1.安装 Redis 或 Memcached:
    
    根据您选择的解决方案,安装 Redis 或 Memcached。如果是 Redis,可以使用 pip install redis 安装 Redis Python 客户端。
    2. 配置 Django:
    
    在 Django 的 settings.py 中配置缓存后端。例如,如果使用 Redis,配置可能如下所示:
    
    CACHES = {
        'default': {
            'BACKEND': 'django_redis.cache.RedisCache',
            'LOCATION': 'redis://127.0.0.1:6379/1',
            'OPTIONS': {
                'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            }
        }
    }
    3. 使用缓存:
    
    在代码中,您可以像之前一样使用 cache 来存储和获取 token。现在,由于缓存是中央化的,无论哪个 worker 来处理请求,都能够访问到相同的 token 数据。
    通过这种方式,您可以确保所有 uWSGI worker 都能够访问和验证相同的 token,从而解决多进程环境下的数据共享问题。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    threejs(12)-着色器打造烟雾水云效果
    解决新创建的anaconda环境在C:\Users\xxx\.conda\envs\,而不在anaconda安装目录下的envs中
    LeetCode 43. 字符串相乘
    C语言获取当前系统时间的几种方式
    【Python-Django】基于TF-IDF算法的医疗推荐系统复现过程
    【高德地图】Android搭建3D高德地图详细教
    Lingo保姆级安装教程及新手快速入门指南
    netfilter编程实例——一个简单的防火墙
    JDK与cglib动态代理
    AST.NET Core 服务器端对接苹果推送通知 APNs
  • 原文地址:https://blog.csdn.net/qq_34685213/article/details/134528706