Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Django Redis缓存中检索数据需要花费大量时间_Python_Django_Caching_Django Rest Framework_Redis - Fatal编程技术网

Python 从Django Redis缓存中检索数据需要花费大量时间

Python 从Django Redis缓存中检索数据需要花费大量时间,python,django,caching,django-rest-framework,redis,Python,Django,Caching,Django Rest Framework,Redis,我尝试使用Redis缓存数据,以减少DB调用。但是从缓存中检索所花费的时间要比在不缓存的情况下获取记录所花费的时间大得多 我试图存储django queryset对象,它由大约28k+条记录组成,并且它只会随着数据库中数据的增加而增加 我正在使用 Django-3.0 DRF-3.10.3 django redis-4.12 redis-3.5.3 代码方面: 这是我设置默认缓存的settings.py CACHES = { 'default': { 'BACKEND': 'django

我尝试使用Redis缓存数据,以减少DB调用。但是从缓存中检索所花费的时间要比在不缓存的情况下获取记录所花费的时间大得多

我试图存储django queryset对象,它由大约28k+条记录组成,并且它只会随着数据库中数据的增加而增加

我正在使用 Django-3.0 DRF-3.10.3 django redis-4.12 redis-3.5.3

代码方面:

这是我设置默认缓存的
settings.py

CACHES = {
'default': {
    'BACKEND': 'django_redis.cache.RedisCache',
    'LOCATION': [
        f'redis://{REDIS_HOST}:{REDIS_PORT}/1',
        f'redis://{REDIS_HOST}:{REDIS_PORT}/2'
    ],
    'OPTIONS': {
        'CLIENT_CLASS': 'django_redis.client.ShardClient',
        'CONNECTION_POOL_KWARGS': {
            'max_connections': 100,
            'retry_on_timeout': True
        },
        'PASSWORD': os.environ.get('REDIS_PASSWORD')
    }
}
views.py
从rest\U框架导入视图集 从django.core.cache导入缓存 从django.conf导入设置 从django.core.cache.backends.base导入默认\u超时 来自rest\u framework.response导入响应 CACHE_TTL=60*1

class RecordsList(viewsets.ModelViewSet):
   __basic_fields = ('name', 'id')
   # queryset = Records.objects.all()
   serializer_class = RecordsNewSerializer
   http_method_names = ['get', 'post', 'put', 'delete']
   filter_fields = __basic_fields
   search_fields = __basic_fields
   
   def get_queryset(self):
     if 'records' in cache:
        print('from cache')
        queryset = cache.get('records')        
     else:
        print("Saving to Cache")
        queryset = Records.objects.all()
        # queryset = queryset[1:5]
        cache.set('records', queryset, timeout=CACHE_TTL)

     return queryset

如您所见,我正在将django queryset对象保存到缓存中,现在,当我将对象大小减小到仅100条记录时,获取这些记录所需的时间约为
400ms
,而对于整个数据,则为
3000ms+
。如果我不添加缓存部分,它是否可以减少?我可以在大约
600ms的时间内检索整个数据(28k+)。因此,当我添加缓存时,它增加了输出的时间。我实现缓存的方法是否错误??如果是这样的话,有人能帮我找到正确的方向吗

记录对象中有哪些数据?问题可能是,当您运行Records.objects.all()时,每个对象都将被实例化和处理。这可以解释为什么获取所有数据并将其放入缓存比不使用缓存花费更长的时间。缓存被填满时也可能发生同样的情况。。将缓存内容解析回实例化对象需要多长时间?你在使用哪个数据库?@DinoHensen我有一个postgres数据库,当我运行Records.objects.all()时是的。它将从表中获取所有记录,记录包含6列(id、开始日期、结束日期、用户id、图书id、房间id)。当我从缓存中检索数据时,需要大约3000毫秒,这比我尝试在没有缓存的情况下检索数据要多得多。如果不分析您的具体情况,很难说,但是django_redis使用redis的SET操作。客户端代码必须对所有数据进行编码,然后才能将其发送到Redis的SET命令。当您检索该数据时,它必须对所有数据进行解码(可选的解压和反序列化)。我的猜测是,使用Redis进行数据检索可能会更快,但现在解码需要花费大量时间。Python在这类事情上并不是最快的。要获得100%的准确答案,您必须分析您的代码!记录对象中有哪些数据?问题可能是,当您运行Records.objects.all()时,每个对象都将被实例化和处理。这可以解释为什么获取所有数据并将其放入缓存比不使用缓存花费更长的时间。缓存被填满时也可能发生同样的情况。。将缓存内容解析回实例化对象需要多长时间?你在使用哪个数据库?@DinoHensen我有一个postgres数据库,当我运行Records.objects.all()时是的。它将从表中获取所有记录,记录包含6列(id、开始日期、结束日期、用户id、图书id、房间id)。当我从缓存中检索数据时,需要大约3000毫秒,这比我尝试在没有缓存的情况下检索数据要多得多。如果不分析您的具体情况,很难说,但是django_redis使用redis的SET操作。客户端代码必须对所有数据进行编码,然后才能将其发送到Redis的SET命令。当您检索该数据时,它必须对所有数据进行解码(可选的解压和反序列化)。我的猜测是,使用Redis进行数据检索可能会更快,但现在解码需要花费大量时间。Python在这类事情上并不是最快的。要获得100%的准确答案,您必须分析您的代码!