在 Redis 中缓存经过身份验证的用户?

Caching authenticated users in Redis?

我的 Django 应用程序中的几乎所有页面都需要身份验证。该应用程序使用 Django 的 AuthenticationMiddleware,因此在每次请求时,应用程序都会访问数据库以检索经过身份验证的用户。

我最近开始将会话数据存储在 Redis 支持的缓存中。由于效果很好,通过从缓存中获取会话数据消除了每个请求的一个数据库查询,我想知道我是否也可以在 Redis 中存储经过身份验证的用户?

我正在考虑使用自定义 authentication backend, which would just subclass Django's ModelBackend 来实现它,覆盖 get_user() 方法:

# backends.py
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model

class MyAuthBackend(ModelBackend):

    def get_user(self, user_id):
        user = get_user_from_cache(user_id)  # not implemented here
        if user is None:
            UserModel = get_user_model()
            try:
                user = UserModel._default_manager.get(pk=user_id)
            except UserModel.DoesNotExist:
                return None
            else:
                set_user_in_cache(user)  # not implemented here
                return user

在设置中连接它:

# settings.py
AUTHENTICATION_BACKENDS = ('myapp.backends.MyAuthBackend',)

我还应该注意:

我可能不打算缓存整个用户对象。相反,这可能只是缓存一个基本字典,其中仅包含应用程序在每个页面上所需的用户信息(如 user_id、名称等)。因此,Django AuthenticationMiddleware 添加到每个传入 request 对象的 user 属性将不是我的用户模型的实例。

这是个好主意吗?有什么缺点吗?而且,如果没问题,这是实现此目标的首选方式吗?

非常感谢!

更新:

我已经在 Redis 中成功地缓存了一段时间的用户数据。但是,我没有像我最初计划和在问题中描述的那样创建自定义身份验证后端,而是完全替换了 django 的 AuthenticationMiddleware

灵感来自this package,和我的实现很相似

缓存用户是很常见的事情,这没什么错。我认为比你的方法更简单更好的方法是使用像缓存机(https://cache-machine.readthedocs.org/en/latest/)这样的东西,它也会在必要时负责使缓存失效。作为奖励,您还可以在堆栈中添加一些内容,以便您可以缓存其他经常查询的模型。