欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Django缓存

程序员文章站 2024-03-23 17:32:58
...

缓存的概念

  • 这里首先说明,我写的仅仅是为了方便理解,所以用词并不严谨,请各位看官见谅。
  • 缓存是一种快速读取数据的介质,常规的数据读取方式是将数据从硬盘中读取出来,然后经过渲染呈现给用户。这样的频繁读取带来的IO操作会降低数据库的运行效率,大大降低用户体验。为了减小数据库的压力,优化用户体验,我们在第一次读取数据时将数据存储到内存中,以后如果再读取这一组数据时就直接从内存中读取,而不是再去硬盘读取,这样减少了重复的查询操作,减小了数据库的压力,也大大缩短了应用的响应时间,提升了用户体验。
  • 使用缓存的逻辑:
    • 判断需要的数据是否在缓存中
      • 在:直接读取
      • 不在: 查询数据库,返回需要的数据,同时将数据加载到缓存中
  • 缓存常用的方式:
    • Memcache 缓存:是分布式的高速缓存系统,也是当下最火,最流行的。这里主要介绍memcache的使用。
    • redis :说实话,redis数据库也可以承担缓存的任务,但是相对于redis的强大功能来说,有点杀鸡用宰牛刀了-_-!
  • memcache服务的安装
  • 安装python-memcached,在命令行输入pip install python-memcached(ps:如果django项目使用的是anaconda的虚拟环境,请务必在虚拟环境下执行pip命令)

在Django项目中使用缓存

  • 修改配置文件
    • 首先需要找到全局配置文件global_settings.py,我的是在D:/anaconda/envs/DjangoPath/Lib/site-packages/django/conf/global_settings.py,因为这里使用的anaconda的虚拟环境,如果使用的是python的话应该是在安装目录的lib文件夹下。

    • 打开global_settings.py文件,找到下面这段代码

      # The cache backends to use.
      CACHES = {
       'default': {
      	'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
      }
      }
      CACHE_MIDDLEWARE_KEY_PREFIX = ''
      CACHE_MIDDLEWARE_SECONDS = 600
      CACHE_MIDDLEWARE_ALIAS = 'default'
      
    • 将这段代码复制出来,在自己django项目的settings.py文件的最后添加该代码,并将代码进行如下的修改:

      	# The cache backends to use.
      	CACHES = {
      	 'default': {
      	 #将cache后端修改为memcache
      		'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
      		#添加memcache的服务地址
      		'LOCATION':[
          			'127.0.0.1:11211'
      					 ]
       }
      }
      CACHE_MIDDLEWARE_KEY_PREFIX = ''
      CACHE_MIDDLEWARE_SECONDS = 600
      CACHE_MIDDLEWARE_ALIAS = 'default'
      

在视图中使用

#导入缓存使用的模块
from django.views.decorators.cache import cache_page
#在对应的视图前加装饰器cache_page(),cache_page()中必须设置缓存持续时间,这里的单位是秒,60*2代表2分钟
@cache_page(60*2)
#这个函数视图是我随意写的
def shoppingcart(request):
    print('+++++++++++++++++++++++')
    return HttpResponse('Hello')
  • 解析一下运行结果:这里是通过在终端打印的结果来判断缓存是否存在的,第一次运行因为没有缓存所以终端会打印’+++++++++++++++++++++++’,当再次调用视图时,因为缓存的机制,什么也不会打印,因为调用的是之前已经写入内存中的数据。这里设置的缓存时间是两分钟,所以在两分钟后刷新页面还是会打印’+++++++++++++++++++++++’。

在路由中使用缓存

  • 写法如下:
from django.urls import path,re_path
from .views import *
from django.views.decorators.cache import cache_page
urlpatterns = [
	path('cacahtest/',cache_page(60*1)(cacahtest)),
]
  • 效果跟在视图中使用一样。

视图内部数据的缓存使用

  • 字不多打,直接上代码
from django.core.cache import cache
from django.http import HttpResponse
def viewcache(request):
    order_number = request.GET.get('order_number')
    # 从缓存中获取数据
    data = cache.get(order_number)
    print('--------')
    if not data:
        print('现在没有缓存')
        # 设置缓存,缓存中的数据以键值对的形式存储,第一个参数是键名,第二个参数是对应的值,第三个参数是缓存存在时间
        cache.set(order_number,15,90)
        return HttpResponse('缓存添加成功')
    return HttpResponse(data)
  • 这个视图调用直接通过页面返回结果就可以判断缓存是否存在。