您好,登录后才能下订单哦!
最近在主要负责公司写公司的财务核算、财务统计功能,同时也突击恶补了一些财务方面的知识(这些都是次要的),其中最重要的一点是要生成一张资产负债表。当然在生成资产负债表的时候,代码肯定会去数据库中查询大量符合条件的数据,然后在进行计算得出结果,这当中必然会影响到页面的响应速度(后经测试,打开页面要花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', } }
二、cache参数
上面的django的setting文件里的CACHES参数还可以设置一些其它的参数,如下:
TIMEOUT:缓存的默认过期时间,以秒为单位, 这个参数默认是 300 seconds (5 分钟).
当设置为 None 的时候,缓存默认永远不会过期。值设置成0造成缓存立即失效(缓存就没有意义了)。
OPTIONS: 这个参数应该被传到缓存后端。有效的可选项列表根据缓存的后端不同而不同,由第三方库所支持的缓存将会把这些选项直接配置到底层的缓存库。
缓存的后端实现自己的选择策略 将会履行下面这些选项:
MAX_ENTRIES:高速缓存允许的最大条目数,超出这个数则旧值将被删除. 这个参数默认是300.
CULL_FREQUENCY:当达到MAX_ENTRIES 的时候,被删除的条目比率。 实际比率是 1 / CULL_FREQUENCY, 所以设置CULL_FREQUENCY 为2会在达到MAX_ENTRIES 所设置值时删去一半的缓存。这个参数应该是整数,默认为 3.
把 CULL_FREQUENCY的值设置为 0 意味着当达到MAX_ENTRIES时,缓存将被清空。某些缓存后端 (database尤其)这将以很多缓存丢失为代价,大大提高接受访问的速度。
KEY_PREFIX:一个字符串,它将自动包括 (默认预置) 到 Django 服务器所使用的所有缓存密钥
VERSION:由 Django 服务器生成的缓存键的默认版本号
KEY_FUNCTION:包含一个函数,定义了如何将组合成一个最后的缓存键的前缀、 版本和键虚线的路径的字符串
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', 'TIMEOUT': 60, 'OPTIONS': { 'MAX_ENTRIES': 1000 } }}
上面的例子是一个文件系统缓存后端,缓存过期时间被设置为60秒,最大条目为1000。非法的参数将会被系统自动忽视掉。
缓存的知识就介绍到这里,很晚了,明天再接着介绍缓存的使用吧,以上知识仅供参考,也许写的不够好,但知识最重要的还是应用,只有应用的时候才能慢慢体会它的原理以及精妙之处。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。