经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Redis » 查看文章
Django 缓存配置Redis使用详解
来源:jb51  时间:2019/7/23 11:20:27  对本文有异议

一、cache介绍

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存。

缓存工作原理:缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有用户来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。

Django提供了6种缓存方式:

  • 开发调试缓存
  • 内存缓存
  • 文件缓存
  • 数据库缓存
  • Memcache缓存(使用python-memcached模块)
  • Memcache缓存(使用pylibmc模块)

这里不多介绍,有兴趣的可以去看看官方文档:https://docs.djangoproject.com/en/dev/topics/cache/

二、Redis缓存

要想在Django配置Redis缓存,则需要先安装依赖:

  1. pip3 install django-redis

settings.py配置:

  1. CACHES = {
  2. "default": {
  3. "BACKEND": "django_redis.cache.RedisCache",
  4. "LOCATION": "redis://127.0.0.1:6379",
  5. "OPTIONS": {
  6. "CLIENT_CLASS": "django_redis.client.DefaultClient",
  7. "CONNECTION_POOL_KWARGS": {"max_connections": 100}
  8. # "PASSWORD": "密码",
  9. }
  10. }
  11. }

视图中连接(手动操作redis):

  1. from django.shortcuts import HttpResponse
  2. from django_redis import get_redis_connection
  3.  
  4. def index(request):
  5. r = get_redis_connection("default")
  6. r.hmset("name_a", {"key_a": "value_a", "key_b": "value_b"})
  7. return HttpResponse("设置redis")
  8.  
  9. def order(request):
  10. r = get_redis_connection("default")
  11. val = r.hmget("name_a", ["key_a", "key_b"])
  12. print(val) # [b'value_a', b'value_b']
  13. return HttpResponse("获取redis")

三、应用

全站使用缓存

使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用 FetchFromCacheMiddleware 获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware 会将缓存保存至缓存,从而实现全站缓存。

  1. MIDDLEWARE = [
  2. 'django.middleware.cache.UpdateCacheMiddleware', # 放在第一
  3. # 其他中间件...
  4. 'django.middleware.cache.FetchFromCacheMiddleware', # 放在最后
  5. ]
  6.  
  7. CACHE_MIDDLEWARE_ALIAS = "" # 用于存储的缓存别名
  8. CACHE_MIDDLEWARE_SECONDS = 600 # 每个页面应缓存的秒数
  9. CACHE_MIDDLEWARE_KEY_PREFIX = "" # 如果使用相同的Django安装在多个站点之间共享缓存,请将其设置为站点名称或此Django实例特有的其他字符串,以防止发生密钥冲突。如果你不在乎,请使用空字符串。

测试

  1. from django.shortcuts import HttpResponseimport time
  2. def index(request):
  3. t = time.time()
  4. return HttpResponse("时间:{}".format(str(t)))
  5.  
  6. def home(request):
  7. t = time.time()
  8. return HttpResponse("时间:{}".format(str(t)))

可以发现,index或者home页面第一次返回的时间是多少,往后10分钟以内,时间都是不变的。

单独视图缓存(记得取消全站缓存中间件配置)

  1. from django.shortcuts import HttpResponse
  2. from django.views.decorators.cache import cache_page
  3. import time
  4.  
  5. @cache_page(60 * 10)
  6. def index(request):
  7. t = time.time()
  8. return HttpResponse("时间:{}".format(str(t)))
  9.  
  10. def home(request):
  11. t = time.time()
  12. return HttpResponse("时间:{}".format(str(t)))

这次,index页面第一次访问返回的时间需要过10分钟再次访问才能变化,而home页面返回的时间是时时刻刻变化的。

模板局部视图使用

  1. # 1.引入TemplateTag
  2. {% load cache %}
  3.  
  4. # 2.使用缓存
  5. {% cache 600 name %} # 缓存超时(秒) 和 缓存片段的名称(名称按原样使用)
  6. 缓存内容
  7. {% endcache %}

示例:

  1. # views.py
  2. from django.shortcuts import render
  3. import time
  4.  
  5. def index(request):
  6. t = time.time()
  7. return render(request, "index.html", {"t": t})
  1. # index.html
  2. <!DOCTYPE html>
  3. <html lang="zh-cn">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. </head>
  8. <body>
  9.  
  10. {% load cache %}
  11.  
  12. {% cache 10 current_time %}
  13. <h1>{{ t }}</h1>
  14. {% endcache %}
  15.  
  16. </body>
  17. </html>

四、使用场景说明

  1. # 一般来说我们用 Django 来搭建一个网站,要用到数据库等。
  2.  
  3. from django.shortcuts import render
  4. def index(request):
  5. # 读取数据库等 并渲染到网页
  6. # 数据库获取的结果保存到 queryset 中
  7. return render(request, 'index.html', {'queryset':queryset})
  8. # 像这样每次访问都要读取数据库,一般的小网站没什么问题,当访问量非常大的时候, 就会有很多次的数据库查询,肯定会造成访问速度变慢,服务器资源占用较多等问题。
  9.  
  10. #--------------------------------------------------------------------
  11.  
  12. from django.shortcuts import render
  13. from django.views.decorators.cache import cache_page
  14. @cache_page(60 * 10) # 秒数,这里指缓存10分钟,不直接写600是为了提高可读性
  15. def index(request):
  16. # 读取数据库等 并渲染到网页
  17. return render(request, 'index.html', {'queryset':queryset})
  18. # 当使用了cache后,访问情况变成了如下:访问一个网址时, 尝试从 cache 中找有没有 缓存内容,如果需要的数据在缓存中没有缓存内容,则去数据库取,渲染返回页面,同时 将这些数据保存在缓存中,在一定时间内,当用户再次访问页面时,就没必要去数据库取 了,直接从缓存中拿到数据。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号