django设置redis做为缓存

缓存

  • 缓存就是一种优化网站性能的方案,是一个利刃,用的好可以给服务器大量降压,用得不好,反而成为压垮骆驼的最后一根草。

  • 所谓的缓存,实际上往往是把数据库中数据提取出来,并临时存放到一个第三方设备/文件中。

  • 一般常见的缓存存储介质:内存(redis/memcached/mysql的内存表),硬盘文件中,CDN(内容分发网络)

  • 对于中等流量的网站来说,尽可能地减少开销是必要的。缓存数据就是为了保存那些需要很多计算资源的结果,这样的话就不必在下次重复消耗计算资源

  • Django自带了一个健壮的缓存系统来保存动态页面,避免对于每次请求都重新计算

  • Django提供了不同级别的缓存粒度:可以缓存特定视图的输出、可以仅仅缓存那些很难生产出来的部分、或者可以缓存整个网站

    • 视图缓存

    • 模板缓存

    • 缓存API

设置缓存

  • 通过设置决定把数据缓存在哪里,是数据库中、文件系统还是在内存中

  • 通过settings文件的CACHES配置来实现

  • 参数TIMEOUT:缓存的默认过期时间,以秒为单位,这个参数默认是300秒,即5分钟;设置TIMEOUT为None表示永远不会过期,值设置成0造成缓存立即失效

CACHES={
   'default': {
       'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
       'TIMEOUT': 60,
  }
}
  • 可以将cache存到redis中,默认采用1号数据库,此处我们暂时没有学习到redis,但是学习的镜像中已经预装了redis了。

  • 需要安装包并配置如下:

安装包:pip install django-redis-cache 或者 pip install django_redis

CACHES = {
   "default": {
       
       "BACKEND": "redis_cache.cache.RedisCache", # django-redis-cache
       # "BACKEND": "django_redis.cache.RedisCache", # django_redis
       "LOCATION": "redis://:@127.0.0.1:6379/1",  # 数据源格式连接写法 mysql://账号:密码@IP:端口/数据库名称?
       'TIMEOUT': 60, # 缓存失效时间,这里60秒只是为了测试而已
  },
}
  • 可以连接redis查看存的数据

# 终端下连接redis,进行redis交互终端:
redis-cli
# 切换数据库:
select 1
# 设置一个数据,保存到指定变量名中 set 变量 值
set name xiaoming
# 查看数据的变量(键/key):
keys *
# 获取指定变量名的数据:
get 键

 

视图缓存

  • django.views.decorators.cache定义了cache_page装饰器,用于对视图的输出进行缓存

  • 示例代码如下:

from django.views.decorators.cache import cache_page
# 函数视图
@cache_page(60 * 15)
def index(request):
   return HttpResponse('hello!')

# 类视图
from django.views.decorators.cache import cache_page  # 这个方法方法只能用于装饰函数视图
# 针对一些只能用于装饰函数视图的装饰器,想要在类视图方法中使用必须要使用 method_decorator 来改写
class Home(View):
   @method_decorator(cache_page(60 * 15))
   def get(self,request):
       print("hello") # 执行了这里的hello,则表示缓存失效了。
       return HttpResponse('Hello, async base view!')
  • cache_page接受一个参数:timeout,秒为单位,上例中缓存了15分钟

  • 视图缓存与URL无关,如果多个URL指向同一视图,每个URL将会分别缓存

 

缓存API

from django.core.cache import cache
设置:cache.set(键,值,有效时间)
获取:cache.get(键)
删除:cache.delete(键)
清空:cache.clear() # 慎用

视图,代码:

from django.core.cache import cache
class CacheView(View):
   def get(self,request):
       # 通过缓存api先查询缓存
       student_list = cache.get("student_list")
       if not student_list:
           print("如果没有缓存,则到数据库查询")
           student_list = Student.objects.all()
           # 查询完成建立缓存   过期时间 为60秒
           cache.set("student_list", student_list, 60)
       print(student_list)
       return HttpResponse("ok")

urls.py,代码:

    path("cache", views.CacheView.as_view()),

 

posted @ 2021-12-16 15:50  urls  阅读(244)  评论(0编辑  收藏  举报