我正在测试使用memcached来缓存django视图.如何判断memcached是否实际缓存了Linux命令行中的任何内容?
我注意到有两个不同的项目使用redis进行django缓存
https://github.com/sebleier/django-redis-cache/
https://github.com/niwibe/django-redis
比其他人更了解一个,更多的标准包装?我无法决定使用哪个.
我需要使用memcached和基于文件的缓存.我在设置中设置了缓存:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': 'c:/foo/bar',
},
'inmem': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
}
}
Run Code Online (Sandbox Code Playgroud)
假的是暂时的.文件说:
cache.set('my_key', 'hello, world!', 30)
cache.get('my_key')
Run Code Online (Sandbox Code Playgroud)
好的,但是我现在如何设置和获取仅用于'inmem'缓存后端的缓存(在将来的memcached中)?文档没有提到如何做到这一点.
我想实现一个装饰器,它为任何方法提供每请求缓存,而不仅仅是视图.这是一个示例用例.
我有一个自定义标记,用于确定长记录列表中的记录是否为"收藏夹".为了检查项目是否是收藏夹,您必须查询数据库.理想情况下,您将执行一个查询以获取所有收藏夹,然后只针对每条记录检查缓存列表.
一种解决方案是在视图中获取所有收藏夹,然后将该集合传递到模板中,然后传递到每个标签调用中.
或者,标记本身可以执行查询本身,但仅在第一次调用时执行.然后可以为后续调用缓存结果.好处是,您可以在任何视图上使用任何模板中的此标记,而无需提醒视图.
在现有的缓存机制中,您可以将结果缓存50毫秒,并假设它与当前请求相关联.我想让这种相关性变得可靠.
这是我目前拥有的标签示例.
@register.filter()
def is_favorite(record, request):
if "get_favorites" in request.POST:
favorites = request.POST["get_favorites"]
else:
favorites = get_favorites(request.user)
post = request.POST.copy()
post["get_favorites"] = favorites
request.POST = post
return record in favorites
Run Code Online (Sandbox Code Playgroud)
有没有办法从Django获取当前请求对象,没有传递它?从标签,我可以传递请求,它将始终存在.但是我想从其他函数中使用这个装饰器.
是否存在每请求缓存的现有实现?
有没有办法确保页面来自生产服务器和开发服务器上的缓存?
解决方案不应涉及缓存中间件,因为并非每个项目都使用它们.虽然解决方案本身可能是一个中间件.
只检查数据是否陈旧不是一种非常安全的IMO测试方法.
试图理解在django低级别cache.set()期间发生的事情.特别是,有关查询集的哪个部分存储在memcached中的详细信息.
首先,我是否正确地解释了django文档?
现在关于在视图中将内容保存到memcached的问题.假设我在视图的顶部添加了类似的内容:
tournres_qset = cache.get('tournres', None)
if tournres_qset is None:
tournres_qset = TournamentResult.objects.all()
cache.set('tournres', tournres_qset, timeout)
# now start accessing tournres_qset
# ...
Run Code Online (Sandbox Code Playgroud)
在cache.set()期间存储了什么?
整个查询集(python对象)是否被序列化并保存?
由于尚未使用查询集来获取任何记录,这只是浪费时间,因为在memcache中实际上没有保存特定记录的内容?(任何将来的请求都将从memcache获取queryset对象,它始终是新的,具有空的本地queryset缓存;将始终访问dbase.)
如果以上情况属实,那么我是否应该始终在查看结束时重新保存查询集,之后在整个vierw中使用它来访问某些记录,这将导致查询集的本地缓存得到更新,哪些应该更新总是被重新保存到memcached?但是,这总是会导致再次序列化queryset对象.加快速度如此之快.
或者,cache.set()是否强制查询集对象迭代并从dbase访问所有记录,这些记录也将保存在memcache中?即使视图只访问查询集的子集,一切都会被保存?
我看到各方面的陷阱,这让我觉得我
误解了很多东西.
希望这是有道理的,并欣赏澄清或指向一些"标准"指南.谢谢.
在Django表单中使用ModelChoiceField或ModelMultipleChoiceField时,有没有办法传入一组缓存的选项?目前,如果我通过queryset参数指定选项,则会导致数据库命中.
我想使用memcached缓存这些选项,并在显示具有此类字段的表单时防止对数据库的不必要的命中.
django django-forms django-admin django-cache django-queryset
我刚开始使用django和DRF,并出现问题,看起来像DRF缓存响应.我的意思是 - 我可以更改对象,创建新对象或删除它 - 并且DRF保持响应,没有任何改变.例如,我创建了一个对象,但modelViewSet仍返回未显示此对象的数据.但是,如果我直接请求它对象 - 它表明它已创建.任何其他行动都是如此.我在DRF中找不到关于缓存的话题,看起来我没有任何django chaching中间件,所以我不知道发生了什么.只有一件事有帮助 - 重启服务器(我使用的是默认的dev-server).
还有一件事 - 当django视图呈现时,所有数据都可以,而不是DRF视图.
这是我正在使用的序列化器/ modelViewSets之一.尽可能简单.而且 - 我没有使用django缓存后端.至少 - 我的设置中没有任何内容.
class WorkOperationSerializer(serializers.ModelSerializer):
class Meta:
model = WorkOperation
class WorkOperationAPIView(viewsets.ModelViewSet):
serializer_class = WorkOperationSerializer
queryset = WorkOperation.objects.all()
def get_queryset(self):
return self.queryset
Run Code Online (Sandbox Code Playgroud) 我一直在使用数据库缓存在Django中设置缓存.TIMEOUT和CACHE_MIDDLEWARE_SECONDS有两个设置,用于控制页面缓存的时间长度.这两个设置有什么区别?
我有两个Django模型,如下所示,MyModel1&MyModel2:
class MyModel1(CachingMixin, MPTTModel):
name = models.CharField(null=False, blank=False, max_length=255)
objects = CachingManager()
def __str__(self):
return "; ".join(["ID: %s" % self.pk, "name: %s" % self.name, ] )
class MyModel2(CachingMixin, models.Model):
name = models.CharField(null=False, blank=False, max_length=255)
model1 = models.ManyToManyField(MyModel1, related_name="MyModel2_MyModel1")
objects = CachingManager()
def __str__(self):
return "; ".join(["ID: %s" % self.pk, "name: %s" % self.name, ] )
Run Code Online (Sandbox Code Playgroud)
MyModel2有一个ManyToMany字段来MyModel1授权model1
现在看看当我向这个ManyToMany字段添加一个新条目时会发生什么.据Django说,它没有效果:
>>> m1 = MyModel1.objects.all()[0]
>>> m2 = MyModel2.objects.all()[0]
>>> m2.model1.all()
[]
>>> m2.model1.add(m1)
>>> m2.model1.all() …Run Code Online (Sandbox Code Playgroud) django ×10
django-cache ×10
python ×3
caching ×2
django-admin ×1
django-forms ×1
memcached ×1
redis ×1