一、安装django-redis和settings配置
pip install django-redis
settings.py中加入以下内容,your_host_ip换成你的服务器地址,yoursecret换成你的服务器密码
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://your_host_ip:6379',
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "yoursecret",
},
},
}
REDIS_TIMEOUT=7*24*60*60
CUBES_REDIS_TIMEOUT=60*60
NEVER_REDIS_TIMEOUT=365*24*60*60
cache中的是必须的,下面三条可有可无
二,测试缓存是否成功
本步骤非必须,只是为了测试看可否正常使用redis。
进入django的后台命令模式:
python manage.py shell
逐条输入如下命令测试:
from django.core.cache import cache #引入缓存模块
cache.set('v', '555', 60*60) #写入key为v,值为555的缓存,有效期30分钟
cache.has_key('v') #判断key为v是否存在
cache.get('v') #获取key为v的缓存
三、项目实战
给公司销售人员自动分配客户资源:
1. 创建一张新的表,关联到销售人员,配置权限和每天可分配的客户数量;
2 . 通过权重表控制销售人员的分配权重,权重数越大,越优先分配客户;
3. Django代码通过order_by从大到小排序;
4. 然后以销售人员的可分配的数据作为列表出现的个数
自动分配
分配表:
姓名 数量 权重
番禺 3 7
富贵 3 6
短期 2 9
秦晓 10 1
先获取并排序:
短期 2
番禺 3
富贵 3
秦晓 10
4. 代码实现
import redis
from crm import models
POOL = redis.ConnectionPool(host='10.0.0.10',port=6379)
CONN = redis.Redis(connection_pool=POOL)
class AutoSale(object):
iter_users = None # iter([1,2,1,2,3,1,...])
reset_status = False
@classmethod
def fetch_users(cls):
# [obj(销售顾问id,num),obj(销售顾问id,num),obj(销售顾问id,num),obj(销售顾问id,num),]
ret = models.SaleRank.objects.all().order_by('-weight')
sale_id_list = []
for row in ret:
for i in range(row.num):
sale_id_list.append(row.user.id)
# cls.users = sale_id_list
if sale_id_list:
CONN.rpush('saleid_list',*sale_id_list) # 自动pop数据
CONN.rpush('saleid_list_copy',*sale_id_list) # 原来的数据
return True
return False
@classmethod
def get_sale_id(cls):
# 查看原来数据是否存在
sale_id_origin_count = CONN.llen('saleid_list_copy')
if not sale_id_origin_count:
# 去数据库中获取数据,并赋值给: 原数据,pop数据
status = cls.fetch_users()
if not status:
return None
user_id = CONN.lpop('saleid_list')
if user_id:
return user_id
reset = CONN.get('saleid_reset')
if reset:
CONN.delete('saleid_list_copy')
status = cls.fetch_users()
if not status:
return None
CONN.delete('saleid_reset')
return CONN.lpop('saleid_list')
else:
ct = CONN.llen('saleid_list_copy')
for i in range(ct):
v = CONN.lindex('saleid_list_copy',i)
CONN.rpush('saleid_list',v)
return CONN.lpop('saleid_list')
@classmethod
def reset(cls):
CONN.set('saleid_reset',1)
@classmethod
def rollback(cls,nid):
CONN.lpush('saleid_list',nid)
5. 使用
form = SingleModelForm
from xxxxxx import AutoSale
sale_id = AutoSale.get_sale_id()
print(sale_id)
# 每次请求就会从redis中pop出一条数据,当pop完之后,则AutoSale会自动拷贝saleid_list_copy中的数据到saleid_list中,以便下次pop出数据
案例
自定义连接池
这种方式跟普通py文件操作redis一样,代码如下:
views.py
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
配置
settings.py
# 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": "密码", } } }
使用
views.py
import redis from django.shortcuts import render,HttpResponse from django_redis import get_redis_connection def index(request): conn = get_redis_connection("default") return HttpResponse('设置成功') def order(request): conn = get_redis_connection("default") return HttpResponse('获取成功')
全站缓存
使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,
当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', # 其他中间件... 'django.middleware.cache.FetchFromCacheMiddleware', ]
一个放在最上面,一个放在最下面
views.py
from django.shortcuts import render,HttpResponse import time def index(request): ctime = str(time.time()) return HttpResponse(ctime) def order(request): ctime = str(time.time()) return HttpResponse(ctime)
配置了全站缓存,在不同的时间(一定范围内),上面两个视图返回的时间是一样的,都是缓存时的时间
单独视图缓存
方式一:通过装饰器
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 %}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。