Django 中使用 Redis 缓存_django redis缓存-程序员宅基地

技术标签: Django 学习笔记  django  缓存  redis  

缓存主要用来加速慢存储的访问效率,减少对数据库的操作,提升页面访问速度。

一、CentOS 安装 Redis

yum install epel-releas # 添加 EPEL 仓库
yum update  # 更新 yum 源

yum -y install redis
systemctl start redis   # 启动 redis 服务

配置可远程连接 Redis

修改配置文件:/etc/redis.conf

# 找到 `bind 127.0.0.1`,注释掉这一行

# 将 protected-mode 修改为 no
protected-mode no

# 保存重启 `redis` 服务
systemctl restart redis

二、Django 中缓存设置

Django 支持的缓存机制

Django 中可以配置多种缓存源,支持的缓存设置有:

  • 内存缓存
  • 文件缓存
  • 数据库缓存
  • memcached 缓存
  • redis 缓存

内存缓存

local-memory-caching,线程安全的,进程间独立,即每个进程一份缓存,Django 默认配置,配置示例如下:

CACHES = {
    
    'default': {
    
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
}

文件缓存

filesystem caching,将数据缓存到文件系统中,配置示例如下:

CACHES = {
    
    'default': {
    
        'BACKEND': 'django.core.cache.backends.filebackend.FileBaseCache',
        'LOCATION': '/var/tmp/django_cache',
    }
}

数据库缓存

database caching,需要创建缓存用的表,意义不大,不推荐使用,配置示例如下:

CACHES = {
    
    'default': {
    
        'BACKEND': 'django.core.cache.backends.db.DataaseCache',
        'LOCATION': 'my_cache_table',
    }
}

memcached

Django 推荐的缓存系统,也是分布式的(分布式逻辑在客户端),Django 内置支持,集成度比较好,配置示例如下:

CACHES = {
    
    'default': {
    
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            '172.19.26.240:11211',
            '172.19.26.242.11211',
        ],
    }
}

redis 缓存

使用 redis 缓存有两种思路:

  • Django 模块:django-redisdjango-redis-cache
  • 直接使用 Redis 包操作 Redis,不使用 Django 模块,缺点是无法使用内置缓存模块的接口,不推荐

配置 redis 缓存

安装

pip install django-redis==4.9.0
pip install hiredis

默认安装的 redis 是最新版,使用缓存时可能会报错:redis.exceptions.DataError: Invalid input of type: 'CacheKey'.,可将版本降为 2.10.6

pip install redis==2.10.6

hiredis 的作用是提升 redis 解析性能,具体测试结果可在 https://github.com/redis/hiredis-py#benchmarks


配置

配置 Projects/settings.py

# Redis 缓存

REDIS_URL = 'redis://192.168.131.131:6379/1'

CACHES = {
    
    'default': {
    
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': REDIS_URL,
        'TIMEOUT': 300,
        'OPTIONS': {
    
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'PASSWORD_CLASS': 'redis.connection.HiredisParser',
        },
        'CONNECTION_POOL_CLASS': 'redis.connection.BlockingConnectionPool',
    }
}

应用场景和缓存粒度

使用缓存首先要知道在哪缓存、缓存什么,即使用场景,千万不要以为缓存一定能优化访问效率,一定要先知道项目的业务特点。

Django 提供的各种粒度的缓存方案:

  • 整站缓存:配置中间件即可,不推荐
  • 整个页面缓存
  • 局部数据缓存

整站缓存

配置 settings 中间件:

MIDDLEWARE = [ 
# 站点缓存 , 注意必须在第一个位置 
'django.middleware.cache.UpdateCacheMiddleware', 
... 
# 站点缓存, 注意必须在最后一个位置 
'django.middleware.cache.FetchFromCacheMiddleware',
 ]

若内容在缓存中存在,则使用 FetchFromCacheMiddleware 获取内容并返回,在返回之前,判断缓存中是否已存在,若不存在则 UpdateCacheMiddleware 会将缓存保存至缓存,从而实现全站缓存。

单页面缓存

from django.shortcuts import render, HttpResponse
import time
from django.views.decorators.cache import cache_page

  
@cache_page(60 * 15)
def index(request):
    ctime = str(time.time())
    return render('index.html', locals())

局部数据缓存

class BookListView(View):
    """书籍列表"""

    def get(self, request):
        res = {
    "code": 0, "msg": "查询成功", "data": []}

        book_list = cache.get('book_list')
        if not book_list:
            book_list = models.Book.objects.all()
            cache.set('book_list', book_list, 10 * 60)

        res["data"] = json.loads(serializers.serialize("json", book_list))

        return JsonResponse(res)

首先从缓存中获取数据,若不存在则从数据库取出,并放入缓存中,以便下次使用。

URLconf 中使用缓存

场景:多个 URL 指向同一视图函数,但只想缓存一部分 URL

from django.views.decorators.cache import cache _page
urlpatterns = [
    url(r'^foo/([0-9]{1,2})/$',cache_page(60 * 15)(index)),
    url(r'^$', cache_page(60 * 30)(IndexView.as_view()), name='order'),
    ]

URL 缓存缓存的也是整个页面,需要考虑是否整个页面都应该缓存。

模板页面(局部页面)缓存

模板中使用缓存时比较推荐的一种方式,可以充分利用缓存粒度,可保证只缓存那些适合缓存的 HTML 片段:

{% load cache %}
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>Myblog</title>
</head>
<body>
    <h2>测试redis</h2>
    <div><p>非缓存地段</p></div>
 
    {% cache 10 aabbcc %}
    <div><p>这里缓存</p></div>
    {% endcache %}
     
</body>

测试缓存

在配置好后,应用之前可以先用 Django shell 测试是否能够成功:

python manage.py shell

from django.core.cache import cache

cache.set('book_list', '流畅的 Python', 60 * 60)
cache.has_key('book_list')
cache.get('book_list)

缓存使用原则

  • 静态页面
  • 不经常变动的页面或数据,实时性不高的数据,如文章热门排行榜等
  • 不建议缓存整个页面,因为页面会经常变动,但是可以缓存侧边栏,侧边栏不经常变动
  • 复杂逻辑生成的 HTML 片段,使用缓存可以减少多次重复操作

参考文章

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hj1993/article/details/129570612

智能推荐

c 语言a作用,C语言菜鸟基础教程之a++与++a-程序员宅基地

文章浏览阅读3.4k次。(一)a++在C语言或其它语言中,++符号表示“自加”,就是变量在原来的基础上加1。例1:a = 0;a++;则此时a的值为1。同样的道理,--表示”自减”。例2:a = 100;a--;则此时a的值为99。注意,程序语言里没有”自乘”和”自除”的概念。验证程序:#include int main(){int a = 0; // 给a赋值a++;printf("After ++, a = %d\n..._a++使用时值为多少

Elasticsearch动态模板_elasticsearch 动态模板-程序员宅基地

文章浏览阅读317次。模板规则{ "order": 0, // 模板优先级 "template": "sample_info*", // 模板匹配的名称方式 "settings": {...}, // 索引设置 "mappings": {...}, ..._elasticsearch 动态模板

Android原生态实现分享转发功能(分享图片到其他APP)_android 微信分享的图片到第三方怎么弄-程序员宅基地

文章浏览阅读8.5k次,点赞9次,收藏41次。导读:之前刚学安卓时,写过一篇“Android调用系统shareAPI实现分享转发功能”的文章,随着安卓版本的迭代更新以及其他APP的优化,安卓的这个shareAPI好像失效了,不怎么好使,已经获取不到有分享功能的APP列表,点击分享也会直接崩溃。并不是说我之前那篇文章的代码有错,只能说是时代有了变化,旧的方法已经不能满足新的需求,我并不打算删掉原来的那篇文章,旧文章地址如下(仅作参考):Android调用系统shareAPI实现分享转发功能_美奇软件开发工作室-程序员宅基地需求分析:在开发APP_android 微信分享的图片到第三方怎么弄

了解DSP的体系结构_怎么知道optisystem中dsp的组成-程序员宅基地

文章浏览阅读6.7k次,点赞3次,收藏22次。这篇其实基本上是引用 窦海霓, 朱铭锆发表在《今日电子》上的论文《DSP基本体系结构和特点》中的一些内容,主要是为了配合前一篇ARM体系结构而写,为了形成对比,加深印象。网络上很多引用这篇小论文的,但请尊重原著,注明出处。 一、DSP自身的一些优越性:DSP处理器的体系结构一直紧紧围绕着DSP算法和各种应用的不断发展而改进和优化,随着各种并行处理技术(VLIW,SIMD,超_怎么知道optisystem中dsp的组成

MPAndroidChart 饼图 数据过少时文字重叠_mpandroidchart 饼分图 重叠-程序员宅基地

文章浏览阅读1.2k次。MPAndroidChart 饼图 数据过少时文字重叠在使用MPAndroidChart这个控件来画饼图时,当有几个数据都是占比非常少的时候,伸出来的文字会重叠在一块。 这个坑花了比较多的时间填 。在网上找了一圈,都是复制的别人的文章。按照文章思路做了之后,还是会有重叠,而且有些时候线条很丑。这位大哥可能是原创的,有兴趣的可以点进去看下文章链接也有可能是我的使用姿势不对,始终没有达到我想要的效果。一番折腾后,决定自己动手改造。改造后的效果图基本思路是,找到绘制线条的类。PieChartR_mpandroidchart 饼分图 重叠

Windows系统重装Linux系统_本地window电脑改linux系统-程序员宅基地

文章浏览阅读6.4w次,点赞58次,收藏402次。PC机以前是Windows系统现在重装Linux系统材料: 8G以上U盘(eveything版本很大,如果U盘容量不足请选择DVD版本ISO) UltralSO Linux系统(Centos7_64_eveything.iso) tips:准..._本地window电脑改linux系统

随便推点

nginx: [error] invalid PID number ““ in “/app/nginx/logs/nginx.pid“_nginx: [error] invalid pid number "" in "/apps/ngi-程序员宅基地

文章浏览阅读1.3k次。需要将http://192.168.1.225:9080/building/通过代理http://192.168.1.225:8081/building/访问。[root@localhost conf]# vi nginx.conf#user nobody;worker_processes 1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info..._nginx: [error] invalid pid number "" in "/apps/nginx/logs/nginx.pid

一次尴尬的面试经历-程序员宅基地

文章浏览阅读71次。这段时间投了不少国外的博后岗位,好不容易收到了一个面试机会,我准备了一周多,竟然因为网络问题而被 pass 了,心里感到有点生气跟遗憾。这个海外博后,要求视频会议面试,用到一个 vidyodesktop 软件。面试前一周测试连接了一次,基本没卡顿,像打电话一样。然而,昨天正式面试时,不仅十分卡,而且一会我直接连不上了。但在面试前,或者面试后,我都能连上。总结,估..._海外博后面试软件

node.js 常用命令_node命令-程序员宅基地

文章浏览阅读1w次,点赞26次,收藏50次。​​​​废话不多说,直接开干 基础命令,npm 的一些重要命令,拿到就是赚到,有赞必回_node命令

QT——(无规则)多边形图形填充。_qt drawpath填充不同颜色-程序员宅基地

文章浏览阅读3.4k次。this可以指向类内部非静态成员。path.lineTo();用循环的话不填充。将path的轨迹写出来的话,就有填充。_qt drawpath填充不同颜色

HCLA从基础到成熟-程序员宅基地

文章浏览阅读1.6k次,点赞47次,收藏21次。9.9-DHCP静态路由的设置:1.如何开始dhcp服务:首先进入二级命令,dhcp enable 开启dhcp服务,然后创建池塘:IP pool xx为池塘取个名字 一台设备上可以有多个池塘,但一个池塘只能服务一个广播域,network ---IP----mask 24绑定接口(此处绑定的接口为所要分配的IP范围),gateway该网段的网关地址(此处填写的IP地址为接口所在的网关地址),dns-list --ip --子网掩码(144.144.144.144),服务器地址,最后进入接口dhcp se

JVM工作原理与实战(三十八):JIT即时编译器原理_jvm 中的 jit 即时编译器-程序员宅基地

文章浏览阅读2.9k次,点赞114次,收藏46次。JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了JIT即时编译器、HotSpot中的JIT编译器、JIT优化技术、JIT优化建议等内容。_jvm 中的 jit 即时编译器

推荐文章

热门文章

相关标签