django-redis
自定义连接池
import redis from django.shortcuts import render,HttpResponse from utils.redis_pool import POOL def index(request): conn = redis.Redis(connection_pool=POOL) conn.hset('kkk','age',18) return HttpResponse('设置成功') def order(request): conn = redis.Redis(connection_pool=POOL) conn.hget('kkk','age') return HttpResponse('获取成功')
通过第三方组件操作redis
安装
pip3 install django-redis
配置
# redis配置 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "密码", } } }
密码
"LOCATION": "redis://:123123@127.0.0.1:6379",
关于配置缓存时间
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", # "LOCATION": "127.0.0.1:6379:3", "LOCATION": "redis://127.0.0.1:6379/3", 'TIMEOUT': 600,# 缓存超时时间(默认300,None表示永不过期,0表示立即过期 "OPTIONS": { "PASSWORD": "", "CLIENT_CLASS": "django_redis.client.DefaultClient", }, }, }
正常来讲要设置成图示的这样,但是会报bug,改成
"LOCATION": "127.0.0.1:6379:3",
就好了,不知道为什么
使用
import redis from django.shortcuts import render,HttpResponse from django_redis import get_redis_connection def index(request): conn = get_redis_connection("default") conn.hset('kkk','age',18) return HttpResponse('设置成功') def order(request): conn = get_redis_connection("default") conn.hget('kkk','age') return HttpResponse('获取成功')
from rest_framework.views import APIView from rest_framework.response import Response from django.core.cache import cache class OrderView(APIView): def get(self,request,*args,**kwargs): # conn = get_redis_connection('default') cache.set('a','b') print(cache.get('a')) return Response('..')
全站缓存
使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,
当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', # 其他中间件... 'django.middleware.cache.FetchFromCacheMiddleware', ]
单独视图缓存
方式一:通过装饰器
from django.views.decorators.cache import cache_page @cache_page(60 * 15) def my_view(request): ...
方式二:通过url
from django.views.decorators.cache import cache_page urlpatterns = [ url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)), ]
局部页面缓存
1. 引入TemplateTag
{% load cache %}
2. 使用缓存
{% cache 5000 缓存的key %} 缓存内容 {% endcache %}
2.5 django缓存优化 ----目录--- 6.站点和view缓存 settings.py #CACHE_MIDDLEWARE_ALIAS = 'default' CACHE_MIDDLEWARE_SECONDS = 3000 CACHE_MIDDLEWARE_KEY_PREFIX = 'SiteCache' 1. 站点缓存: MIDDLEWARE_CLASSES=( 'django.middleware.cache.UpdateCacheMiddleware', #第一 'django.middleware.cache.CommonMiddleware', .... 'django.middleware.cache.FetchFromCacheMiddleware', #最后 ) 2.1 view缓存,cache_page 装饰器会自动缓存view的response from django.views.decorators.cache import cache_page @cache_page(60*5,key_prefix='my_view_cache') def my_view(request): .... 2.2 也可以在URLconf中使用 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^home/(\d+)/$',cache_page(50*6,key_prefix='home_cache')(home)), ] 7. Template 与 Low-level 缓存 至少需要两个参数 - timeout - name :缓存片段名称 {% load cache %} <!--base.html--> {% block base_navigation_bar %} {% cache 60 navigation_bar using='cache_alias' %} {% for category in category_list %} <li><a href="{% url 'category' %}?id={{ category.id }}">{{ category.name }}</a></li> {% endfor %} {% endcache %} {% endblock %} 8.redis + django ex 过期时间秒 px 过期时间毫秒 nx key不存在时才设置K-V xx key存在时才设置K-V django 方法对应 redis命令 def set -> set/setes def get -> get def add -> setnx/expire def set_many -> mset/setex def get_many -> mget def incr -> exists/incrby/get/set/setex def decr -> def incr def has_key -> exists def ttl -> exists/ttl def expire -> expire #设置过期时间 def persist -> persist #取消过期时间 def delete -> del def clear -> flushdb/del 9.django-redis pip install django-redis-cache settings.py LOCATION 字段: 127.0.0.1:6379 redis://[:pwd]@127.0.0.1:6379/0 ---- CACHES = { 'default': { 'BACKEND': 'redis_cache.RedisCache', 'LOCATION': 'redis://@192.168.1.7:6379/0', 'OPTIONS': { # 'DB': 0, # 'PASSWORD': '', # 'PARSER_CLASS': 'redis.connection.HiredisParser', # 'CONNECTION_POOL_CLASS': 'redis.BlockingConnectionPool', # 'PICKIE_VERSION': '-1', }, 'KEY_PREFIX': 'blog_', } } urls.py ----# 1. view 级别的缓存 urlpatterns = [ url(r'^$', cache_page(60*5)(index), name='index'), ... ] 或者views.py @cache_page(60*5,key_prefix='my_view_cache') def index(request): ... ----templates 缓存 html文件 {{ load cache }} {% cache 300 sidbar using='cache_alias' %} ... {% endcache %} 10.django redis 性能与优化 django-debug-toolbar jmeter 压力测试 @cached_property 装饰器 一个方法被多次调用并做同样的事情,可以缓存其返回值 ----------- https://docs.djangoproject.com/en/1.8/topics/cache/ pip install django_extensions settings.py ---- CACHES = { 'default':{ 'BACKEND':'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION':'127.0.0.1:6789' } #'default':{ # 'BACKEND':'django.core.cache.backends.locmem.LocMemCache', #} } ----使用 from django.core.cache import cache cache.set('k','hello,world',30) #30s超时 cache.get('k') ----Caching API---- per-site per-view python-object template-fragment
CACHE_BACKEND参数
每个缓存后端都可能使用参数。 它们在CACHE_BACKEND设置中以查询字符串形式给出。 有效参数如下:
每个缓存后端都可能使用参数。 它们在CACHE_BACKEND设置中以查询字符串形式给出。 有效参数如下:
- timeout:用于缓存的过期时间,以秒为单位。 这个参数默认被设置为300秒(五分钟)。
- max_entries:对于内存,文件系统和数据库后端,高速缓存允许的最大条目数,超出这个数则旧值将被删除。 这个参数默认是300。
- cull_percentage :当达到 max_entries 的时候,被删除的条目比率。 实际的比率是 1/cull_percentage ,所以设置cull_frequency=2就是在达到 max_entries 的时候去除一半数量的缓存。
把 cull_frequency 的值设置为 0 意味着当达到 max_entries 时,缓存将被清空。 这将以很多缓存丢失为代价,大大提高接受访问的速度。
在这个例子中, timeout 被设成 60
1
|
CACHE_BACKEND = "memcached://127.0.0.1:11211/?timeout=60" |
而在这个例子中, timeout 设为 30 而 max_entries 为 400 :
1
|
CACHE_BACKEND = "locmem:///?timeout=30&max_entries=400" |
其中,非法的参数与非法的参数值都将被忽略。
站点级 Cache
一旦高速缓存设置,最简单的方法是使用缓存缓存整个网站。 您 需要添加'django.middleware.cache.UpdateCacheMiddleware'和 ‘django.middleware.cache.FetchFromCacheMiddleware'到您的MIDDLEWARE_CLASSES设置中,在这个例子中是:
1
2
3
4
5
|
MIDDLEWARE_CLASSES = ( 'django.middleware.cache.UpdateCacheMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware', ) |
注意:
不,这里并没有排版错误: 修改的中间件,必须放在列表的开始位置,而fectch中间件,必须放在最后。 细节有点费解,如果您想了解完整内幕请参看下面的MIDDLEWARE_CLASSES顺序。
然后,在你的Django settings文件里加入下面所需的设置:
- CACHE_MIDDLEWARE_SECONDS :每个页面应该被缓存的秒数。
- CACHE_MIDDLEWARE_KEY_PREFIX :如果缓存被多个使用相同Django安装的网站所共享,那么把这个值设成当前网站名,或其他能代表这个Django实例的唯一字符串,以避免key发生冲突。 如果你不在意的话可以设成空字符串。
缓存中间件缓存每个没有GET或者POST参数的页面。 或者,如果CACHE_MIDDLEWARE_ANONYMOUS_ONLY设置为True,只有匿名请求(即不是由登录的用户)将被缓存。 如果想取消用户相关页面(user-specific pages)的缓存,例如Djangos 的管理界面,这是一种既简单又有效的方法。 CACHE_MIDDLEWARE_ANONYMOUS_ONLY,你应该确保你已经启动AuthenticationMiddleware。
此外,缓存中间件为每个HttpResponse自动设置了几个头部信息:
- 当一个新(没缓存的)版本的页面被请求时设置Last-Modified头部为当前日期/时间。
- 设置Expires头部为当前日期/时间加上定义的CACHE_MIDDLEWARE_SECONDS。
- 设置Cache-Control头部来给页面一个最长的有效期,值来自于CACHE_MIDDLEWARE_SECONDS设置。
如果视图设置自己的缓存到期时间(即 它有一个最大年龄在头部信息的Cache-Control中),那么页面将缓存直到过期,而不是CACHE_MIDDLEWARE_SECONDS。使用django.views.decorators.cache装饰器,您可以轻松地设置视图的到期时间(使用cache_control装饰器)或禁用缓存视图(使用never_cache装饰器)。
I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我