第七章:redis(后篇)

第一节:图形客户端RedisDesktopManager

redis也有自己的图形用户界面RedisDesktopManager,而且操作也非常简单,自行动手每个按钮操作一下便可熟悉。以下简单以图片形式作为介绍,RedisDesktopManager下载可点击此处:

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

第二节:python与redis的交互

和其他数据库的交互一样,对redis的操作不能是手动的,应该给用户动态地进行增、删、改、查。这时需要编程语言,使用代码对数据库进行操作,这便需要python与redis进行交互
Python与Redis的交互可以通过第三方类库redis来进行

# 安装第三方库redis
pip3 install redis
  • 交互的一般流程
    1、创建Redis客户端(创建即可,内存没有涉及磁盘IO,没有连接不连接的概念)
    2、通过客户端的API完成数据交互;

【tips】交互结束也无需断开连接,这一点与磁盘型数据库不同,毕竟访问内存是无所谓“释放IO资源”一说的;redis的PythonAPI和redis的shell操作命令是极为相似的;获取到的数据内容都是字节

例:

import redis


# 创建客户端,使用父类redis.StrictRedis也可以
Client = redis.Redis(
    host='localhost',
    port=6379,
    db=0,
    password='xxxxx'
)

# 字符串操作
Client.set('ChineseName',"老顽童")
Client.mset({"string1":21,"string2":"something"})
print(Client.get('ChineseName'))
print(Client.mget("string1","string2"))

# 哈希操作
Client.hmset("p3",{"name":"dongFangBuBai","age":33,"words":"Without sex, Training level is much easier"})
print(Client.hmget("p3","name","age","words"))
print(Client.hgetall("p"))

# 列表操作
print(Client.lrange("mlist",0,-1))

# 集合操作
print(Client.scard("mset"))
print((Client.smembers("mset")))

print("操作结束!")

执行结果:
在这里插入图片描述

第三节:redis的事务

事务的注意事项与流程

  • redis支持事务的方式
    将批量数据操作逐个加入待执行队列;
    如果批量操作过程中发生异常,不提交事务即可;
    提交事务=执行队列中的所有操作,并保证其原子性;

更多与redis事务相关的文档参考可点击此处:

【注意事项】
数据操作在加入队列时不会进行语法检查;即如果数据操作存在语法错误,会造成只有部分数据提交的BUG,正确的都会被执行,不会发生回滚。因为redis并不支持事务回滚(处处拍摄快照会导致效率的下降);
所以语法错误必须在上线前自行完成检查和修正(这是Redis的官方态度);

  • 事务操作流程
    1、可使用watch监控要保障【并发安全】的数据;
    2、开启事务;
    3、具体CRUD操作;
    4、提交事务(如果使用了watch,那么被监控的数据一旦发生了并发修改,则提交不成功);

在Redis命令行执行事务

# 观察本次事务相关的key,如果key在事务执行过程中被第三方修改,则事务提交不能成功 
#目的:保证并发安全 
WATCH key1 key2 key3 

# 开启事务 
multi 

# 执行具体事务操作(增删改查),这些操作会被加入队列 
incr key1 
incr key2 
incr key3 

# 提交事务,如果观察的key被其它事务并发修改,则本次事务提交无效
# 不提交事务可用 discard
exec

例:简单地提交事务操作
在这里插入图片描述

在python代码中执行事务

例:排除几个异常的事务执行代码

import redis
from redis import WatchError


# 创建客户端,使用父类redis.StrictRedis也可以
Client = redis.Redis(
    host='localhost',
    port=6379,
    db=0,
    password='xxxxxx'
)

# 创建事务管道
pipe = Client.pipeline(transaction=True)

try:
    # 使用watch监听要操作的键,保证数据并发安全的问题
    pipe.watch('who', 'a', 'b', 'c')
    # 使用管道开启事务
    pipe.multi()

    # 使用管道执行CRUD操作
    pipe.writeDict('who', '雷军', ex=60 * 5)
    print(pipe.get('who'))
    pipe.hmset('p1', {'who': '雷军', 'age': 50, 'word': 'are you ok'})
    print(pipe.hgetall('p1'))

    #假设性的中间出错
    # print(5 / 0)  # 普通业务异常,被try所捕获,事务不会提交
    # pipe.incr("p1")  # redis语法错误,只有提交时才会发生异常且无法回滚,必须在上线前予以修正

    # 执行CRUD操作
    pipe.incr('a')
    pipe.incr('b')
    pipe.incr('c')

# 如果被监视的数据被第三方修改
except WatchError as we:
    # 清空事务管道,不提交,结束事务
    pipe.reset()
    print('监控数据被外界修改,事务已取消!we=',we)

# 如果发生其他普通异常
except Exception as e:
    print("语方错误:e=", e)
    print('事务未提交')

# 没有发生异常时提交事务
else:
    try:
        pipe.execute()
        print('事务已提交')
    # 如果队列中的数据操作有语法错误,则事务的提交会【完成一半且无法回滚】,必须杜绝语法错误
    except Exception as e:
        print('事务提交异常,请检查代码语法!e=',e)

猜你喜欢

转载自blog.csdn.net/xiangchi7/article/details/85330472