当前位置: 首页 > 工具软件 > django-badger > 使用案例 >

Django缓存

彭华皓
2023-12-01

缓存的概念

  • 这里首先说明,我写的仅仅是为了方便理解,所以用词并不严谨,请各位看官见谅。
  • 缓存是一种快速读取数据的介质,常规的数据读取方式是将数据从硬盘中读取出来,然后经过渲染呈现给用户。这样的频繁读取带来的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)
  • 这个视图调用直接通过页面返回结果就可以判断缓存是否存在。
 类似资料: