redis支持事务吗(redis 事务 lua)
本篇文章给大家谈谈redis支持事务吗,以及redis 事务 lua对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、golang redis事务 --- 2022-04-03
- 2、spring事务能回滚redis吗
- 3、redis┃面试官问我redis事务和mysql事务的区别,我
- 4、discuz用redis好吗
golang redis事务 --- 2022-04-03
redis事务可以一次执行多个命令, 并且带有以下两个重要的保证:
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命谨郑态令要么全部被执行,要么全部都不执行。
下面介绍golang redis事务用法。
go redis事务常用函数:
TxPipeline - 以Pipeline的方式操作丛谈事务
Watch - redis乐观祥源锁支持
1.TxPipeline
以Pipeline的方式操作事务
2.watch
redis乐观锁支持,可以通过watch监听一些Key, 如果这些key的值没有被其他人改变的话,才可以提交事务。
spring事务能回滚redis吗
答案是肯定的,Spring事务可以梁岁回滚Redis。Spring事务框架可以支持多种数据库,包括Redis。它可以提供一致性的事务处理,保证在事州渣哗务操作期间,数册行据的完整性和一致性。如果事务失败,Spring事务可以回滚Redis的操作,从而保证数据的完整性。
redis┃面试官问我redis事务和mysql事务的区别,我
1、前言
面试官:我看你简历上写了熟悉redis,看来工作中用的很多吧?
我:是的,我们项目中经常用到redis(来,随便问,看我分分钟秒杀你)
面试官:那你给我说说redis的事务和mysql的事务有什么区别吧
我:额。。。事务还有区别????
面试官:比如说redis的事务是不支持原子性和持久性的,包括他们的实现原理等方面也是有很大区别的。
我:学到了。。。。。。
2、正文
事务的四大特性
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
说的是一个事物内所有操作就是最小的一个操作单元,要么全部成功,要么全部失败。这是最基本的特性,保证了因为一些其他因素导致数据库异常,或者宕机。
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
一致性有下面特点:
在现实中,事务系统遭遇并发请求时,这种串行化是有成本的, Amdahl法则描述如下:它是描述序列串行执行和并发之间的关系。
“一个程序在并行计算情况下使用多个处理器所能提升的速度是由这个程序中串行执行部分的时间决定的。”
大多数数据库管理系统选择(默认情况下)是放宽一致性,以达到更好的并发性。
事物的隔离性,基于原子性和一致性,因为事物是原子化,量子化的,所以,事物可以有多个原子包的形式并发执行,但是,每个事物互不干扰。
但是,由于升余多个事物可能操作同一个资源,不同的事物为了保证隔离性,会有很多锁方案,当然这是数据库的实现,他们怎么实现的,我们不必深究。
持久性,当一个事物提交之后,数据库状态永远的发生了改变,即这个事物只要提交了,哪怕提交后宕机,他也确确实实的提交了,不会出现因为刚刚宕机了而让提交不生效,是要事物提交,他就像洗不掉的纹身,永远的固化了,除非你毁了硬盘。
事务命令
mysql:
Begin:显式的开启一个事务
Commit:提交事务,将对数据库进行的所有的修改变成永久性
Rollback:结束用户的事务,并撤销现在正在进行的未提交的修改
redis:
Multi:标记事务的开始
Exec:执行事务的commands队列
Discard:结束事务,并清除commands队列
默认状态
mysql:
mysql会默认开启一个事务,且缺省设置是自动提交,即每成功执行sql,一个事务就会马上commit,所以不能rollback,
redis:
redis默认不会开启事务,即command会立即执行,而不会排队,并不支吵神滚持rollback
使用方式
mysql(包含两种方式):
用Begin、Rollback、commit显式开启并控制一个 新的 Transaction
执行命令 set autocommit=0,用来禁止当前会话自动commit,瞎野控制 默认开启的事务
redis:
用multi、exec、discard,显式开启并控制一个Transaction。
(注意:这里没有强调 “新的” ,因为默认是不会开启事务的)。
实现原理
mysql:
mysql实现事务,是基于undo/redo日志
undo记录修改前状态,rollback基于undo日志实现
redo记录修改后的状态,commit基于redo日志实现
既然是基于redo日志实现记录修改后的状态,那么大家应该也知道,redo日志是innodb专有的,所以innodb会支持事务
在mysql中无论是否开启事务,sql都会被立即执行并返回执行结果,只是事务开启后执行后的状态只是记录在redo日志,执行commit之后,数据才会被写入磁盘
(以上内容后面我会详细在mysql篇给大家讲到,大家可以先简单了解下)
所以,上述代码,insertSelective 将会被立即赋值(无论是否开启事务,只是结果或未被写入磁盘):
redis:
redis实现事务,是基于commands队列
如果没有开启事务,command将会被立即执行并返回执行结果,并且直接写入磁盘
如果事务开启,command不会被立即执行,而是排入队列,并返回排队状态(具体依赖于客户端(例如:spring-data-redis)自身实现)。
调用exec才会执行commands队列
以上代码如果没有开启事务,操作被立即执行,a将会被立即赋值(true/false)
如果开启事务,操作不会被立即执行,将会返回null值,而a的类型是boolean,所以将会抛出异常:
Redis事务不支持Rollback(重点)
事实上Redis命令在事务执行时可能会失败,但仍会继续执行剩余命令而不是Rollback(事务回滚)。如果你使用过关系数据库,这种情况可能会让你感到很奇怪。然而针对这种情况具备很好的解释:
redis 事务中的错误
事务期间,可能会遇到两种命令错误:
客户端会在EXEC调用之前检测第一种错误。 通过检查排队命令的状态回复(***注意:这里是指排队的状态回复,而不是执行结果***),如果命令使用QUEUED进行响应,则它已正确排队,否则Redis将返回错误。如果排队命令时发生错误,大多数客户端将中止该事务并清除命令队列。然而:
这是由于INCR命令的语法错误,将在调用EXEC之前被检测出来,并终止事务(version2.6.5+)。
EXEC命令执行之后发生的错误并不会被特殊对待:即使事务中的某些命令执行失败,其他命令仍会被正常执行。
[img]discuz用redis好吗
discuz用redis好的。
用redis好处:数据存储在内存中,睁樱读写速度快。支持的数盯慎据类型资源丰富。支持事务,操作都是原子性操作。可以设置数据存活的生命周期,因此discuz用redis好的。
Redis是由意大利人SalvatoreSanfilippo,开发的一款内存高速缓悉则丛存数据库。
关于redis支持事务吗和redis 事务 lua的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。