技术标签: Django 学习笔记 django 缓存 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
中可以配置多种缓存源,支持的缓存设置有:
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-redis
或 django-redis-cache
Redis
包操作 Redis
,不使用 Django
模块,缺点是无法使用内置缓存模块的接口,不推荐安装
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
片段,使用缓存可以减少多次重复操作参考文章
文章浏览阅读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++使用时值为多少
文章浏览阅读317次。模板规则{ "order": 0, // 模板优先级 "template": "sample_info*", // 模板匹配的名称方式 "settings": {...}, // 索引设置 "mappings": {...}, ..._elasticsearch 动态模板
文章浏览阅读8.5k次,点赞9次,收藏41次。导读:之前刚学安卓时,写过一篇“Android调用系统shareAPI实现分享转发功能”的文章,随着安卓版本的迭代更新以及其他APP的优化,安卓的这个shareAPI好像失效了,不怎么好使,已经获取不到有分享功能的APP列表,点击分享也会直接崩溃。并不是说我之前那篇文章的代码有错,只能说是时代有了变化,旧的方法已经不能满足新的需求,我并不打算删掉原来的那篇文章,旧文章地址如下(仅作参考):Android调用系统shareAPI实现分享转发功能_美奇软件开发工作室-程序员宅基地需求分析:在开发APP_android 微信分享的图片到第三方怎么弄
文章浏览阅读6.7k次,点赞3次,收藏22次。这篇其实基本上是引用 窦海霓, 朱铭锆发表在《今日电子》上的论文《DSP基本体系结构和特点》中的一些内容,主要是为了配合前一篇ARM体系结构而写,为了形成对比,加深印象。网络上很多引用这篇小论文的,但请尊重原著,注明出处。 一、DSP自身的一些优越性:DSP处理器的体系结构一直紧紧围绕着DSP算法和各种应用的不断发展而改进和优化,随着各种并行处理技术(VLIW,SIMD,超_怎么知道optisystem中dsp的组成
文章浏览阅读1.2k次。MPAndroidChart 饼图 数据过少时文字重叠在使用MPAndroidChart这个控件来画饼图时,当有几个数据都是占比非常少的时候,伸出来的文字会重叠在一块。 这个坑花了比较多的时间填 。在网上找了一圈,都是复制的别人的文章。按照文章思路做了之后,还是会有重叠,而且有些时候线条很丑。这位大哥可能是原创的,有兴趣的可以点进去看下文章链接也有可能是我的使用姿势不对,始终没有达到我想要的效果。一番折腾后,决定自己动手改造。改造后的效果图基本思路是,找到绘制线条的类。PieChartR_mpandroidchart 饼分图 重叠
文章浏览阅读6.4w次,点赞58次,收藏402次。PC机以前是Windows系统现在重装Linux系统材料: 8G以上U盘(eveything版本很大,如果U盘容量不足请选择DVD版本ISO) UltralSO Linux系统(Centos7_64_eveything.iso) tips:准..._本地window电脑改linux系统
文章浏览阅读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 软件。面试前一周测试连接了一次,基本没卡顿,像打电话一样。然而,昨天正式面试时,不仅十分卡,而且一会我直接连不上了。但在面试前,或者面试后,我都能连上。总结,估..._海外博后面试软件
文章浏览阅读1w次,点赞26次,收藏50次。废话不多说,直接开干 基础命令,npm 的一些重要命令,拿到就是赚到,有赞必回_node命令
文章浏览阅读3.4k次。this可以指向类内部非静态成员。path.lineTo();用循环的话不填充。将path的轨迹写出来的话,就有填充。_qt drawpath填充不同颜色
文章浏览阅读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
文章浏览阅读2.9k次,点赞114次,收藏46次。JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了JIT即时编译器、HotSpot中的JIT编译器、JIT优化技术、JIT优化建议等内容。_jvm 中的 jit 即时编译器