我需要一些本质上是静态的信息。这些信息并不多,但很多对象都会使用这些信息。
由于没有太多的信息(很少的字典和一些列表),我认为我有两个选项 - 创建模型以在数据库中保存该信息或将它们作为字典/列表写入某些设置文件。我的问题是 - 从数据库或设置文件中读取信息的速度更快?在任何一种情况下,我都需要能够在很多地方访问这些信息,这意味着很多数据库读取调用。哪个会更快?
答案 0 :(得分:3)
如果他们真的永远不会改变,那么随意将它们放在你的settings.py
文件中,就像宣布普通的Python字典一样。
但是,如果您希望通过正常的Django方法修改您的信息,那么请使用数据库进行持久存储,然后充分利用Django's cache framework。
将数据正常保存到数据库,然后在第一次访问时,缓存它们:
from django.core.cache import cache
def some_view_that_accesses_date(request):
my_data = cache.get('some_key')
if my_data is None:
my_data = MyObject.objects.all()
cache.set('some_key', my_data)
... snip ... normal view code
请确保永远不要将None
保存在缓存中,如:
我们建议不要存储文字 缓存中的值
None
,因为您 将无法区分 存储的None
值和缓存 错过了表示返回值的None
。
确保您在object deletion或change上停用缓存:
from django.core.cache import cache
from django.db.models.signals import post_save
from myapp.models import MyModel
def kill_object_cache(sender, **kwargs):
cache.delete('some_key')
post_save.connect(kill_object_cache, sender=MyModel)
post_delete.connect(kill_object_cache, sender=MyModel)
我的一个应用程序中有类似的内容,效果很好。显然,如果你去使用数据库后端,你不会看到任何性能改进,但这比Django更像(Djangonic?)方法而不是直接使用memcached。
显然,在某处定义缓存键some_key
可能是值得的,而不是在代码上乱扔乱码,上面的例子只是为了易于理解,而不是必须完全实现缓存。 / p>
答案 1 :(得分:1)
如果数据是静态的,则无需继续返回数据库。只需在第一次需要时读取它并缓存结果。
如果出于某种原因无法在应用程序中缓存结果,则可以始终使用memcached来避免访问数据库。
使用memcached的优点是,如果数据确实发生了变化,您只需更新memcached中的值即可。
使用memcached的伪代码
if 'foo' in memcached
data = memcached.get('foo')
else
data = database.get('foo')
memcached.put('foo', data)
答案 2 :(得分:0)
如果您需要从多个进程快速访问,那么数据库是您的最佳选择。
但是,如果您只想将数据保存在内存中并在同一进程中从多个位置访问它,那么Python字典将比访问数据库更快。