首页 > 数据库 >redis管道

redis管道

时间:2023-10-18 19:25:07浏览次数:40  
标签:缓存 money cache redis django 管道 conn

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

相关文章

  • redis其它操作,
    1redis其它操作......
  • redis
    redis介绍和安装redis什么-数据库就是个存数据的地方:只是不同数据库数据组织,存放形式不一样-mysql关系型数据库(oracle,sqlserver,postgrasql)-非关系型数据(nosql):redis,mongodb,clickhouse,infludb,elasticsearch,hadoop。。。-没有sql:没有sql语句-no......
  • Redisson 实现分布式锁
    Redisson实现分布式锁分布式锁的应用场景有哪些?实现的方式有哪几种?Redisson又是怎么实现的?1、应用场景、特点及实现方式1.1、分布式锁的应用场景主要有以下两类:提升处理效率:避免重复任务的执行,减少系统资源的浪费(例如幂等场景)。保障数据一致性:在多个微服务并发访问时,避免......
  • redis普通连接和连接池, redis字符串类型,redis hash类型, redis列表类型
    1redis普通连接和连接池......
  • 注册功能, 前端登录注册页面,前端登录功能,前端注册功能, redis介绍和安装
    1注册功能......
  • Redission并发锁报错:IllegalMonitorStateException: attempt to unlock lock, not loc
    生产上突然出现一条报错j.l.IllegalMonitorStateException:attempttounlocklock,notlockedbycurrentthreadbynodeid:1411e030-3c44-48d7-9eb6-6030022ce681thread-id:111ato.r.RedissonBaseLock.lambda$unlockAsync$2(RedissonBaseLock.java:323)......
  • Redis中的缓存雪崩、缓存击穿、缓存穿透问题
    1.什么是缓存雪崩当我们提到缓存系统中的问题,缓存雪崩是一个经常被讨论的话题。缓存雪崩是指在某一时刻发生大量的缓存失效,导致瞬间大量的请求直接打到了数据库,可能会导致数据库瞬间压力过大甚至宕机。尤其在高并发的系统中,这种情况会导致连锁反应,整个系统可能会崩溃。1.1缓存......
  • linux yum 安装redis
    安装启动redis并设置开机自动启动yuminstall-yepel-release&&sleep3&&yuminstall-yredis&&systemctlenable--nowredis查看redis服务器状态systemctlenableredis 开放防火墙端口号(若已关闭防火墙请略过)firewall-cmd--zone=public--add-port=80/t......
  • Redis的Java客户端
    Jedis以Redis命令作为方法名称,学习成本低,简单实用。但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用lettuce(Spring默认使用)Lettuce是基于Netty实现的,支持同步、异步和响应式编程方式,并且是线程安全的。支持Redis的哨兵模式、集群模式和管道模式。RedissionRedisso......
  • redis7.2.1在windows中通过docker使用的踩坑
    原本主要是参考了这两篇文章https://blog.csdn.net/weixin_45821811/article/details/116211724https://cloud.tencent.com/developer/article/1670205但是由于都是基于linux系统下的,可能与windows有些不同。首先,在https://hub.docker.com/_/redis?tab=tagsdocker官网上找到......