Django之缓存

缓存

关注公众号“轻松学编程”了解更多。

1、缓存的必要性
  • 优化数据结构
  • 优化了对数据的查询,筛选,过滤
  • 减少了对磁盘的IO
2、缓存原理
  • 获取数据的时候就是去缓存中拿
  • 拿到了直接返回
  • 没拿到就去数据库中查询,筛选,然后缓存到数据库, 然后返回给模板
3、实现方案
  • 内存
  • 文件
  • 数据库
4、django内置的缓存模块
  • 缓存配置

    • settings.py

      CACHES = {
          'default': {
              'BACKEND':'django.core.cache.backends.db.DatabaseCache',
              'LOCATION': 'my_cache_table',
              'OPTIONS': {
                  'MAX_ENTRIES': 1000
              },
          }
      }
      
    • 创建缓存表

 #[xxx] 为表名 若不指定则使用默认的,在settings.py中设置的
 #即'LOCATION': 'my_cache_table'中的my_cache_table
 
 python manage.py createcachetable [xxx]`
  • @cache_page(60)

    • timeout
    • cache
      • 缓存到哪一个库中
      • 很少使用
      • 针对于系统配置了多个缓存
    • key_prefix
      • 前缀
    • @cache_page(60,cache=‘sqlite’,key_prefix=‘sl-’)
  • 原生cache

    • set(key, value, timeout)

    • get(key)

    • cache.set_many({‘a’: 1, ‘b’: 2, ‘c’: 3})

    • cache.get_many([‘a’, ‘b’, ‘c’])

    • cache.delete(‘a’)

    • cache.delete_many([‘a’, ‘b’, ‘c’])

    • cache.clear()

    • 缓存视图函数

      • template = loader.get_template(‘student_list.html’)
      • result = template.render(data)
      • ----------
      • cache.set(‘get_students’, result, 60)
      • students_cache = cache.get(‘get_students’)

      views.py中应用

      #把showBlogs中的context存进缓存,过期时间为60秒,前缀为blog,使用的缓存是settings.py中的default
      @cache_page(60,key_prefix='blog',cache='default')
      def showBlogs(request, pagenum):
      	pass
          # 将数据丢给页面渲染
          return render(request, 'blogs.html', context=data)
      
5、使用redis实现缓存
  • 安装django-redis模块

  • 用法和django内置的相同

  • settings.py设置

    'redis_special': {
            "BACKEND": "django_redis.cache.RedisCache",
            #"LOCATION": "redis://:你的密码@服务器地址:6379/0",
            "LOCATION": "redis://:123456@127.0.0.1:6379/0",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            },
    
            'TIMEOUT': 60,
        },
    

    在views.py中应用

    def readBlog(request, blogid):
    	#从缓存中获取内容	
        content = cache.get('readblog'+blogid)
    	#如果缓存中没有内容就去数据库中查询
        if not content:
            blog = Blog.objects.filter(id=blogid).first()
            if blog:
                template = loader.get_template('read-blog.html')
                content = template.render(context={'blog': blog})
                #把content存进缓存
                cache.set('readblog'+blogid,content)
    
                return HttpResponse(content)
            else:
                return HttpResponse('您查看的博文不存在')
        else:
            return HttpResponse(content)
    

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

公众号

赞赏码

关注我,我们一起成长~~

posted @ 2018-06-01 17:15  轻松学编程  阅读(58)  评论(0编辑  收藏  举报