前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django使用redis

Django使用redis

作者头像
菲宇
发布2019-06-12 17:47:52
1.5K0
发布2019-06-12 17:47:52
举报
文章被收录于专栏:菲宇菲宇菲宇

一、安装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 %}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档