iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Redis中事务是什么
  • 789
分享到

Redis中事务是什么

2024-04-02 19:04:59 789人浏览 独家记忆
摘要

这篇文章主要介绍Redis中事务是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!相关命令命令格式作用返回结果WATCHWATCH key [key ...]将给出的Keys标记为

这篇文章主要介绍Redis事务是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

相关命令

命令格式作用返回结果
WATCHWATCH key [key ...]将给出的Keys标记为监测态,作为事务执行的条件always OK.
UNWATCHUNWATCH清除事务中Keys监测态,如果调用了EXEC or DISCARD,则没有必要再手动调用UNWATCHalways OK.
MULTIMULTI显式开启redis事务,后续commands将排队,等候使用EXEC进行原子执行always OK.
EXECEXEC执行事务中的commands队列,恢复连接状态。如果WATCH在之前被调用,只有监测中的Keys没有被修改,命令才会被执行,否则停止执行(详见下文,CAS机制成功: 返回数组 —— 每个元素对应着原子事务中一个 command的返回结果;
失败: 返回NULLRuby 返回`nil`);
DISCARDDISCARD清除事务中的commands队列,恢复连接状态。如果WATCH在之前被调用,释放 监测中的Keysalways OK.

注意:

------MULTI,EXEC,DISCARD才是显式开启并控制事务的常用命令,可类比关系型数据库中的  BEGaiN,COMMIT,ROLLBACK(事实上,差距很大);

------WATCH命令的使用是为了解决 事务并发 产生的不可重复读幻读的问题(简单理解为给Key加);


Redis事务

MULTI, EXEC, DISCARD and WATCH 是Redis事务的基础。用来显式开启并控制一个事务,它们允许在一个步骤中执行一组命令。并提供两个重要的保证:

  • 事务中的所有命令都会被序列化并按顺序执行。在执行Redis事务的过程中,不会出现由另一个客户端发出的请求。这保证 命令队列 作为一个单独的原子操作被执行。

  • 队列中的命令要么全部被处理,要么全部被忽略。EXEC命令触发事务中所有命令的执行,因此,当客户端在事务上下文中失去与服务器的连接,

  • 如果发生在调用MULTI命令之前,则不执行任何commands

  • 如果在此之前EXEC命令被调用,则所有的commands都被执行。

同时,redis使用AOF(append-only file),使用一个额外的write操作将事务写入磁盘。如果发生宕机,进程奔溃等情况,可以使用redis-check-aof tool 修复append-only file,使服务正常启动,并恢复部分操作。


用法

使用MULTI命令显式开启Redis事务。 该命令总是以OK回应。此时用户可以发出多个命令,Redis不会执行这些命令,而是将它们排队EXEC被调用后,所有的命令都会被执行。而调用DISCARD可以清除事务中的commands队列退出事务

  • 以下示例以原子方式,递增键foo和bar。

>MULTI
OK
>INCR foo
QUEUED
>INCR bar
QUEUED
>EXEC
1)(整数)1
2)(整数)1

从上面的命令执行中可以看出,EXEC返回一个数组其中每个元素都是事务中单个命令的返回结果,而且顺序与命令的发出顺序相同。 当Redis连接处于MULTI请求的上下文中时,所有命令将以字符串QUEUED从Redis协议的角度作为状态回复发送)作为回复,并在命令队列中排队。只有EXEC被调用时,排队的命令才会被执行,此时才会有真正的返回结果


事务中的错误

事务期间,可能会遇到两种命令错误:

  • 在调用EXEC命令之前出现错误(COMMAND排队失败)。

  • 例如,命令可能存在语法错误(参数数量错误,错误的命令名称...);

  • 或者可能存在某些关键条件,如内存不足的情况(如果服务器使用maxmemory指令做了内存限制)。

客户端会在EXEC调用之前检测第一种错误。 通过检查排队命令的状态回复(***注意:这里是指排队状态回复,而不是执行结果***),如果命令使用QUEUED进行响应,则它已正确排队,否则Redis将返回错误。如果排队命令时发生错误,大多数客户端将中止该事务并清除命令队列。然而:

  • Redis 2.6.5之前,这种情况下,在EXEC命令调用后,客户端会执行命令的子集(成功排队的命令)而忽略之前的错误。

  • Redis 2.6.5开始,服务端会记住在累积命令期间发生的错误,当EXEC命令调用时,将拒绝执行事务,并返回这些错误,同时自动清除命令队列

  • 示例如下:

>MULTI
+OK
>INCR a b c
-ERR wrong number of arguments for 'incr' command

这是由于INCR命令的语法错误,将在调用EXEC之前被检测出来,并终止事务(version2.6.5+)。

  • 在调用EXEC命令之后出现错误。

  • 例如,使用错误的值对某个key执行操作(如针对String值调用List操作)

EXEC命令执行之后发生的错误并不会被特殊对待即使事务中的某些命令执行失败,其他命令仍会被正常执行

  • 示例如下:

>MULTI
+OK
>SET a 3
+QUEUED
>LPOP a
+QUEUED
>EXEC
*2
+OK
-ERR Operation against a key holding the wrong kind of value
  • EXEC返回一个包含两个元素的字符串数组,一个元素是OK,另一个是-ERR……

  • 能否将错误合理的反馈给用户这取决于客户端library(如:spring-data-redis.redisTemplate)的自身实现。

  • 需要注意的是,即使命令失败,队列中的所有其他命令也会被处理----Redis不会停止命令的处理


Redis事务不支持Rollback(重点

事实上Redis命令在事务执行时可能会失败,但仍会继续执行剩余命令而不是Rollback(事务回滚)。如果你使用过关系数据库,这种情况可能会让你感到很奇怪。然而针对这种情况具备很好的解释:

  • Redis命令可能会执行失败,仅仅是由于错误的语法被调用(命令排队时检测不出来的错误),或者使用错误的数据类型操作某个Key: 这意味着,实际上失败的命令都是编程错误造成的,都是开发中能够被检测出来的,生产环境中不应该存在。(这番话,彻底甩锅,“都是你们自己编程错误,与我们无关”。)

  • 由于不必支持Rollback,Redis内部简洁并且更加高效。

如果错误就是发生了呢?”这是一个反对Redis观点的争论。然而应该指出的是,通常情况下,回滚并不能挽救编程错误。鉴于没有人能够挽救程序员的错误,并且Redis命令失败所需的错误类型不太可能进入生产环境,所以我们选择了不支持错误回滚(Rollback)这种更简单快捷的方法。


清除命令队列

DISCARD被用来中止事务。事务中的所有命令将不会被执行,连接将恢复正常状态。

> SET foo 1
OK
> MULTI
OK
> INCR foo
QUEUED
> DISCARD
OK
> GET foo
"1"

以上是“Redis中事务是什么”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: Redis中事务是什么

本文链接: https://www.lsjlt.com/news/55500.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis中事务是什么
    这篇文章主要介绍Redis中事务是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!相关命令命令格式作用返回结果WATCHWATCH key [key ...]将给出的Keys标记为...
    99+
    2024-04-02
  • Redis事务机制是什么
    这篇文章主要介绍了Redis事务机制是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。了解Redis事务机制吗?redis 通过MULTI...
    99+
    2024-04-02
  • Redis事务和pipleline是什么
    小编给大家分享一下Redis事务和pipleline是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!1、reidis事务Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:...
    99+
    2024-04-02
  • Redis事务指的是什么意思
    Redis事务是一组命令的集合,这些命令可以单独的操作来执行。在Redis中,事务是一种原子操作,要么所有命令都执行成功,要么所有命...
    99+
    2024-03-11
    Redis
  • redis实现事务的原理是什么
    这篇文章主要介绍redis实现事务的原理是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!原子性(atomicity):一个事务是一个不可分割的最小工作单位,要么都成功要么都失败。...
    99+
    2024-04-02
  • Redis处理事务的方法是什么
    Redis处理事务的方法是使用MULTI、EXEC、DISCARD和WATCH命令来实现事务处理。具体步骤如下: 使用MULTI命...
    99+
    2024-04-09
    Redis
  • redis事务有什么用
    这篇文章主要介绍了redis事务有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。是什么可以一次执行多个命令,本质是一组命令的集合。一个...
    99+
    2024-04-02
  • Jedis使用Redis事务的方法是什么
    本篇内容主要讲解“Jedis使用Redis事务的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Jedis使用Redis事务的方法是什么”吧!什么是Jedis什么是Jedis 是Redi...
    99+
    2023-07-05
  • oracle中事务是什么
    事务是 oracle 数据库中一组不可分割的逻辑操作,要么全部成功,要么全部失败。其特性包括原子性、一致性、隔离性和持久性。事务由数据操作语句、事务控制语句和数据结构组成,其生命周期包括...
    99+
    2024-05-07
    oracle
  • MySQL中事务是什么
    这篇文章给大家分享的是有关MySQL中事务是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. 在MySQL环境中,事务由作为一个单独单元的一个或多个SQL语句组成。这个单元...
    99+
    2024-04-02
  • PostgreSQL中什么是事务
    这篇文章主要介绍PostgreSQL中什么是事务,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!  一、什么是事务  事务可以看作是一个操作的有序集,这些操作应作为整体来对待,即集内所...
    99+
    2024-04-02
  • redis文件事件和时间事件是什么
    今天小编给大家分享一下redis文件事件和时间事件是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2024-04-02
  • Redis中事件驱动模型的作用是什么
    这篇文章给大家介绍Redis中事件驱动模型的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言Redis 是一个事件驱动的内存数据库,服务器需要处理两种类型的事件。文件事件时...
    99+
    2024-04-02
  • 什么是事务在SQLServer中
    事务是数据库操作的最小单位,它是由一系列数据库操作组成的逻辑工作单元。在SQL Server中,事务确保数据库操作的一致性、完整性和...
    99+
    2024-04-09
    SQLServer
  • Redis的事件驱动模型是什么
    这篇文章主要讲解了“Redis的事件驱动模型是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis的事件驱动模型是什么”吧!为什么 Redis 不使用基本的 Socket 编程模型?...
    99+
    2023-06-30
  • Redis事务模式和Lua脚本的原理是什么
    这篇文章主要介绍了Redis事务模式和Lua脚本的原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis事务模式和Lua脚本的原理是什么文章都会有所收获,下面我们一...
    99+
    2023-04-19
    redis lua
  • php中事务指的是什么
    这篇文章主要介绍“php中事务指的是什么”,在日常操作中,相信很多人在php中事务指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中事务指的是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-29
  • MySQL中什么是事务与锁
    这篇文章给大家介绍MySQL中什么是事务与锁,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  MySQL 中事务的实现  在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的...
    99+
    2024-04-02
  • MySQL中事务是什么意思
    小编给大家分享一下MySQL中事务是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、事务的概念  ...
    99+
    2024-04-02
  • Redis中的Pipeline是什么
    Redis中的Pipeline是一种命令批处理技术,可以在客户端一次性发送多个命令给Redis服务器,并在收到响应后将结果一次性返回...
    99+
    2024-04-09
    Redis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作