redis超详细篇4 redis事务(乐观锁、悲观锁)

开篇

前几篇我们带大家入了个门,今天这篇来讲下redis的事务,我们以前学过关系型数据库,知道事务的重要性,其实redis的事务和关系型数据库的事务还是有点差别的。
下面细细讲来

redis事务

概念:

redis事务时一个单独的隔离操作,事务中的所有命令都会序列化,按顺序执行,事务在执行过程中不会被其他的客户端送来的命令请求所打断。

作用

串联多个命令防止别的命令插队

流程

执行事务的时候有三个比较重要的命令 multi、exec、discard

multi 言简意赅就是告诉大家,我要开始执行事务了,在写入该命令后,可以设置key-value等操作

exec 言简意赅就是:我要执行你写的相关东西了。

discard: 是在exec前使用的,就是说:我写的东西不想要了,或者写错了,我要销毁.

用一句话来概括整个流程:
从输入multi 命令开始,输入的命令都会一次进入命令的队列中,但不会执行;直到输入exec后,redis才会将之前的命令队列中的命令依次执行

我们来看下multi和exec的使用例子:
我们定义company、address值分别为:yamaha、软件园。结果如图
在这里插入图片描述
我们来看下discard使用
我们定义了work、age的key-value,但是我突然不想要了,这时候输入discard,整个定义事务过程就销毁了
在这里插入图片描述

事务的错误处理

我们有思考过这些问题没有:组队中,如果某个命令出现了错误怎么办?

别急这个问题,已经想到了。来看

我们分两种情况

执行前错误

定义:组队时,若某个命令出现了报告错误(就是命令不符合规范,报错了)执行时,整个所有队列都会被取消

什么意思呢:就是你还在组队的时候,有任何一行命令错误,那么这个队列就没组成功,还没到exec那个环节,明白?

看图:
组队命令直接报错了,后面exec执行一定会报错
在这里插入图片描述

执行后错误

定义:就是组队命令没有出现报错,但是exec命令执行的时候出现了报错;则只有报错的命令不会被执行,其他的命令都能正常运行。

什么意思呢? 对的命令就执行,错的就不执行了,不会进行整体数据回滚
这和我们的关系型数据库的事务不一样,特别要注意
在这里插入图片描述
为了解决事务一致性的问题,我们引入了锁的概念

redis锁

redis锁的概念和其他数据库锁的概念都是一样的,主要分两种:悲观锁、乐观锁

悲观锁

顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在修改数据的时候都会上锁,这样别人想要拿到这个数据就会block,直到它拿到锁,传统的关系型数据里面就用到了很多这样的锁机制,比如行锁、表锁、读锁,写锁,都在在做操做之前先上锁

这种锁算是真正意义的锁。不过这种方式有个缺点:效率低

乐观锁

顾名思义就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有更新这个数据,可以使用版本号等机制,乐观锁适用于多读的应用类型,这样可以提高吞吐,redis就是使用这种chek - and -set机制实现事务的

最终我们来个总结

总结

redis事务总结可以分为以下三点:

单独的隔离操作

事务中的所有命令都会序列化,按顺序的执行,事务在执行的过程中,不会被其他客户端发送来的命令请求所打断

没有隔离级别的概念

队列中的命令没有提交之前都不会实际被执行,因为事务提交前没有任何指令都不会被实际执行

不保证原子性

事务中如果有一条命令执行失败,其它的命令仍然会被执行,没有回滚


版权声明:本文为luoshao666原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。