栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Django——redis的配置方法与使用&缓存装饰器的书写

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django——redis的配置方法与使用&缓存装饰器的书写

redis基于内存的数据库。
MySQL的数据是存在磁盘中的,磁盘读取速度是没有内存读取快的,为了提升性能就会把一些数据存在内存中。
比如微博,就有很多缓存的服务器,相比于直接读内存,性能会有很大提升。

一、连接redis

首先安装django-redis pip install django-redis redis
然后在settings中配置:

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}
        }
    }
}

如果redis有密码,就再加个password,我没有就没加。

第一种连接方法

进入shell

>>> from django_redis import get_redis_connection
>>> cache = get_redis_connection('default')

然后进入redis客户端:
先进入redis目录,再输入redis-cli
然后get name,里面是空的。

在shell里:cache.set('name', 'cong', 10)
这里面的10 是指在缓存中的时间是10s,10s内可以get到,10s后就get不到了。

在redis客户端:

get到了,又没了哈哈哈。

如果不加时间呢,就一直不会删除,什么时候都能get到。但是如果内存被占满了,redis就会删除一些不常用的数据,或很老的数据。

第二种连接方法

在shell中:

>>> import redis
>>> cache = redis.Redis(host='localhost', port=6379)
>>> cache
Redis>>

也可以连上。

知识点:Python3.x在读取redis时,读取的是比特类型。

>>> import json
>>> data = {'age':20}
>>> cache.set('name',json.dumps(data))
True
>>> value = cache.get('name')
>>> value
b'{"age": 20}'
>>> json.loads(value)
{'age': 20}
>>> value.decode('utf-8')
'{"age": 20}'
>>> json.loads(value.decode('utf-8'))
{'age': 20}
二、缓存装饰器
from django_redis import get_redis_connection

_cache = get_redis_connection('default')  # 初始化 一般可以放在一个初始化文件里,然后每次调用cache就可以了


# 装饰器
def cache(func):
    @wraps(func)
    def wrapper(obj, *args):
        key = args[0]
        value = _cache.get(key)
        if value:  # 如果value存在
            return json.loads(value)
        rs = func(obj, *args)
        _cache.set(key, json.dumps(rs))
        return rs
    return wrapper

然后在user模型中定义一个方法:

@classmethod
    @cache
    def get(cls, idd):
        rs = cls.objects.get(id=idd)
        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)
        }

在shell中使一下:

>>> from app.models import User
>>> user = User.get(1)
>>> user
{'id': 1, 'username': 'cong', 'age': 18, 'email': 'cong@qq.com', 'info': '加油丛丛', 'create_time': '2021-11-13 08:00:35.317926+00:00', 'update_time': '2021-11-13 08:00:35.317926+00:00'}

哎之前这里一直有问题,后来重新开了一下shell好了,真的是心累哈哈哈哈,加油加油

关于wraps装饰器,找了一下别人的解释:
Python装饰器(decorator)在实现的时候,有一些细节需要被注意。例如,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变)。这样有时候会对程序造成一些不便,例如笔者想对flask框架中的一些函数添加自定义的decorator,添加后由于函数名和函数的doc发生了改变,对测试结果有一些影响。

所以,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。
————————————————
版权声明:本文为CSDN博主「天痕坤」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kun1280437633/article/details/80315895

就是说如果你在写装饰器时,里面用到了一些其他的函数方法时,你加上这个装饰器,就可以确保这些函数依旧可以正常使用(我这么认为的)。
比如上面的代码使用了 cache.get 和cache.set,就确保他们可以使用吧。

装饰器代码解释

装饰器在这里的作用是拿到缓存的key去redis里去获取 判断是否存在 ,如果存在直接返回,不再执行业务函数,如果不存在则执行业务函数,将函数结果缓存起来以便下次调用使用,并将结果返回。

然后去redis看一下,可以取到值

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/488428.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号