当Django网站启动时,需要从数据库中的表中加载一些数据进行计算。数据是只读的和大的(例如20MB)。
每次打开某个页面时都会调用计算。模块将使用数据进行计算。因此,我不希望模块在每次打开页面时都进行SELECT和加载数据。
我猜单身可能是其中一种解决方案。如何在Django中实现单例?或者有更好的解决方案吗?
答案 0 :(得分:1)
使用Django缓存最好。您需要使用第三方缓存服务器,例如Redis
。还有Memcached
,但正如您所说的那样,您的数据为20MB,因此Redis
Memcached
只需1MB
,每个键最多只允许sudo apt-get install redis
。
同样使用缓存非常简单,只需要CACHES
,在Django设置中添加<div ng-class="condition?'class1':'class2'"></div>
设置就可以了。你好了。
Redis(或Memcached)是内存缓存服务器,并将所有缓存数据保存在内存中,因此从Redis获取它将尽可能快。
答案 1 :(得分:1)
如果您说&#34;数据是只读的&#34;你的意思是永远不会改变,预先计算你的数据并将其存储在数据库中,而不是存储大型数据库。
如果没有,您可以使用Memcache
或Redis
左右的缓存系统。
这个想法:
如果您使用GAE
进行部署Memcache
是最简单的经验。如果没有,我会使用Redis
。无论如何,Django提供docs关于它。
答案 2 :(得分:0)
我想你想要的是缓存。你看过django's cache framework了吗? Database caching似乎是你的相关部分。
它基本上使您能够存储数据库查询的结果,以便以后使用而无需再次查询。
答案 3 :(得分:0)
有一种在Python中创建单例类/对象的简单方法:
首先,您应该定义一个基类:
class Singleton(object):
"""
This is a base class for building a singleton class.
Just inherited this class!
e.g.
class MySingleton(Singleton)
Note that not implement a __init__ method for these
classes to avoid some mistakes.
"""
_singletons = {}
def __new__(cls, *args, **kwargs):
if not cls._singletons.has_key(cls):
cls._singletons[cls] = object.__new__(cls)
return cls._singletons[cls]
然后只需编写一个派生类来扩展它。 这就是全部!
答案 4 :(得分:0)
你可以创建一个单例类:
class Singleton(object):
_instances = {}
def __new__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instances[cls]
然后在包含返回选择的函数的类中扩展它:
class SampleClass(Singleton):
data = None
def load_data(self):
self.data = MyModel.objects.all()
def get_data(self):
if self.data is None:
self.load_data()
return self.data