慕课网-Django入门到进阶-更适合Python小白的系统课程-第4章Django中的ORM和数据库-4.7redis在django中的两种配置方法与使用&缓存装饰器的书写

第4章 Django 中的 ORM 和数据库

4.7 redis 在 django 中的两种配置方法与使用&缓存装饰器的书写

什么是 Redis

1.Redis 是一个基于内存的非关系型数据库。他通过 key:value 的形式存储。有着多种数据结构,如字符串、列表、集合等。

2.通过 Redis 我们可以进行数据缓存,防止底层数据库频繁 IO,提升性能。

Redis 的依赖

pip install redis
pip install django-redis

Django 中 Redis 的配置方法

CHCHES = {
    "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": "密码", 
        }
    }
}  

不依赖 Django 的 Redis 配置方法

import redis
conn = redis.Redis(host='10.0.0.10', port=6379)

Django 中使用 Redis 方法

from django_redis import get_redis_connection
cache = get_redis_connection('default')
cache.set(key, value, expire)
rs = cache.get(key)

from xxx import redis_conn
redis.conn.set(key, value, expire)
rs = redis_conn.get(key)

Redis 的安装

#Mac 
brew install redis

#Ubuntu
apt-get install redis

#Centos/redhat 
yum install redis

#Window
#下载链接:http://www.redis.net.cn/download/ 

Redis 启动方法

./redis-server &
./redis-server 配置文件.conf

实例

1.在命令行窗口添加 Redis 组件

pip install redis
pip install django-redis

2.在项目 Four 下目录 four,修改文件 settings.py,在 DATABASES 行下添加 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': 200
            }
        }
    }
}

3.打开 Redis 服务端

4.在项目 four 下进入 shell

python manage.py shell  

5.在 shell 输入代码测试

from django_redis import get_redis_connection

cache = get_redis_connection('default')
cache.set('name', 'dewei', 10)

6.打开 Redis 客户端,查看数据

get name

7.在 shell 输入代码测试 

cache.set('name', 'dewei', 100)
cache.get('name')

8.在 shell 输入代码测试,换另外一种操作 redis 方式

import redis
cache = redis.Redis(host='localhost', port=6379)
cache.set('name', 'dewei')
cache.get('name')

9.在 shell 输入代码测试,查看数据类型

value = cache.get('name')
type(value)

10.在 shell 输入代码测试,查看 Json

import json 
data = {'age', 20}
cache.set('name', json.dumps(data))
value = cache.get('name')
value

# 可能会报错,Python 版本不一样可能出现不会报错的情况(例如:Python 3.5 会报错)
json.loads(value) 

# 改成这样
json.loads(value.decode('utf-8')) 

10.在项目 Four 下目录 app,修改文件 models.py,添加 Redis 代码,并修改类 User

#coding: utf-8

import json

from functools import wraps
from django.db import models
from django_redis import get_redis_connection

_cache = get_redis_connection('default')

def cache(func):
    @wraps(func)
    def wrapper(obj, *args):
        key = args[0]
        value = _cache.get(key)
        if value:
            print('get it!')
            return json.loads(value)
        rs = func(obj, *args)
        _cache.set(key, json.dumps(rs))
        return rs
    return wrapper

class Test(models.Model):
    name = models.IntegerField()

class User(models.Model):
    username = models.CharField(unique=True, max_length=50, blank=False)
    age = models.SmallIntegerField(default=0)
    phone = models.IntegerField(db_index=True, blank=True, default=0)
    email = models.EmailField(blank=True, default='')
    info = models.TextField()
    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)

    class Meta:
        index_together = ['username', 'phone']

    def __str__(self):
        return 'user:{}'.format(self.username)

    @classmethod
    @cache
    def get(cls, id):
        rs = cls.objects.get(id=id)
        return {
            'id': rs.id,
            'username': rs.username,
            'age': rs.age,
            'email': rs.email,
            'info': rs.info,
            'create_time': str(rs.create_time),
            'update_time': str(rs.update_time)
        }

class Userprofile(models.Model):
    user = models.OneToOneField(User, blank=True, null=True, on_delete=models.SET_NULL)
    birthday = models.CharField(max_length=100, blank=True, default='')

    def __str__(self):
        return 'user:{}, birthday:{}'.format(self.user.username, self.birthday)

class Diary(models.Model):
    user = models.ForeignKey(User, related_name='diary', on_delete=models.SET_NULL, blank=True, null=True)
    content = models.TextField()
    create_time = models.IntegerField()

class Group(models.Model):
    user = models.ManyToManyField(User, related_name='group')
    name = models.CharField(max_length=20)
    create_time = models.IntegerField()

11.在项目 four 下进入 shell

python manage.py shell

12.进入 shell 输入代码测试

from app.models import User
user = User.get(1)
user

13.打开 Redis 客户端,查看数据

 

posted on 2020-02-01 10:12  herisson_pan  阅读(10)  评论(0)    收藏  举报

导航