首页 > 代码库 > Django的缓存(1)
Django的缓存(1)
最近在主要负责公司写公司的财务核算、财务统计功能,同时也突击恶补了一些财务方面的知识(这些都是次要的),其中最重要的一点是要生成一张资产负债表。当然在生成资产负债表的时候,代码肯定会去数据库中查询大量符合条件的数据,然后在进行计算得出结果,这当中必然会影响到页面的响应速度(后经测试,打开页面要花55秒),为了提高第二次打开页面的速度,我想到了使用缓存。下面简单的讲讲django缓存相关的知识吧,由于水平有限,不足之处,敬请谅解。
缓存是指将需要频繁访问的网络内容放在离用户较近访问速度更快的系统中。缓存方案常见的有两种,一种是客户端,也就是web开发中的浏览器;一种就是服务端,以Memcached为代表。这里主要讲服务端缓存。
下面用一些为代码来讲讲缓存是怎样在动态网页中工作的:
given a URL, try finding that page in the cache if the page is in the cache: return the cached page else: generate the page save the generated page in the cache (for next time) return the generated page
Django自带了缓存系统,为了方便起见,Django提供了不同级别的缓存粒度:可以缓存特定视图的输出、可以仅仅缓存那些很难生产出来的部分、或者你可以缓存你的整个网站。
一、在django中设置缓存
(1)Memcached
按照百度上解释,它是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信
存储方式是memcached中保存的数据都存储在memcached内置的内存存储空间中,因此它不能取代数据库或者文件系统的使用。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
在安装 Memcached 后, 还需要安装 Memcached 依赖模块。Python 有不少Memcache模块最为常用的是python-memcached and pylibmc两个模块.
ubuntu系统安装命令:
sudo apt-get install memcached pip install python-memcached
在Django中使用Memcached时:
将 BACKEND 设置为django.core.cache.backends.memcached.MemcachedCache 或者 django.core.cache.backends.memcached.PyLibMCCache (取决于你所选绑定memcached的方式)
将 LOCATION 设置为 ip:port 值,ip 是 Memcached 守护进程的ip地址, port 是Memcached 运行的端口。或者设置为 unix:path 值,path 是 Memcached Unix socket file的路径.
下面的例子中,Memcached 运行再 本地 (127.0.0.1) 的11211端口,使用 python-memcached:
CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘, ‘LOCATION‘: ‘127.0.0.1:11211‘, } }
下面的例子中,Memcached 通过一个本地的Unix socket file/tmp/memcached.sock 来交互,也使用python-memcached:
CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘, ‘LOCATION‘: ‘unix:/tmp/memcached.sock‘, } }
Memcached有一个非常好的特点就是可以让几个服务的缓存共享。 这就意味着你可以再几个物理机上运行Memcached服务,这些程序将会把这几个机器当做 同一个 缓存,从而不需要复制每个缓存的值在每个机器上。为了使用这个特性,把所有的服务地址放在LOCATION里面,用分号隔开或者当做一个list。
CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘, ‘LOCATION‘: [ ‘172.19.26.240:11211‘, ‘172.19.26.242:11211‘, ] } }
(2)Databasecache
Django 可以把缓存保存在你的数据库里。如果你有一个快速的、专业的数据库服务器的话那这种方式是效果最好的。
为了把数据表用来当做你的缓存后台:
把BACKEND设置为django.core.cache.backends.db.DatabaseCache
把 LOCATION 设置为 tablename, 数据表的名称。这个名字可以是任何你想要的名字,只要它是一个合法的表名并且在你的数据库中没有被使用过。
CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.db.DatabaseCache‘, ‘LOCATION‘: ‘my_cache_table‘, } }
但是在使用之前要创建一个缓存表
python manage.py createcachetable
如果你使用多数据库缓存, createcachetable会在每个缓存中创建一个表。
如果你使用多数据库,createcachetable会遵循你的数据库路由中的allow_migrate()方法
像migrate, createcachetable 这样的命令不会碰触现有的表。它只创建非现有的表。
(3)文件系统缓存
基于文件的缓存后端序列化和存储每个缓存值作为一个单独的文件。 为了使用这个文件缓存,你要设置BACKEND为 "django.core.cache.backends.filebased.FileBasedCache" 并且 LOCATION 设置为一个合适的目录。例如,把缓存储存在 /var/tmp/django_cache,就用这个设置:
CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.filebased.FileBasedCache‘, ‘LOCATION‘: ‘/var/tmp/django_cache‘, } }
路径应该是绝对路径– 也就是说,要从你的系统路径开始算。你在末尾添加不添加斜杠都是无所谓的。
请确保,你的路径指向是存在的并且,这个路径下 你有系统用户的足够的读,写权限。继续上面的例子,如果你是一个 名叫apache用户,确保 /var/tmp/django_cache这个路径存在并且apache有读和写的权力。
(4)本地缓存
这是默认的缓存,如果你不在指定其他的缓存设置。如果你想要具有高速这个有点的基于内存的缓存但是又没有能力带动 Memcached, 那就考虑一下本地缓存吧。
CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.locmem.LocMemCache‘, ‘LOCATION‘: ‘unique-snowflake‘, } }
Django的缓存(1)