redis管道
1. 事务四大特性:
- 原子性:要么都成功,要么都失败
- 一致性:数据前后要一致
- 隔离性:多个事务之间互不影响
- 持久性:事务一旦完成,数据永久改变
2. 关系型数据库,支持事务
3. redis有没有事务?
没有专门的事情,但是通过标的方式可以实现事务的几个特性,所以我们认为它具备事务
- redis要支持事务,要完成事务的几大特性,需要使用管道来支持
- 单实例redis是支持管道的
- 集群模式下,不支持管道,不支持事务
redis通过管道实现事务
当没有通过管道实现事务时:
# 没有管道的情况,一旦失败,之前执行的不会回退 import redis conn=redis.Redis() # 1.先设置两个key # my_money:我的钱初始为100,hh_money:初始也为100 conn.set('my_money',100) conn.set('hh_money',100) # 2. 从my_money 中转10块给 hh_money conn.decrby('my_money',10) # # 我的钱扣了,写了点别的逻辑--》有可能抛异常 l=[1,2,3] print(l[4]) # hh_money增加10块 conn.incrby('hh_money',10) conn.close()
my_money初始值:
hh_money初始值:
结果:
当中间出现异常:
2. 通过管道实现事务
# 通过管道实现 import redis conn = redis.Redis() pipline = conn.pipeline(transaction=True) # 创建了一个管道,把命令都一个个放到管道中,先不执行,当执行execute,才执行管道中所有的命令 pipline.decrby('my_money', 10) # my_money 中扣了10 ,写点别的逻辑--》有可能抛异常 l = [1, 2, 3] # print(l[4]) # 出现异常时,my_money扣的值,会回退回去,符合事务的原子性,一致性 print(l[1]) pipline.incrby('hh_money', 10) pipline.execute() conn.close()
结果:
my_money:
hh_money:
2. Django中使用redis
2.1 通用方案
1. 先写一个连接池:
import redis conn= redis.ConnectionPool(max_connections=20) # 最大连接数:20
2. 在想用的地方导入使用:
# 测试连接redis # 先导入 from utils.pool import POOL import redis def redis_demo(request): conn = redis.Redis(connection_pool=POOL,decode_responses=True) res=conn.incrby('count') print(res) return HttpResponse(f'您是我们第:{res}个用户')
路由:
结果:
2.2 第三方模块
1. 先安装:pip install django-redis
如图 :
2. 配置文件配置
#### 使用django-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": "123", } }, }
如图:
3. 在使用的位置,导入使用
# 使用第三方模块 from django_redis import get_redis_connection def redis_demo(request): conn = get_redis_connection() res = conn.incrby('count') print(res) return HttpResponse(f'您是我们第:{res}个用户')
如图:
路由:
结果:
Django缓存
1. redis数据存在内存中,取放速度快 -----> 非常适合做缓存
本来数据在mysql中,每次都查询,速度慢 ---> 把查询出来的数据,暂时存储到redis(缓存),下次请求再来,直接从redis中拿,速度就会很快
2. Django中如何使用缓存
- 配置文件配置(缓存位置:内存,文件中,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": "123", }
- 把数据放到缓存中(放到redis中):
from django.core.cache import cache cache.set(key,value可以是任意类型,过期时间) # -redis只支持5大数据类型,可以放python的任意类型 # -本质:pickle序列化---》bytes格式---》以redis字符串的形式放在了redis中 cache.get(key)
3. 后期咱们在项目中,使用redis作为django的缓存多一些,尽量不使用原生redis操作
4. 前后端分离中,使用cache.set 、cache.get
简单测试:
# 前后端分离:使用cache.get、cache.set from django.core.cache import cache def cache_set(request): cache.set('count', {'name': 'hy', 'age': 19}) return HttpResponse('成功') def cache_get(request): print(cache.get('count')) # dict :{'name': 'hy', 'age': 19} print(cache.get('count')['name']) # name: hy return HttpResponse('成功')
结果:cache.set
byte格式,以redi字符串的形式放在了redis中
结果:cache.get
5. 前后端混合中:
可以整站缓存
可以缓存一个页面
可以缓存页面中的某个位置
6. 可以缓存的位置:
内存中
本地文件中
数据库中
redis中(用的比较多)
标签:缓存,money,cache,redis,django,管道,conn From: https://www.cnblogs.com/Lucky-Hua/p/17773121.html