文章目录
第一节:图形客户端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支持事务的方式
将批量数据操作逐个加入待执行队列;
如果批量操作过程中发生异常,不提交事务即可;
提交事务=执行队列中的所有操作,并保证其原子性;
【注意事项】
数据操作在加入队列时不会进行语法检查;即如果数据操作存在语法错误,会造成只有部分数据提交的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)