Redis-事物&事物的四大特性(ACID)

2023-05-16

Redis事物

事物是指一系列操作步骤,这一系列操作步骤,要么完全执行,要么完全不执行
Redis中的事物(transaction)是一组命令的集合,至少是两个或两个以上的命令,
redis事物保证这些命令被执行时间时中间不会被任何其他操作打断

  • Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
  1. 批量操作在发送 EXEC 命令前被放入队列缓存。
  2. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  3. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
  • 一个事务从开始到执行会经历以下三个阶段:
  1. 开始事务。
  2. 命令入队。
  3. 执行事务。

   

Redis事物相关命令

  • DISCARD
    取消事务,放弃执行事务块内的所有命令。
  • EXEC
    执行所有事务块内的命令。
  • MULTI
    标记一个事务块的开始。
  • UNWATCH
    取消 WATCH 命令对所有 key 的监视。
  • WATCH key [key …]
    监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

案例演示

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set logindate 2010-10-10
QUEUED
127.0.0.1:6379> incr a b c # 语法错误
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> get logindate
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get logindate
(nil)

# 执行失败,已回滚
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set username zhangsan
QUEUED
127.0.0.1:6379> get username
QUEUED
127.0.0.1:6379> lpop username # lpop是针对list的,但语法没有错误
QUEUED
127.0.0.1:6379> exec
1) OK
2) "zhangsan"
3) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get username
"zhangsan"

# 正确的执行了
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 25
QUEUED
127.0.0.1:6379> set age 30
QUEUED
127.0.0.1:6379> get age
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> get age
(nil)

# 取消事务,放弃执行事务块内的所有命令。
127.0.0.1:6379> set login.count 10
OK
127.0.0.1:6379> watch login.count # 监视 key-login.cout
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set login.count 11
QUEUED
127.0.0.1:6379> exec # 执行事物前key-login.cout被其他客户端打断,事物被打断
(nil)
127.0.0.1:6379> get login.count
"100"


# 另一个客户端在此事物被执行前对login.cout进行设置
bash-4.2$ redis-cli
127.0.0.1:6379> keys *
1) "username"
2) "works"
127.0.0.1:6379> set login.count 100
OK
127.0.0.1:6379> 

     

事物的四大特性:(ACID)

原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

示例:拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis-事物&事物的四大特性(ACID) 的相关文章

  • 如何判断sidekiq是否连接到redis服务器?

    使用控制台 如何判断 sidekiq 是否连接到 Redis 服务器 我希望能够做这样的事情 if sidekiq is connected to redis psuedo code MrWorker perform async do wo
  • 有没有办法在 Redis 和关系数据库中使用带有 @RedisHash 的实体?

    我正在使用Spring引导 为了将我的实体保存在关系数据库上 我配置了一个数据源和我的域类 例如 Entity Table schema schema name name tb name public class table name ex
  • 找不到模块“socket.io/node_modules/redis”

    当尝试做的时候 var redis require socket io node modules redis 我收到错误 找不到模块 socket io node modules redis 我不明白为什么 我正在运行 Windows 并运
  • Redis部署配置-主从复制

    目前我有两台服务器 我已经部署了基于node js Express JS的Web服务API 我正在使用 Redis 来缓存 JSON 字符串 将此设置部署到生产中的最佳选择是什么 我懂了here https stackoverflow co
  • AWS Redis 从外部连接

    有没有办法从外部 AWS 网络连接 AWS 上托管的 Redis 实例 我有一个基于 Windows 的 EC2 实例在 AWS 上运行 另一个是 Redis 缓存节点 我知道有人问过这个问题 但答案是在基于 Linux 的系统中 但我的是
  • 如何在redis中创建自己的数据库?

    There are 0 to 15 databases in redis 我想使用 redis cli 创建自己的数据库 有什么命令可以实现吗 Redis 数据库并不等同于 MySQL 等 DBMS 中的数据库名称 这是一种为键创建隔离和命
  • 使用brew在MacOSx上安装Redis JSON

    如何使用brew 在 macOSx 上安装 RedisJSON 如何在不编译redis的情况下启用redis上的模块 我不想使用 docker 客户端 Redis Stack 可能是最简单的方法 它不仅仅是 RedisJSON 还包括 Re
  • connect-redis - 如何保护会话对象免受竞争条件影响

    我使用 nodejs 和 connect redis 来存储会话数据 我将用户数据保存在会话中 并在会话生命周期中使用它 我注意到两个更改会话数据的请求之间可能存在竞争条件 我尝试过使用 redis lock 来锁定会话 但这对我来说有点问
  • redis集群不断打印日志WSA_IO_PENDING

    当我启动redis集群的所有redis服务器时 所有这些服务器不断打印类似WSA IO PENDING clusterWriteDone的日志 9956 03 Feb 18 17 25 044 WSA IO PENDING writing
  • 如何统计 Redis 流中未读或已确认的消息?

    使用 Redis 5 0 3 假设我们创建一个名为streamy和一个消费群体consumers XGROUP CREATE streamy consumers MKSTREAM 然后向其中添加一些消息 XADD streamy messa
  • Docker-compose Predis 不通过 PHP 连接

    我正在尝试使用 docker compose 将 PHP 与 redis 连接 docker compose yml version 2 services redis image redis 3 2 2 php image company
  • Redis hash写入速度非常慢

    我面临一个非常奇怪的问题 使用 Redis 时 我的写入速度非常糟糕 在理想的情况下 写入速度应该接近 RAM 上的写入速度 这是我的基准 package redisbenchmark import redis clients jedis
  • 如何将 ActionController::Live 与 Resque + Redis 一起使用(用于聊天应用程序)

    我正在尝试为我的 Rails 应用程序构建聊天功能 我在用ActionController Live Puma Resque Redis为了这 所以基本上在这种情况下 redissubscribe方法正在后台运行 使用resque 到目前为
  • redis 阻塞直到 key 存在

    我是 Redis 新手 想知道是否有办法能够await get通过它的键来获取值 直到该键存在 最小代码 async def handler data await self fetch key async def fetch key ret
  • 在 aws-elasticache 上使用 memcached 或 Redis

    我正在 AWS 上开发一个应用程序 并使用 AWS elasticache 进行缓存 我对使用 memcached 或 redis 感到困惑 我阅读了有关 redis 3 0 2 更新以及它现在如何等同于 memchached 的文章 ht
  • 使用Redis从有限范围内生成唯一ID

    我有一些数据库项目 除了主键之外 还需要项目所属组的唯一索引 我们来调用属性nbr 以及将项目分组在一起并定义唯一范围的属性nbr 我们会打电话group This nbr必须在 1 N 范围内 并且may从外部源导入项目时进行设置 由于所
  • 无法启动redis.service:单元redis-server.service被屏蔽

    我在 ubuntu 16 04 上安装了 Redis 服务器 但是当我尝试使用启动redis服务时 sudo systemctl start redis 我收到消息 Failed to start redis service Unit re
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • 有没有办法让特定的key在集群模式下定位到特定的redis实例上?

    我想让我的多锁位于不同的redis实例上 我发现redission可以指定一个实例来执行命令 但是如果该命令与key相关 则指定的实例会将命令传输到另一个实例 你能给我一些建议吗 你可以 但这并不是微不足道的 首先 Redis 在键中使用大
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git

随机推荐

  • Android 引入hunter-debug监测代码运行时函数耗时和参数及返回值,Java(1)

    Android 引入hunter debug监测代码运行时函数耗时和参数及返回值 xff0c Java xff08 1 xff09 xff08 1 xff09 在工程的根build gradle文件里面添加cn quinnchen hunt
  • 阅读笔记-软件工程的大泥球

    软件工程的大泥球 xff08 原文地址 xff1a http www laputan org mud xff09 大泥球的定义 xff1a A BIG BALL OF MUD is a casually even haphazardly s
  • Android 引入hunter-timing监测UI主线程函数运行时耗时,Java(2)

    Android 引入hunter timing监测UI主线程函数运行时耗时 xff0c Java xff08 2 xff09 xff08 1 xff09 在工程的根build gradle文件配置 xff1a buildscript rep
  • 无人驾驶项目——交通标志识别

    在无人驾驶项目中 xff0c 实现交通标志识别是一项重要工作 本文以德国交通标志数据集为训练对象 xff0c 采用深度神经网络LeNet架构处理图像 xff0c 实现交通标志识别 具体处理过程包括包括 xff1a 数据导入 探索和可视化数据
  • SO_RCVBUFFORCE

    mytcp sockets allocated是到目前为止 xff0c 整个tcp协议中创建的socket的个数 xff0c 由mytcp prot的成员 sockets allocated指向 可以在 proc net sockstat文
  • n个球放k个盒子问题归纳

    问题描述 xff1a 有n个球 xff0c 放进k个盒子 xff0c 有多少种不同的放法 xff1f xff08 球必须全部放在盒子中 xff0c 不能丢弃 xff09 球可能相同 xff0c 也可能不同 xff0c 盒子亦然 另外 xff
  • Python模拟登录CSDN

    关于CSDN的模拟登录 xff0c 网上已经有相当一部分博主发过类似的文章 xff0c 我这里不过稍稍模仿下 xff0c 使用前辈们的经验时 xff0c 还是非常感激的 具体过程如下 xff1a xff08 1 xff09 确定登录页面的表
  • 【UNIX环境高级编程】UNIX基础知识

    UNIX环境高级编程 UNIX基础知识 1 UNIX体系结构 从严格意义上 xff0c 可将操作系统定义为一种软件 xff0c 它控制计算机硬件资源 xff0c 提供程序运行环境 xff0c 我们称这种软件为内核 内核的接口称为系统调用 公
  • postman能正常打开但不显示窗口

    1 最近使用postman偶尔出现以下问题 postman在任务栏能正常打开 xff0c 如下图 xff0c 使用Alt 43 Tab也能看到 xff0c 但是窗口就是显示不了 2 解决方案 将鼠标放在任务栏上 xff0c 使用快捷键Alt
  • Linux文件相关常用命令(超全超详细)

    目录 command终端命令格式 xff1a command options parameter 1 ls命令 2 cd命令 3 touch 命令 4 mkdir命令 5 pwd命令 6 clear 命令 7 rm命令 8 cp命令 9 m
  • Linux远程管理常用命令(超全超详细)【持续更新】

    目录 1 shutdown命令 2 ifconfig命令 3 uname命令 4 uptime命令 5 free命令 6 who命令 7 last命令 8 history命令 9 ping命令 10 chmod 命令 11 chown 命令
  • 基于springcloud 的Eureka的服务注册与发现

    1 注册中心用来管理每个服务与服务之间的依赖关系 xff08 服务治理 xff09 xff0c 存放服务地址相关信息 xff08 接口地址 xff09 2 服务提供者 xff1a 提供服务接口 3 服务消费者 xff1a 调用服务接口 4
  • 计算机系统层次存储结构

    问 xff1a 当前计算机系统一般会采用层次结构存储数据 xff0c 请介绍下典型计算机存储系统一般分为哪几个层次 xff0c 为什么采用分层存储数据能有效提高程序的执行效率 xff1f 所谓存储系统的层次结构 xff0c 就是把各种不同存
  • Springboot的cache缓存机制

    我们知道一个程序的瓶颈在于数据库 xff0c 我们也知道内存的速度是大大快于硬盘的速度的 当我们需要重复地获取相同的数据的时候 xff0c 我们一次又一次的请求数据库或者远程服务 xff0c 导致大量的时间耗费在数据库查询或者远程方法调用上
  • Python-异常处理+文件

    目录 1 异常处理 1 简单的异常捕获 2 捕获错误类型 3 捕获未知错误 4 完整的异常语法 5 异常的传递 6 抛出异常 2 文件 1 读取文件 2 读取文件后文件指针会改变 3 写入文件 4 分行读取文件 5 复制文件 6 复制大文件
  • Eureka的设计理念

    目录 1 概述 1 1 服务实例如何注册到服务中心 1 2服务实例如何从服务中心剔除 1 3 服务实例信息的一致性问题 2 AP优于CP 3 Peer to Peer架构 3 1 主从复制 3 2 对等复制 4 Zone及Region设计
  • fastjson解析出现引用问题

    1 问题描述 后端返回前端接口数据包含引用数据 xff0c 如下图所示 2 原因 转json时使用这种方式 xff0c fastjson自动使用循环引用 xff1a String content 61 JSONObject toJSONSt
  • idea项目中添加mapper.xml文件样例

    1 点击File gt Settings gt 步骤如下图 然后新建mapper xml文件 点击mapper即可 2 添加其他模板方法同上
  • win10系统jdk1.8和tomcat8环境变量配置

    1 jdk环境变量配置 1 xff09 JAVA HOME 变量值就是jdk安装地址 JRE HOME 变量值就是jre安装地址 2 CLASSPATH 变量为 JAVA HOME lib JAVA HOME lib dt jar JAVA
  • Redis-事物&事物的四大特性(ACID)

    Redis事物 事物是指一系列操作步骤 xff0c 这一系列操作步骤 xff0c 要么完全执行 xff0c 要么完全不执行 Redis中的事物 transaction 是一组命令的集合 xff0c 至少是两个或两个以上的命令 xff0c r