redis基于内存的数据库。
MySQL的数据是存在磁盘中的,磁盘读取速度是没有内存读取快的,为了提升性能就会把一些数据存在内存中。
比如微博,就有很多缓存的服务器,相比于直接读内存,性能会有很大提升。
首先安装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看一下,可以取到值



