02-redis篇 redis事务处理及使用方式

news2024/11/18 9:22:44

目录

1. 事务简介: 

-> 1.1 必须满足: ACID四个特性(原子性,一致性,隔离性,持久性)

-> 1.2 简单理解: 一个业务,也可以看成是一个逻辑工作单元;

2. redis 操作事务的基本指令

-> 指令: 

 -> 图式: 

3.  模拟多事务操作(watch乐观锁)

3.1 不开启乐观锁watch操作

-> 按照执行指令提交的先后顺序

3.2 开启乐观锁watch操作

-> 3.2.1 A事务 先不提交

-> 3.2.2  B事务 直接提交后A在提交

-> 3.2.3 然后操作A事务提交

4. Jedis代码

4.1 (事务操作)

 4.2 事务 + 乐观锁


1. 事务简介: 

-> 1.1 必须满足: ACID四个特性(原子性,一致性,隔离性,持久性)

-> 1.2 简单理解: 一个业务,也可以看成是一个逻辑工作单元;

是为了保证业务的完整,数据的正确而推出的一种控制机制

2. redis 操作事务的基本指令

-> 指令: 

  • multi 开启事务
  • exec 提交事务
  • discard 取消事务
  • watch 监控,如果监控的值发生变化,则提交事务时会失败
  • unwatch 去掉监控

 -> 图式: 

 


3.  模拟多事务操作(watch乐观锁)

3.1 不开启乐观锁watch操作

-> 按照执行指令提交的先后顺序

3.2 开启乐观锁watch操作

-> 3.2.1 A事务 先不提交

-> 3.2.2  B事务 直接提交后A在提交

 

-> 3.2.3 然后操作A事务提交

 


4. Jedis代码

4.1 (事务操作)

package cn.pzy.transactionals;

import cn.pingzhuyan.jedisPool.JedisDataSourceLazy;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

import static cn.pingzhuyan.jedisPool.JedisDataSourceLazy.PRIVATE_KEY;

public class JedisTransactionTests {

    @Test
    public void testTransactionals() {

        Transaction multi = null;
        //try里面的内容不重要 就是基础的jedis连接池
        try (Jedis jedis = JedisDataSourceLazy.lazyConnection(PRIVATE_KEY)) {
            jedis.set("aaa", "100");
            jedis.set("bbb", "200");
            //实现操作,aaa给bbb 100
            // 结果是 aaa 0  bbb 300

            //开启事务
            multi = jedis.multi();

           //执行业务操作
            multi.decrBy("aaa", 100);
            multi.incrBy("bbb", 100);

            /*模拟异常 开启则报错, 如下图*/
//            int n = 1 / 0;

            //提交事务
            multi.exec();
            String aaa = jedis.get("aaa");
            String bbb = jedis.get("bbb");
            System.out.println("aaa=" + aaa);
            System.out.println("bbb=" + bbb);
        } catch (Exception e) {
            if (multi != null) {
                System.out.println("事务处理中出现异常, 取消执行队列!!!");
                System.out.println(e.getMessage());
                multi.discard();
            }

        }
    }
}

 4.2 事务 + 乐观锁

[仍需测试, 感觉有点小问题]

package cn.pzy.transactionals;

import cn.pingzhuyan.jedisPool.JedisDataSourceLazy;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

import java.util.List;
import java.util.Objects;

import static cn.pingzhuyan.jedisPool.JedisDataSourceLazy.PRIVATE_KEY;


public class Demo01 {

    public static void secKill() {
        Jedis jedis = null;
        Transaction multi = null;
        //try里面的内容不重要 就是基础的jedis连接池
        try {
            jedis = JedisDataSourceLazy.lazyConnection(PRIVATE_KEY);

            jedis.watch("ticket", "money");
            String ticket = jedis.get("ticket");
            if (ticket == null || Integer.parseInt(ticket) == 0) {
                System.out.println("已无库存!!!");
                throw new RuntimeException("已无库存");
            }

            multi = jedis.multi();

            multi.decr("ticket");
            multi.incrBy("money", 100);

            List<Object> exec = multi.exec();
            System.out.println(exec);

//            if (exec == null || Objects.equals(exec.size(), 0)) {
//                System.out.println("无命令执行!!!");
//                throw new RuntimeException("无命令执行");
//            }

        } catch (Exception e) {
            e.printStackTrace();
            if (multi != null) {
                System.out.println("取消事务!!!");
                multi.discard();
            }
        } finally {
            if (jedis != null) {
                System.out.println("锁和池释放!!!");
                jedis.unwatch();
                jedis.close();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Jedis jedis = JedisDataSourceLazy.lazyConnection(PRIVATE_KEY);
        jedis.set("ticket", "2");
        jedis.set("money", "0");

        new Thread(() -> {
            secKill();
            System.out.println("执行1");
        }).start();

        Thread.sleep(2);
        new Thread(() -> {
            secKill();
            System.out.println("执行2");
        }).start();
    }
}

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

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

相关文章

Linux Python安装

1.到官网下载适合自己的版本 Python Source Releases | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downloads/source/2.下载好压缩包之后&#xff0c;将压缩包解压开 3.将开发环境的依赖包准备好 yum -y install zlib-devel bz…

阅读笔记 MulDA: DAGA向多语言方向的拓展

阅读笔记 MulDA: DAGA向多语言方向的拓展 文章目录阅读笔记 MulDA: DAGA向多语言方向的拓展前言概述IntroductionMulDA: Our Multilingual Data Augmentation Framework1、Labeled Sequence Translation2、Synthetic Data Generation with Language Models3、Semi-supervised M…

Tableau可视化设计案例-05Tableau进阶

文章目录Tableau可视化设计案例05Tableau进阶1.数据集合并1.1 数据导入界面1.2超市销售情况符号地图1.3智能显示1.4 仪表盘高级应用Tableau可视化设计案例 本文是Tableau的案例&#xff0c;为B站视频的笔记&#xff0c;B站视频 参考&#xff1a;https://www.bilibili.com/vide…

怎么使用CAM350检查Gerber?

文章目录什么是Gerber文件&#xff1f;Gerber中的文件由那些组成&#xff1f;怎么使用CAM350检查Gerber&#xff1f; ——导入CAM350的基础操作&#xff1a;对层的操作什么是Gerber文件&#xff1f; Gerber文件是设计完后PCB(brd文件)板文件后交给板厂制造成品的文件。Gerber一…

代码随想录刷题记录 day50 每日温度+下一个更大元素 I

代码随想录刷题记录 day50 每日温度下一个更大元素 I 739. 每日温度 思想 1.暴力解 两次for 超时了 2.单调栈 花了点时间理解的。 单调栈的基础入门题。找到一个数组中右边的第一个大于 等于 或者小于当前元素的下标的位置 以时间换空间&#xff0c;用一个栈来记录右边第…

明道云联合RestCloud打造APaaS+IPaaS融合解决方案

背景介绍 APaaSIPaaS发展趋势 随着企业规模的扩张以及业务需求变化越来越快&#xff0c;企业现有IT系统无法快速应对前端敏捷化的需求。企业IT架构将朝着敏捷化、低代码化、服务化方向发展&#xff0c;而APaaSIPaaS解决方案在这种需求下应运而生&#xff0c;IPaaS可以把现有固…

ARAS plm安装,各种踩坑

目录准备工作sql server安装NET Framework安装许可申请IIS服务开启IIS无法启动报错 HTTP 错误 500.19 - Internal Server Error错误变为 aras Error: Cannot access OAuth Server due to 500 (Internal Server Error)**Aras安装准备工作 sql server安装 登录出现的几个错误 s…

Python数据分析挖掘案例:Python爬虫助力疫情数据追踪

通过学习Python数据分析挖掘案例&#xff0c;可以掌握通过Python爬虫获取的数据进行处理以及可视化分析的主要方法和技能&#xff0c;并为后续相关课程学习及将来从事数据分析工作奠定基础。 新冠病毒疫情在武汉突然爆发&#xff0c;确诊病例、疑似病例、死亡病例等数据牵动着每…

Binary number

A binary number is a number expressed in the base-2 numeral system or binary numeral system, a method of mathematical expression which uses only two symbols: typically “0” (zero) and “1” (one). The base-2 numeral system is a positional notation with a…

5G FWA市场一跃而上,四信多款5G终端赋能FWA典型应用

随着国家政策相继出台&#xff0c;全球5G基础设施建设日益完善&#xff0c;带动千行百业的巨大变革。以工业互联网、远程医疗、车联网、消费级硬件等为例的应用场景均在5G加持下实现跨越式升级。与此同时&#xff0c;5G FWA作为弥合光纤欠发达地区数字鸿沟挑战的“杀手级应用”…

【kafka】学习笔记(一)

学习笔记一、概述1.1、MQ1.2、kafka1.3、消息队列的两种模式1.3.1、点对点1.3.2、订阅与发布1.4、Kafka基础架构二、安装2.1、 集群规划2.2、 下载安装2.3、 集群启动脚本三、Kafka命令行操作3.1、主题命令行操作3.2、生产者命令行操作3.3、消费者命令行操作四、 Kafka 生产者4…

常用的Linux命令介绍

ls&#xff1a; 如何区分一个文件类型是 文件夹 还是 普通文件&#xff1a; “-” 类型 表示是 普通文件 “d” 类型 表示是 文件夹 cd&#xff1a; cd -返回进入此目录前所在的目录 cd ~如果是root用户&#xff0c;相当于 cd /root&#xff1b;如果是普通用户&#xff0c;相…

7、操作系统之间的文件传输

Windows 与 Linux 在Windows与Linux中传输文件的常用方式有两种&#xff0c;一种是使用使用XFTP工具&#xff0c;另一种是使用rz sz 命令的方式进行 lrzsz 安装 yum install lrzsz -y 1&#xff09;rz 将文件从window上传到Linux 2&#xff09;sz 将文件从linux传输到window …

常用排序算法哪个效率更高之从理论到实践

前面整理了一篇关于排序算法的基础类库&#xff1a;基本排序算法类SortHelper 这里我们来看看这几个算法哪个效率更高一点呢&#xff1f; 1、先从理论来看看这几个算法 1、冒泡排序法 基本思想&#xff1a;两两比较待排序数据元素的大小&#xff0c;发现两个数据元素的次序…

RSA和AES的使用

文章目录为什么要对数据传输加密对称加密和非对称加密密钥的几种格式非对称加密算法----RSA算法产生公私密钥对对称加解密算法AES为什么要结合使用这两种算法利用RSA来加密传输AES的密钥&#xff0c;用AES来加密数据&#xff0c;思路如下&#xff1a;特点分析&#xff1a;参考链…

【探索Spring底层】14.谈谈参数解析器

文章目录1. 参数解析器概述2. 常见参数的解析1. 参数解析器概述 参数解析器是Spring-Web包提供的组件&#xff0c;并且SpringMVC中提供了很多参数解析器。 常见的参数解析器如下 org.springframework.web.method.annotation.RequestParamMethodArgumentResolverabbc908org.s…

部署并启动项目在linux(CentOS7)上,一名合格的程序猿不能不会(ಥ_ಥ)

各位小伙伴大家好呀哈哈哈~ 遇到问题不要慌─≡Σ(((つ•̀ω•́)つ让我先发个朋友圈~( • ̀ω•́ )✧ 我们知道项目的正常运行是需要先部署在服务器上&#xff0c;然后才能正常使用&#xff0c;我们一般都是在idea下写好然后直接部署在tomcat上或者其他服务器&#xff0c;但…

多维表需求管理表自动生成TAPD需求

【实现效果&#xff1a;】业务同学使用多维表管理客户需求&#xff0c;和产品团队经过评审之后&#xff0c;一键把多维表里对应的需求生成TAPD需求/缺陷单 【准备工作】 准备一个多维表&#xff0c;比如维格表、金山轻维表等 可以参考这两个模版&#xff1a; 金山轻维表&am…

【深入浅出Spring原理及实战】「开发实战系列」Aspectj和LoadTimeWeaving的动态代理技术实现指南

前提介绍 当我们聊到Spring框架的项目实际开发中&#xff0c;用的强大的功能之一就是&#xff08;面向切面编程&#xff09;的这门AOP技术。如果使用得当&#xff0c;它的最大的作用就是侵入性比较少并且简化我们的工作任务&#xff08;节省大量的重复性编码&#xff09;&…

【QT】PySide6 数据可视化折线图

一、项目介绍 本项目将通过PySide6构建一个可以显示数据折线图的可视化程序&#xff0c;其中&#xff0c;数据来源时美国地质调查局(US Geological Survey)上公开的一小时地震震级数据。 可以通过链接进行下载。 二、实现步骤 本项目的实现步骤可以概括为&#xff1a; 读取…