在Python Django中实现只读单例

时间:2016-04-22 10:18:40

标签: python django django-models singleton

情况

当Django网站启动时,需要从数据库中的表中加载一些数据进行计算。数据是只读的和大的(例如20MB)。

每次打开某个页面时都会调用计算。模块将使用数据进行计算。因此,我不希望模块在每次打开页面时都进行SELECT和加载数据。

问题

我猜单身可能是其中一种解决方案。如何在Django中实现单例?或者有更好的解决方案吗?

5 个答案:

答案 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;你的意思是永远不会改变,预先计算你的数据并将其存储在数据库中,而不是存储大型数据库。

如果没有,您可以使用MemcacheRedis左右的缓存系统。

这个想法:

  • 尝试获取所需的数据。
  • 如果不存在,请计算并将其存储在缓存中。

如果您使用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