Redis数据库的学习笔记
Python-Redis
一、安装模块
在虚拟环境中安装以下几个模块:
pip install redis
#安装redis模块
pip install redis-py-cluster
#支持python连接redis集群
pip install django-redis==4.8.0
#支持django
二、连接Redis
1、连接
1 2
| from redis import Redis red = Redis(host='192.168.134.124',port=8000)
|
1 2 3 4 5 6 7 8 9
| red.set("name","Mr_lee") red.set("age",18)
age = red.get("age") print(age)
red.lpush("hobby","football","basketball") hobby = red.lrange("hobby",0,-1) print(hobby)
|
2、Json序列化存储
读取MySQL数据库中的数据,转存到Redis数据库中
1
| 序列化过程:获取Model数据 -> 序列化为json字符串 -> set存储到redis数据库
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import json from redis import Redis from datetime import datetime
red = Redis(host='192.168.134.124',port=8000)
def mydefault(u): if isinstance(u,User): return {"name":u.name,'age':u.age,'salary':u.salary,'birthday':u.birthday.strftime('%Y-%m-%d')}
users = list(User.objects.all()) user_dump = json.dumps(users,default=mydefault)
print(user_dump) red.set('userlist',user_dump)
|
3、反序列化
1
| 反序列化过程:获取redis数据库中的数据get -> json字符串 -> 提取字符串中的数据(反序列化) -> Model对象
|
1 2 3 4 5 6
| def parsedefault(dic): return User(name=dic['name'],age=dic['age'],salary=dic['salary'],birthday=dic['birthday'])
res = red.get("userlist") results = json.loads(res.decode("utf-8"),object_hook=parsedefault) print(results)
|
三、Python-Redis集群
1 2 3 4 5 6 7 8 9 10 11 12 13
| from rediscluster import RedisCluster
cluster_nodes = [ {'host': '192.168.134.124', 'port': 7001}, {'host': '192.168.134.124', 'port': 7002}, {'host': '192.168.134.124', 'port': 7003}, {'host': '192.168.134.124', 'port': 7004}, {'host': '192.168.134.124', 'port': 7005}, {'host': '192.168.134.124', 'port': 7006}, ]
cluster = StrictRedisCluster(startup_nodes=cluster_nodes) cluster.set('name','Mr_lee')
|
四、Django-Redis缓存
1、缓存的概念
在实际Web开发中,经常需要在客户端和服务器端进行数据传输:
客户端发送请求,服务器端接收请求,返回数据
而在返回数据之前,我们要对数据库进行查询操作,找到正确的请求内容
如果要查找的数据量比较大,每次请求的耗时将会是一个非常可怕的事情。
这个时候,我们就需要对某些无需实时更新的内容进行缓存处理,把要返回的内容存放在缓存中,收到数据请求后直接把缓存中的数据返回,如果缓存不存在,则查询数据库,并且把内容添加进缓存中,以便下次请求使用。
简单来说:缓存就是把一些查询频繁且改动较少的数据,放入一个内存区域临时存储,进而在一定程度上改善查询的性能。
2、缓存流程
初次查询,依然找到磁盘数据库,然后会将查询结果返回并纳入缓存;
之后的每次相同的查询都可以直接从缓存取数据,则可以达到 “较少与磁盘数据库通信次数” 的目的。
如果缓存失效,则再次回到数据库查询,并存入缓存。重复上述过程
数据存储在Mysql中,查询到数据后,返回给客户端,同时将数据存储入redis数据库中(redis就是内存数据库)
3、Redis缓存配置
3.1 安装django-redis
pip install django-redis
3.2 设置缓存
在Django项目的settings.py中添加如下设置:
1 2 3 4 5 6 7 8 9
| CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://192.168.134.124:8000/3", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient" } } }
|
4、view缓存
实际要缓存的应该是查询到的数据,但是数据最终会通过模板文件html来显示
view缓存是将整个的模板文件加入到缓存中
1 2 3 4
| @cache_page(timeout=10,key_prefix="cacheRedis") def index(request): users = User.objects.all() return render(request,'redis_app/index.html',{"users":users})
|
加在会渲染模板的视图函数上,会将整个模板的渲染结果存入缓存
5、template缓存
在模板中使用缓存,可以充分考虑缓存的颗粒度,细分颗粒度,可以保存只缓存部分HTML片段,而不是整个模板文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <!DOCTYPE html> {% load cache %} <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% cache 100 cache_1 %}
{% for u in users %} {{ u.name }} {% endfor %}
{% endcache %}
</body> </html>
|
6、缓存删除
当数据库的数据发生改动时,需要删除缓存
1 2 3 4 5 6 7 8 9 10 11 12
| from django.core.cache import cache --------------------------------------------------------------------- keys = cache.keys("*abc*")
for key in keys: cache.delete(key) ----------------------------------------------------------------------- cache.delete_many(keys) --------------------------------------------------------------- cache.delete_pattern("*abc*") --------------------------------------------------------------- cache.clear()
|
7、Session存储
将session存入缓存,可以提高session数据的交互效率
1 2
| SESSION_ENGINE='django.contrib.sessions.backends.cache'
|