Redis事务详述,java百度人脸识别

2023-11-06

1、简介


Redis类似大多数成熟的数据库系统一样,提供了事务机制。Redis的事务机制非常简单,它没有严格的事务模型,无法像关系型数据库一样保证操作的原子性。

Redis事务最大的作用是保证多个指令的串行执行,它可以借助于Redis单线程读写的特性,保证Redis事务中的指令不会被事务外的指令打搅,不过要注意它不是原子性的

完整事务案例:

image.png

multi开启一个事务之后,所有指令都不执行,而是缓存到事务队列中,直到服务器接收到exec指令,才开始执行整个事务中的指令。事务全部指令执行完毕后,一次性返回全部的结果。

事务指令执行.png

使用Redis事务,一个最需要注意的问题是,指令多,网络开销高;因此我们一定要结合管道pipeline一起使用,这样可以将多次网络io操作压缩成单次。

2、指令介绍


2.1 简介

Redis事务相关的指令有五个,分别是MULTI、EXEC、DISCARD、WATCH、UNWATCH

| 指令 | 指令作用 | 返回值 |

| — | — | — |

| MULTI | 标记一个事务块的开始 | 总是返回 OK |

| EXEC | 执行所有事务块内的命令 | 事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值 nil |

| DISCARD |

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

取消事务,放弃执行事务块内的所有命令,如果正在使用 WATCH 命令监视某个(或某些) key,那么取消所有监视,等同于执行命令 UNWATCH | 总是返回 OK |

| WATCH | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 | 总是返回 OK |

| UNWATCH | 取消 WATCH 命令对所有 key 的监视。如果在执行WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了。因为 EXEC 命令会执行事务,因此 WATCH 命令的效果已经产生了;而 DISCARD 命令在取消事务的同时也会取消所有对 key 的监视,因此这两个命令执行之后,就没有必要执行 UNWATCH 了 | 总是返回 OK |

2.2 MULTI(开启事务)

MULTI用于标记一个事务的开始,事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。MULTI指令总是返回OK。

image.png

2.3 EXEC(执行事务)

EXEC用于执行所有事务块内的命令,假如某个(或某些) key 正处于 WATCH 命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么 EXEC 命令只在这个(或这些) key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断(abort)。

image.png

2.4 DISCARD(取消事务)

DISCARD用于取消事务,放弃执行事务块内的所有命令。如果正在使用 WATCH 命令监视某个(或某些) key,那么取消所有监视,等同于执行命令 UNWATCH 。DISCARD指令总是返回OK。

image.png

2.5 WATCH(监视)

WATCH用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。这个实现方式也很简单,WATCH是在事务之间发送的指令,Redis服务在接收到指令时,会记录下该key对应的值,当Redis服务接收到EXEC指令,需要执行事务时,Redis服务首先会检查WATCH的key的值,从WATCH之后是否发生改变即可。

image.png

注意禁止在MULTI和EXEC之间执行WATCH指令,这会导致Redis服务响应异常

image.png

2.6 UNWATCH

UNWATCH用于取消WATCH命令对所有key的监视。如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了。因为 EXEC 命令会执行事务,因此 WATCH 命令的效果已经产生了;而 DISCARD 命令在取消事务的同时也会取消所有对 key 的监视,因此这两个命令执行之后,就没有必要执行 UNWATCH 了。

image.png

3、Jedis 使用事务


通过模拟一个简单的余额增加的例子,使用Jedis客户端来使用Redis的事务。

package com.lizba.redis.tx;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.Transaction;

import java.math.BigDecimal;

import java.util.List;

/**

*      Redis事务demo

* @Author: Liziba

* @Date: 2021/9/9 23:53

*/

public class TransactionDemo {

private Jedis client;

public TransactionDemo(Jedis client) {

this.client = client;

}

/**

* 添加余额

* @param userId    用户id

* @param amt       添加余额

* @return

*/

public BigDecimal addBalance(String userId, BigDecimal amt) {

String key = this.keyFormat(userId);

// 初始用户余额为0

client.setnx(key, “0”);

while (true) {

client.watch(key);

BigDecimal balance = new BigDecimal(client.get(key)).setScale(2, BigDecimal.ROUND_HALF_UP);

BigDecimal amount = balance.add(amt);

Transaction tx = client.multi();

tx.set(key, amount.toPlainString());

List exec = tx.exec();

// 返回值不为空则证明Redis事务成功

if (exec != null) {

break;

}

}

return new BigDecimal(client.get(key)).setScale(2, BigDecimal.ROUND_HALF_UP);

}

/**

* 获取总金额

* @param userId 用户id

* @return

*/

public BigDecimal getAmount(String userId) {

String amt = client.get(keyFormat(userId));

return new BigDecimal(amt);

}

/**

* Redis key

* @param userId 用户id

* @return

*/

private String keyFormat(String userId) {

return String.format(“balance:%s”,userId);

}

}

测试代码:

package com.lizba.redis.tx;

import redis.clients.jedis.Jedis;

import java.math.BigDecimal;

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

Redis事务详述,java百度人脸识别 的相关文章

随机推荐

  • fabric1.0之cryptogen讲解

    一 工具定义 Cryptogen是hyperleder fabric提供的为网络实体生成加密材料 公私钥 证书等 的实用程序 简单来说就是一个生成认证证书 x509 certs 的工具 这些证书代表一个身份 并允许在网络实体间通信和交易时进
  • 下拉框控制当一个选中时另一个值随着变化且不可选

    推荐阅读 AI绘画关于SD MJ GPT SDXL百科全书 面试题分享点我直达 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java python面试题 项目实战 AI文本 OCR识别最佳实践 AI Gamma一键
  • 常用的获取日期相关内容的方法

    1 格式化日期的方法 只返回日期 年 月 日 const formateDate val gt const date new Date val const year date getFullYear const month repairZe
  • pycharm利用快捷键,快速注释多行代码的方法分享

    最近在pycharm的新手学习群里 发现有些小伙伴依然在 手工 进行代码的注释 效率较低 下面分享pycharm利用快捷键 快速注释多行代码的方法 可以帮助pycharm初学者加倍提升代码的注释效率 代码注释快捷键 pycharm代码注释的
  • springboot动态数据源用shardingjdbc按时间分表

    1 背景 原有项目架构 springboot mybatis plus dynamic datasource 动态数据源 mybatis plus拓展 druid 连接池 根据业务数据不断增加 需要进行对业务量大的数据表行分表 因为以前的业
  • nacos注册中心面试总结

    1注册中心演变及其设计思想 2 Nacos注册中心架构 3 核心功能 服务注册 Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务 提供自身的元数据 比如ip地址 端口等信息 Nacos Serve
  • jps 命令

    NAME jps Lists the instrumented Java Virtual Machines JVMs on the target system This command is experimental and unsuppo
  • 【Pytorch】第 3 章 :进行数值估计的蒙特卡洛方法

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 芯片跨时钟域同步,即异步处理的理解

    网上有一套资料Clifford E Cummings论文合集 还不错 以下是临时想到的 亚稳态就是时序违反的后果 异步信号肯定有时序违反可能 单bit 源时钟域打一拍 目的时钟域打两拍或者更多拍 多bit fifo方法 原理是格雷码指针判断
  • 《机器学习实战》——第13章 利用PCA来简化数据

    在低维下 数据更容易进行处理 其相关特征可能在数据中明确地显示出来 通常而言 我们再应用其他机器学习算法之前 必须先识别出其相关特征 13 1 降维技术 始终贯穿本书的一个难题就是对数据和结果的展示 这是因为文字图像是二维的 而在通常情况下
  • Uniyt热更新——LuaFrameWork学习(三)判断unity里对象为空

    在游戏制作过程中我们经常会Destroy一些没用的GameObject 那么在ulua里我们怎么样来判断我们的引用被Destroy了呢 这里要感谢阿盟哥 他已经为我们解决了这个问题 在他写的 Global lua里 代码如下 functio
  • 第二章 使用HTML标签组织页面内容

    前言 使用VS Code进行一系列的实操 跟着学习 一起进步 这章大部分代码注释都在代码段里边 需要点开查阅 作者希望和大家一起探讨 不断吸取经验 感谢鼓励 之后还会有有关CSS JavaScript JQuery等的更新 欢迎关注收藏订阅
  • VUE element-ui 之table表格第一行插入输入框

    步骤 模板中配置列
  • typescript在vue3中的使用。

    1 项目安装typescript 我在创建项目时就选择了安装typescript 如果创建vue3项目时并没有安装typescript依赖 也可以用命令行安装 执行如下命令 npm install typescript save dev 2
  • DNSPod十问黄欢:为什么互联网大厂都要去造车?

    荆虹科技创始人 3D TOF视觉领域专家 六西格玛黑带大师 天津大学工业工程硕士 曾就职于台湾扬信与盛泰光学 领导并服务过Moto Nokia 苹果手机摄像头项目 人称奶罩 腾讯云中小企业中心总经理 DNSPod创始人 洋葱令牌创始人 网络
  • 有一个含n(n」2)个整数的数组a,判断其中是否存在出现次数超过所有元素一半的元素

    一 问题描述 有一个含n n gt 2 个整数的数组a 判断其中是否存在出现次数超过所有元素一半的元素 二 问题分析与解答 分析 可以先将数组a中的元素递增排序 再求出出现次数最多的次数maxnum 最后判断是否满足条件 代码实现 incl
  • 【CV】第 5 章:神经网络架构和模型

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • unity3d 学习笔记(二)

    AudioClip 声音资源的使用 unity3d中声音资源可以设置为3d音效或者2d音效 3d音效受空间的影响 越近声音越大 component Audio source 声音的发生物体 Audio listener 声音的接受者 一般放
  • Unity3D循环滚动的背景图片?制作方法!!!!

    链接 http momowing diandian com post 2013 01 26 40049505995 真是抱歉 从今天起才认真的翻阅android game example 这个插件 开始熟悉一下外国佬的一些编程方式 相信很多
  • Redis事务详述,java百度人脸识别

    1 简介 Redis类似大多数成熟的数据库系统一样 提供了事务机制 Redis的事务机制非常简单 它没有严格的事务模型 无法像关系型数据库一样保证操作的原子性 Redis事务最大的作用是保证多个指令的串行执行 它可以借助于Redis单线程读