首页 > 数据库 >Redis 的事务

Redis 的事务

时间:2023-06-05 23:44:38浏览次数:56  
标签:事务 exec Redis watch 命令 执行

1. Redis 的事务

一般来说,常见的关于 MySQL 的 事务 的定义,无非是把一组数据库命令放在一起执行,保证操作原子性,要么同时成功,要么同时失败。

但是 Redis 的事务跟 MySQL 的事务有一点点区别,Redis 的事务允许把一组 redis 命令放在一起,把命令进行序列化,然后一起执行,但是 Redis 只保证部分原子性,Redis 的事务不能回滚,这就是它跟 MySQL 事务的差异。

Redis 事务执行的基本步骤:

  1. 使用 multi 开启事务
  2. 将要执行的一系列命令放入队列中
  3. 使用 exec 执行事务

Redis 的事务只能保证部分的原子性,且不支持回滚:

  • 如果在把命令压入队列的过程中报错,则整个队列中的命令都不会执行,执行结果报错;
  • 如果在压队列的过程中正常,在执行队列中某一个命令报错,则只会影响本条命令的执行结果,其它命令正常运行;不会像 MySQL 一样,只要有一个命令不成功,那其他已经执行的命令都得回滚。

2. Redis事务的常用命令

2.1. multi

语法:

  • multi

功能:

  • 用于标记事务块的开始。Redis 会将后续的命令逐个放入队列中,然后才能使用 EXEC 命令原子化地执行这个命令序列。

返回值:

  • 如果开启成功,则返回 OK。

image

2.2. exec

语法:

  • exec

功能:

  • 用来执行事务队列中所有的命令,然后恢复正常的连接状态。
  • 当使用 watch 命令时,只有当受监控的键没有被修改时,exec 命令才会执行事务中的命令;而一旦执行了 exec 命令,之前加的所有 watch 监控全部取消。

返回值:

  • 这个命令的返回值是一个数组,其中的每个元素分别是原子化事务中的每个命令的返回值。
  • 当使用 watch 命令时,如果事务执行中止,那么 exec 命令就会返回一个 Null 值。

image

2.3. discard

语法:

  • discard

功能:

  • 清除所有已经压入队列中的命令,并且结束整个事务。
  • 如果使用了 watch 命令,那么 discard 命令就会将当前连接监控的所有键取消监控。

返回值:

  • 清除成功,返回OK。

image

2.4. watch

语法:

  • watch key [key …]

功能:

  • 监控某一个键,当事务在执行过程中,此键代码的值发生变化,则本事务放弃执行;否则,正常执行。
  • watch 命令相当于关系型数据库中的乐观锁。

返回值:

  • 监控成功,返回 OK。

开启两个 redis-cli 客户端来验证:
image
image

2.5. unwatch

语法:

  • unwatch

功能:

  • 放弃监控所有的键
  • 如果在 watch 命令之后你调用了 exec 或 discard 命令,那么就不需要手动调用 unwatch 命令。

返回值:

  • 清除成功,返回 OK。

image

3. Redis 事务小结

  1. 单独的隔离操作
    事务中的所有命令都会序列化、顺序地执行。事务在执行过程中,不会被其它客户端发来的命令请求所打断,除非使用 watch 命令监控某些键。
  2. 不保证事务的原子性
    redis 同一个事务中如果一条命令执行失败,其后的命令仍然可能会被执行,redis 的事务没有回滚。Redis 已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为 Redis 不需要事务回滚的能力。

4. Redis 中文文档

https://redis.com.cn/topics/transactions.html

标签:事务,exec,Redis,watch,命令,执行
From: https://www.cnblogs.com/wanghuizhao/p/17459318.html

相关文章

  • 手把手教你AspNetCore WebApi:缓存(MemoryCache和Redis)
    前言这几天小明又有烦恼了,系统上线一段时间后,系统性能出现了问题,马老板很生气,叫小明一定要解决这个问题。性能问题一般用什么来解决呢?小明第一时间想到了缓存。什么是缓存缓存是实际工作中非常常用的一种提高性能的方法。缓存可以减少生成内容所需的工作,从而显著提高应用程序的性能......
  • GaussDB数据库事务介绍
    前言随着大数据和互联网技术的不断发展,数据库管理系统的作用越来越重要,实现数据的快速读写以及保证数据的安全性和完整性成为企业在选择数据库技术时最为关注的问题之一。事务是保证数据一致性和完整性的关键机制之一,因此事务管理在数据库技术中占据了极为重要的位置。在这里我们将......
  • 2023-06-05:Redis官方为什么不提供 Windows版本?
    2023-06-05:Redis官方为什么不提供Windows版本?答案2023-06-05:Redis官方没有提供Windows版本有几个原因。1.Redis的开发团队规模较小,由三四名核心开发者组成。他们更加熟悉和习惯Unix-like系统,在这些系统上进行开发和测试可以更高效地进行。然而,提供Windows版本会消耗较多资源,可......
  • 2023-06-05:Redis官方为什么不提供 Windows版本?
    2023-06-05:Redis官方为什么不提供Windows版本?答案2023-06-05:Redis官方没有提供Windows版本有几个原因。1.Redis的开发团队规模较小,由三四名核心开发者组成。他们更加熟悉和习惯Unix-like系统,在这些系统上进行开发和测试可以更高效地进行。然而,提供Windows版本会消耗较多资源,可能会......
  • Redis(四) -- 缓存
    缓存缓存更新方式这是决定在使用缓存时就该考虑的问题。设置缓存数据的TTL,当缓存数据失效后,如果有系统要请求,则会查询数据库并插入缓存(被动更新)不友好在各类会往mysql写入数据的系统中,植入更新缓存的逻辑(判断哪些表的数据是热点数据,那么就可以在这些表数据的更新操作逻辑中......
  • springboot中使用cache和redis
    知识点:springboot中使用cache和redis (1)springboot中,整合了cache,我们只需要,在入口类上加 @EnableCaching 即可开启缓存 例如:在service层使用@Cacheable和CacheEvict //添加缓存@Cacheable(cacheNames="TestCACHE",key="#root.methodName+'_'+#id")publicMap<String,......
  • Mysql:事务
    事务特性事务的特性:acid。原子性(重要)事务内的一组操作为原子操作,要么全部成功,要么全部失败。在实际业务如转账,就必须保证一方数目多了一方少了,数目平衡。一致性(面试常问)事务成功或失败的结果必须符合业务逻辑。还是以转账为例,A转给B100块,成功就A少100,B多100,失败就双方金额该......
  • NineData,稳定、高效的Redis数据同步解决方案
    在DB-Engines网站的排名中,Redis在Key-value存储的NoSQL领域连续霸榜多年,是目前最流行的键值对存储数据库,被广泛用于缓存、队列、实时分析等多种高并发的场景中。在生产环境中,我们会遇到对Redis进行版本升级和架构的扩缩容的操作,这些操作都会涉及到Redis数据同步操作,所以,一个......
  • Redis系列14:使用List实现消息队列
    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster集群模式追求性能极致:Redis6.0的多线程模型追求性能极致:客户端缓存带来的革命Redis系列8:Bitmap实现亿万级......
  • redis迁移同步工具-redis-shake
    官方文档:https://github.com/alibaba/RedisShake/wiki/%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%EF%BC%9A%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB下载:https://github.com/alibaba/RedisShake/releasesredis-shake.toml单机到单机配置,源6383目标端6384启动,增量同步./r......