【Redis】Redis事务详解

Redis的事务(transaction)允许在一个单独的操作序列中执行多个命令,并保证这些命令在其他客户端无法中断的情况下执行。Redis通过MULTI、EXEC、DISCARD和WATCH命令来实现事务管理。

Redis事务的基本命令

  1. MULTI:开启一个事务块。
  2. EXEC:执行所有在事务块中排队的命令。
  3. DISCARD:取消事务,放弃事务块中的所有命令。
  4. WATCH:监视一个或多个键,如果在事务执行之前这些键被修改,那么事务将被取消。

Redis事务的使用步骤

  1. 使用MULTI命令开始一个事务。
  2. 执行一系列的命令,这些命令将被放入事务队列中,而不会立即执行。
  3. 使用EXEC命令提交事务,所有的命令将按顺序执行。
  4. 如果在事务开始后但在执行之前需要取消事务,可以使用DISCARD命令。

代码示例

下面是一个使用Jedis(Java的Redis客户端)来实现Redis事务的示例代码:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;public class RedisTransactionExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);try {// 清空当前数据库jedis.flushDB();// 开启一个事务Transaction transaction = jedis.multi();try {// 在事务中添加多个命令transaction.set("key1", "value1");transaction.set("key2", "value2");transaction.incr("counter");// 提交事务transaction.exec();} catch (Exception e) {// 如果发生任何异常,取消事务transaction.discard();e.printStackTrace();}// 验证结果System.out.println("key1: " + jedis.get("key1"));System.out.println("key2: " + jedis.get("key2"));System.out.println("counter: " + jedis.get("counter"));} finally {// 关闭连接jedis.close();}}
}

乐观锁(Optimistic Locking)

Redis的WATCH命令用于实现乐观锁。当一个或多个键被WATCH监视后,如果这些键在事务执行之前被其他客户端修改,事务将被取消。

WATCH命令示例

public class RedisOptimisticLockingExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);try {// 清空当前数据库jedis.flushDB();// 设置初始值jedis.set("balance", "100");jedis.set("debt", "0");// 监视balance键jedis.watch("balance");int balance = Integer.parseInt(jedis.get("balance"));int debt = Integer.parseInt(jedis.get("debt"));int payment = 30;// 检查余额是否足够支付if (balance >= payment) {// 开启事务Transaction transaction = jedis.multi();try {// 更新余额和债务transaction.decrBy("balance", payment);transaction.incrBy("debt", payment);// 提交事务transaction.exec();System.out.println("Transaction successful");} catch (Exception e) {transaction.discard();System.out.println("Transaction failed");e.printStackTrace();}} else {System.out.println("Insufficient balance");}// 验证结果System.out.println("balance: " + jedis.get("balance"));System.out.println("debt: " + jedis.get("debt"));} finally {// 取消监视jedis.unwatch();// 关闭连接jedis.close();}}
}

这个示例展示了如何在Redis中使用事务和WATCH命令来实现乐观锁。如果在事务提交之前balance键被其他客户端修改,事务将被取消。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android面试八股文】String s= new string(“xxx“); 创建了几个String对象?

String s= new string(“xxx”);创建了几个String对象? 这道题想考察什么 ? 这个问题旨在考察对于 Java 中字符串 String 的理解。 考察的知识点 Java基础,JM常量池与对象内存分配 考生应该如何回答 首先让我们来分析代码 String s = new String("xxx")。 …

DP:子序列模型

子数组vs子数列 1、子数组(n^2) 子序列(2^n) 2、子数组是子序列的一个子集 3、子数组必须连续,子序列可以不连续 一、最长递增子序列 . - 力扣(LeetCode) 算法原理: 1、状态表示&#xff…

数据管理积重难返?这有一个新药方丨直播预告

大数据产业创新服务媒体 ——聚焦数据 改变商业 在数智化转型的浪潮中,数据管理领域正面临着前所未有的挑战和机遇。企业在数据管理过程中,普遍遭遇数据孤岛、数据质量不佳、存储和处理成本高昂、数据安全与隐私保护压力以及多源异构数据整合困难等诸多…

【MMU】——MMU 页命中/缺页

文章目录 MMU 页命中/缺页MMU 命中MMU 缺页 MMU 页命中/缺页 MMU 命中 处理器产生一个虚拟地址。MMU生成 PTE 地址,并从高速缓存/主存请求得到它。高速缓存/主存向 MMU 返回 PTE。MMU 构造物理地址,并把它传送给高速缓存/主存。高速缓存/主存返回所请求…

GIT仓库发布提交

git config --global user.name "test" git config --global user.email "testqq.com" 创建 git 仓库:mkdir php_tuisong cd php_tuisong git init touch README.md git add README.md git commit -m "first commit" git remote add origin htt…

SpringBoot引入WebSocket依赖报ServerContainer no avaliable

1、WebSocketConfig 文件报错 Configuration EnableWebSocket public class WebSocketConfig {Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}2、报错内容 Exception encountered during context initialization - canc…

SpringBoot+Vue校园管理系统(前后端分离)

技术栈 JavaSpringBootMavenMyBatisMySQLVueElement-UIShiro 系统角色 管理员用户院系管理员 系统功能截图

如何编辑 sudoers 文件

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 特权分离是 Linux 和类 Unix 操作系统中实施的基本安全范例之一。普通用户以有限权限操作,以减少其影响范围仅限于其自身环境,而不是更广泛的操作系统。 一个名…

《互联网政务应用安全管理规定》电子邮件安全如何整改?

继上篇文章(解读《互联网政务应用安全管理规定》网络和数据安全中的身份认证和审计合规)之后,本篇文章继续解读第五章“电子邮件安全”,为党政机关事业单位提供电子邮件系统整改思路。 “电子邮件安全”内容从第三十一条到第三十…

检验周转率

select 项目, sum(中位数时间差) as 中位数时间差, sum(百分之九十时间差) as 百分之九十时间差,sum(标本数) as 标本数 from ( select 项目, sum(中位数时间差) 中位数时间差,null 百分之九十时间差, null 标本数 from ( select distinct 项目,中位数,(sum(中位数时间差)/2) …

VirtualBox 虚拟机中的 centos7 系统拉取 docker 镜像常见报错及解决方法

一、拉取镜像时报错:Error response from daemon: Get "https://registry-1.docker.io/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority 原因:(文心一言给出的原因) 这个错误…

基于百度翻译API的火车头PHP翻译插件,可以翻译HTML片段

关于火车头的百度翻译插件,相信大家在火车头官网或网上都能找到相关代码,百度翻译插件是PHP写的,就一个PHP文件,简单灵活,不受火车头软件版本限制,任何有PHP插件权限的火车头版本都可以使用。但是百度API翻…

深度学习中的弱监督学习

深度学习中的弱监督学习 弱监督学习(Weakly Supervised Learning)是一种介于监督学习和无监督学习之间的机器学习方法。它在有限、部分或不完全标注的数据上进行训练,旨在利用这些不完美的标签信息来学习有效的模型。弱监督学习在深度学习中…

如何通过 4 种方式备份和恢复Android联系人

毫无疑问,联系人是Android手机上存储的最重要的信息之一。为了保护这些重要数据,明智的做法是对Android手机进行联系人备份。如果您的手机发生任何情况导致数据丢失,例如被盗、系统崩溃或物理损坏,您可以再次将备份中的联系人恢复…

c# 下 ScintillaNET 显示XML信息并折叠节点

winform下显示XML信息(非WPF) 之前使用的是FastColoredTextBox,github地址如下: https://github.com/PavelTorgashov/FastColoredTextBox 但是有个问题,它支持中文,wordwraptrue,自动换行时&…

springboot aop学习

依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-…

Spring-Cloud-Gateway-实现XSS、SQL注入拦截

XSS和SQL注入是Web应用中常见计算机安全漏洞&#xff0c;文章主要分享通过Spring Cloud Gateway 全局过滤器对XSS和SQL注入进行安全防范。 写这篇文章也是因为项目在经过安全组进行安全巡检时发现项目存储该漏洞后进行系统整改&#xff0c;本文的运行结果是经过安全组验证通过。…

玩物科技:引领物联网时代的创新先锋

在深圳这座充满活力和创新精神的城市&#xff0c;有一家年轻而充满潜力的公司正在悄然改变我们的日常生活。深圳市玩物科技有限公司自2017年成立以来&#xff0c;凭借其卓越的技术和创新理念&#xff0c;逐渐成为物联网时代的先锋力量。 玩物科技的愿景与使命 玩物科技的核心…

【vue3响应式原理】

# 源码结构 源码位置是在packages文件件内&#xff0c;实际上源码主要分为两部分&#xff0c;编译器和运行时环境 1. 编译器 compiler-core 核心编译逻辑compiler-dom 针对浏览器平台编译逻辑compiler-sfc 针对单文件组件编译逻辑compiler-ssr 针对服务端渲染编译逻辑 2. 运行时…

使用kafka tools工具连接带有用户名密码的kafka

使用kafka tools工具连接带有用户名密码的kafka 创建kafka连接&#xff0c;配置zookeeper 在Security选择Type类型为SASL Plaintext 在Advanced页面添加如下图红框框住的内容 在JAAS_Config加上如下配置 需要加的配置&#xff1a; org.apache.kafka.common.security.plain.Pla…