redis管道

发布时间 2023-10-18 19:16:19作者: Maverick-Lucky

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中(用的比较多)