我想在我的简单 Django 项目中使用 Redis-Cache。我无法理解 Django 中的实现

I wanna use Redis-Cache in my simple Django project. I'm not able to understand the implementation in Django

下面是我的看法。现在到这里,我无法获得实现Redis缓存的方法。

从django.core.cache导入缓存 class 用户列表视图(APIView):

def get(self, request):

    # userss = Cach.objects.values('cache_id', 'username', 'email')
    data = Cach.objects.values('cache_id', 'username', 'email')

    # cache.set('users',userss)

    # data = cache.get('users')

    return Response(data)

实现任何缓存的逻辑如下:

  1. 通过获取对象检查对象是否存在于缓存中。
  2. 如果不存在,则计算对象(或生成对象)并放入缓存。
  3. Return 对象。

Django 为缓存提供了一个简单的类似字典的 API。一旦你有了 correctly configured the cache,你就可以使用简单的缓存 api:

from django.core.cache import cache

def get(request):
   value = cache.get('somekey')
   if not value:
      # The value in the cache for the key 'somekey' has expired
      # or doesn't exist, so we generate the value
      value = 42
      cache.set('somekey', value)

django 中的缓存还有很多内容,请务必阅读 the documentation,其中介绍了如何在模板中使用缓存、如何缓存整个视图输出等等。

为了使用 Django Redis 缓存,您需要对 Django 及其 APIView 进行 Redis 和一些配置。

在Django项目中要放置如下配置settings.py:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://redis:6379",
        "TIMEOUT": 5 * 60,
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient"
        },
        "KEY_PREFIX": "example"
    }
}

为了为所有站点视图设置缓存,应在 settings.py 中的 Django 中间件中使用以下更改:

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
]

根据 this doc 所有视图都可以缓存。


如果你想使用 cache per each view 你可以在 Django 中使用它的相关装饰器,如下所示:

from django.views.decorators.cache import cache_page

@cache_page(60 * 5)
def my_view(request):
    ...

此外,如果您使用的是REST-API,则必须使用以下装饰器来代替(@method_decorator(cache_page(60 * 5))) doc .这是一个例子:

from django.utils.decorators import method_decorator

class PostView(APIView):
    @method_decorator(cache_page(60 * 5))
    def get(self, request, format=None):
        content = {
            'title': 'Post title',
            'body': 'Post content'
        }
        return Response(content)

[注意]:

  • 要求:pip install django-redis
  • 上面使用的Redis服务是docker化的容器,docker-compose.yml部分如下:

      redis:
        restart: always
        image: redis:latest
        ports:
          - "6379:6379"
    

因此,如果你想在本地使用 Redis,你必须将 "LOCATION": "redis://redis:6379", 替换为 "LOCATION": "redis://127.0.0.1:6379",