zoukankan      html  css  js  c++  java
  • Django 缓存机制

    缓存作用

       当一个网站的并发量特别高的时候,频繁的对数据库进行增删查改操作势必会让访问速度变慢,此时你可以选择使用缓存来减小服务器的压力,但是缓存不要滥用,因为它可能会导致脏数据的出现。

       缓存说白了就是将你的数据存放到另一个地方,下次再去拿这些数据时将不再进行数据库查询,而是直接从缓存中取出数据并返回给用户。

    Django缓存

       在Django中,你可以将数据缓存到下面六种地方:

       开发调试缓存

       内存缓存

       文件缓存

       数据库缓存

       Memcache缓存(使用python-memcached模块)

       Memcache缓存(使用pylibmc模块)

       经常使用的有文件缓存、以及Memcache缓存。

    开发调试

       此模式为开发调试使用,实际上不执行任何操作。

       settings.py中进行配置:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.dummy.DummyCache',  # 缓存后台使用的引擎
            'TIMEOUT': 300,  # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)
            'OPTIONS': {
                'MAX_ENTRIES': 300,  # 最大缓存记录的数量(默认300)
                'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)(随机删除)
            },
        }
    }
    

    内存缓存

       此模式将会把数据存放至内存中。

       settings.py中进行配置:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 指定缓存使用的引擎
            'LOCATION': 'unique-snowflake',  # 写在内存中的变量的唯一值 
            'TIMEOUT': 300,  # 缓存超时时间(默认为300秒,None表示永不过期)
            'OPTIONS': {
                'MAX_ENTRIES': 300,  # 最大缓存记录的数量(默认300)
                'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
            }
        }
    }
    

    文件缓存

       此模式将会把数据存放至文件中,以文件路径作为key

       settings.py中进行配置:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',  # 指定缓存使用的引擎
            'LOCATION': '/var/tmp/django_cache',  # 指定缓存的路径
            'TIMEOUT': 300,  # 缓存超时时间(默认为300秒,None表示永不过期)
            'OPTIONS': {
                'MAX_ENTRIES': 300,  # 最大缓存记录的数量(默认300)
                'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
            }
        }
    }
    

    数据库缓存

       此模式将会把数据存放至数据库中。

       settings.py中进行配置:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 指定缓存使用的引擎
            'LOCATION': 'cache_table',  # 数据库表    
            'OPTIONS': {
                'MAX_ENTRIES': 300,  # 最大缓存记录的数量(默认300)
                'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
            }
        }
    }
    
    

       需要注意的是,在创建完数据库缓存后还需要手动执行一条命令:

    python manage.py createcachetable
    

    Memcache缓存(python-memcached)

       MemcachedDjango原生支持的缓存系统.要使用Memcached,需要下载Memcached的支持库python-memcachedpylibmc.

       下面是使用python-memcached时的配置。

       settings.py中进行配置:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',  # 指定缓存使用的引擎
            'LOCATION': '192.168.10.100:11211',  # 指定Memcache缓存服务器的IP地址和端口
            'OPTIONS': {
                'MAX_ENTRIES': 300,  # 最大缓存记录的数量(默认300)
                'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
            }
        }
    }
    

       LOCATION也可以配置成如下:

    'LOCATION': 'unix:/tmp/memcached.sock',  # 指定局域网内的主机名加socket套接字为Memcache缓存服务器
    'LOCATION': [  # 指定一台或多台其他主机ip地址加端口为Memcache缓存服务器
        '192.168.10.100:11211',
        '192.168.10.101:11211',
        '192.168.10.102:11211',
    ]
    

    Memcache缓存(pylibmc)

       使用pylibmc模块连接memcache

       settings.py中进行配置:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',  # 指定缓存使用的引擎
            'LOCATION': '192.168.10.100:11211',  # 指定本机的11211端口为Memcache缓存服务器
            'OPTIONS': {
                'MAX_ENTRIES': 300,  # 最大缓存记录的数量(默认300)
                'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
            },
        }
    }
    

       LOCATION也可以配置成如下:

    'LOCATION': '/tmp/memcached.sock',  # 指定某个路径为缓存目录
    'LOCATION': [  # 分布式缓存,在多台服务器上运行Memcached进程,程序会把多台服务器当作一个单独的缓存,而不会在每台服务器上复制缓存值
        '192.168.10.100:11211',
        '192.168.10.101:11211',
        '192.168.10.102:11211',
    ]
    

       Memcached是基于内存的缓存,数据存储在内存中,所以如果服务器死机的话数据就会丢失,所以Memcached一般与其他缓存配合使用。

    缓存粒度

       Django提供了不同粒度的缓存,可以缓存某个页面,可以只缓存一个页面的某个部分,甚至可以缓存整个网站。

       下面将使用文件缓存的形式做演示(这是针对不分离开发时所使用的):

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',  # 指定缓存使用的引擎
            'LOCATION': '/var/tmp/django_cache',  # 指定缓存的路径
            'TIMEOUT': 300,  # 缓存超时时间(默认为300秒,None表示永不过期)
            'OPTIONS': {
                'MAX_ENTRIES': 300,  # 最大缓存记录的数量(默认300)
                'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
            }
        }
    }
    

    单页面缓存

       在视图函数上加装饰器

    from django.views.decorators.cache import cache_page
    
    @cache_page(5)  # 缓存5s钟
    def test_cache(request):
        import time
        ctime=time.time()
        return render(request,'index.html',context={'ctime':ctime})
    

       现在,当你五秒钟之内进行访问,时间将会一成不变。

    局部缓存

       在一个模板中,使用tag进行局部缓存:

    <p>未进行缓存:{{ ctime }}</p>
    <hr>
    
    <!--导入tage-->
    {% load cache %}
    <!--5表示5s钟,name是唯一key值-->
    
    {% cache 5 'name' %}
    	{{ ctime }}
    {% endcache %}
    
    

       现在,你将看到未缓存的部分一直在刷新时间,而缓存部分将不刷新。

    全站缓存

    MIDDLEWARE = [
                'django.middleware.cache.UpdateCacheMiddleware',  # 这个放在最上面
                ... 												# 其他中间件
                'django.middleware.cache.FetchFromCacheMiddleware',  # 这个放在最下面
            ]
            
    CACHE_MIDDLEWARE_SECONDS=10  # 全站缓存时间
    

       现在,你将看到所有的视图返回的页面都将10秒内刷新一次。

    调用缓存

       导入缓存,你可以像操纵字典一样操纵它,你可以将它当作一个全局字典一样使用,可以缓存任何数据类型,需要注意的是key必须是唯一的。:

    from django.core.cache import cache
    

       下面是缓存的一些常用操作方法:

    方法描述
    cache.set(key,value,timeout=DEFAULT_TIMEOUT,version=None) 设置缓存,当不存在时则创建。
    cache.get(key,default=None,version=None) 根据key获取缓存,若不存在则返回默认值None
    cache.add(key,value,timeout=DEFAULT_TIMEOUT,version=None) 使用与set相同,当缓存已存在时,将不会更新,而set则会更新
    cache.get_or_set(key,default,timeout=DEFALUT_TIMEOUT,version=None) 获取缓存,当获取不到时设置缓存,并拿到设置的值
    cache.get_many(key,version=None) 传入一个可迭代对象,它将会返回一个字典,将可迭代对象中所有key对应的value取出
    cache.set_many(dict,timeout) 传入一个dict,它将会迭代该dict并且为每一组k,v存放到缓存中
    cache.delete(key,version=None) 清除特定对象
    cache.clear() 清楚缓存
    cache.touch(key,timeout=DEFAULT_TIMEOUT,version=None) 当缓存马上到期时,重新设置它的过期时间
    cache.incr(key,delete=1,version=None) 对缓存中的数据做递增操作,如k对应的v原本是1,使用该方法后变为2
    cache.decr(key,delete=1,version=None) 对缓存中的数据做递减操作,如k对应的v原本是2,使用该方法后变为1
    cache.close() 关闭缓存链接

       简单的示例:

    from django.core.cache import cache
    cache.set('key',value可以是任意数据类型)
    
    # 你可以在该Django程序的任意位置拿到存入的值
    cache.get('key')
    

      

  • 相关阅读:
    [DFNews] Nuix公司推出培训及认证体系
    [CFNews] Oxygen官方对于新版XRY与之冲突问题的官方解释
    [DFNews] FBI Documents Shine Light on Clandestine Cellphone Tracking Tool
    [CFNews] Be first to get Oxygen Forensic Suite 5.0 just before the End of the World!
    [DFNews] CelleBrite发布2013年移动设备取证趋势与预测白皮书
    [转载] Retrieving Data from an iPhone Voicemail Database
    [转载] 我们从未改变:弱密码仍是最常用的密码
    [DFNews] US students get cracking on Chinese malware code
    [转载] 25GPU cluster cracks every standard Windows password in <6 hours
    [手机取证] Forwarding SMS to Email on [Jailbroken] iOS
  • 原文地址:https://www.cnblogs.com/Yunya-Cnblogs/p/13933818.html
Copyright © 2011-2022 走看看