Redis的事务_乐观锁与悲观锁

目录

一 Redis事务-介绍

二 事务的基本操作

三 Redis事务-乐观锁与悲观锁

四 Redis事务-特性

一 Redis事务-介绍

Redis事务可以一次执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会序列化,按顺序的串行化执行,而不会被其他命令插入,不许加塞。

Redis事务有以下三个重要的保证:

1.批量操作在发送EXEC命令前被放入队列缓存

2.收到EXEC命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行

3.在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中,一个事务从开始到执行会经理以下三个阶段:

开始事务

命令入队

执行事务

二 事务的基本操作

#开启事务
multi#执行事务
exec#监控
watch#一旦执行exec,watch监控会被取消127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]> set k1 100
OK
127.0.0.1:6379[1]> set k2 200
OK
127.0.0.1:6379[1]> set k3 hello
OK
127.0.0.1:6379[1]> get k1
"100"
127.0.0.1:6379[1]> get k2
"200"
127.0.0.1:6379[1]> get k3
"hello"
127.0.0.1:6379[1]> 
127.0.0.1:6379[1]> 
127.0.0.1:6379[1]> MULTI            # 开启事务
OK
127.0.0.1:6379[1](TX)> get k1       # 执行第一条命令
QUEUED
127.0.0.1:6379[1](TX)> get k2       # 执行第二条命令
QUEUED
127.0.0.1:6379[1](TX)> get k3       # 执行第三条命令
QUEUED
127.0.0.1:6379[1](TX)> set k4 300   # 执行第四条命令
QUEUED 
127.0.0.1:6379[1](TX)> exec         # 执行事务
1) "100"
2) "200"
3) "hello"
4) OK
127.0.0.1:6379[1]> 

假如我现在在1号数据库下,我先设置几个值,然后输入命令multi 表示开启事务,此时我get k1 k2 k3 这些命令会被放入队列,我再次set值 ,它也是一个命令,所以会被放入队列。接着,输入命令exec表示执行命令,就会打印出执行命令后的结果!

再来看一下下面这个小例子,体现Redis事务不具有原子性

incr k2可以看作是运行时报错,set k5可以看作是编译时报错

总结:redis的每条命令是原子的,但是redis的事务是不保证原子性的。(MYSQL事务具有原子性)

watch可以监视一个或者多个key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断。

unwatch 取消监视

三 Redis事务-乐观锁与悲观锁

1.悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都会被认为别人会修改,所以每次在拿取数据的时候都会上锁,当其他线程想要访问数据时,都需要阻塞挂起。传统的关系型数据库里边就用到了很多这种机制。比如行锁,表锁,读锁等,都是在操作之前先上锁。

2.乐观锁:【冲突检测和数据更新】

乐观锁,顾名思义,就是很乐观,每次去拿取数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断以下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

乐观锁策略:提交版本必须大于记录当前版本才能执行更新。一般会使用版本号机制或CSA操作实现。

四 Redis事务-特性

1.单独的隔离操作:事务中所有的命令都会序列化、按序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

2.没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际的执行,也就是不存在“事务内的查询要看到事务里面的更新,在事务外查询不能看到”这个是让人万分头痛的问题。

3.不保证原子性:Redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行。没有回滚。

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

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

相关文章

【开源库学习】libodb库学习(十二)

13 数据库架构演变 当我们添加新的持久类或更改现有的持久类时,例如,通过添加或删除数据成员,存储新对象模型所需的数据库模式也会发生变化。同时,我们可能有包含现有数据的现有数据库。如果应用程序的新版本不需要处理旧数据库&a…

使用 XRDP 远程linux主机

一、简介 XRDP是一个开源的远程桌面协议(Remote Desktop Protocol,RDP)服务器,采用的是标准的RDP。 官网地址:https://www.xrdp.org/ github地址: https://github.com/neutrinolabs/xrdp/releases XRDP也是C/S架构&…

右值引用与移动构造详解

右值引用与移动构造 这节我们来详细的介绍一下什么是左值引用,什么是右值引用,以及为什么要引入右值引用,还有就是c11非常重要的特性 -> 移动构造 左值引用和右值引用 ​ 左值是一个表示数据的表达式(如变量名或解引用的指针)&#xff0…

Springboot 整合Elasticsearch

1 java操作ES方式 1.1 操作ES 9300端口(TCP) 但开发中不在9300进行操作 ES集群节点通信使用的也是9300端口如果通过9300操作ES,需要与ES建立长连接 可通过引入spring-data-elasticsearch:transport-api.jar不在9300操作原因:1.springboot版本不同&…

Spring Core——资源加载与访问(Resource)

Spring 中的资源加载 在Spring框架中,Resource接口用于简化和统一对各种底层资源(如xxx.xml、application.yml、application.properties等文件、类路径资源、URL等)的访问。它提供了一个通用的抽象层,使开发者无需关注不同资源类…

Cloud Native 安全实践解析

Cloud Native 安全实践解析 一、Cloud Native概述 Cloud Native(云原生)是一种构建和运行应用程序的方法,它充分利用了云计算的弹性、可扩展性和多租户特性。云原生应用通常被设计成微服务架构,利用容器化技术进行部署和管理&am…

springboot电影院线上购票系统-计算机毕业设计源码68220

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统流程分析 2.2.1 添加信息流程 2.2.2 修改信息流程 2.2.3 删除信息流程 2.3 系统功能分析 2.…

Fireflyrk3288 ubuntu18.04添加Qt开发环境、安装mysql-server

1、创建一台同版本的ubuntu18.04的虚拟机 2、下载rk3288_ubuntu_18.04_armhf_ext4_v2.04_20201125-1538_DESKTOP.img 3、创建空img镜像容器 dd if/dev/zero ofubuntu_rootfs.img bs1M count102404、将该容器格式化成ext4文件系统 mkfs.ext4 ubuntu_rootfs.img5、将该镜像文件…

起薪4万的AI产品经理自述:一个算法模型是怎么训练出来的?

起薪4万的AI产品经理自述:一个算法模型是怎么训练出来的? 这篇文章,我们继续来讲模型构建的其他 3 个环节:模型训练、模型验证和模型融合。 模型训练 模型训练是通过不断训练、验证和调优,让模型达到最优的一个过程。…

切割01串问题(dp动态规划问题)

题目概述: 给定一个长度为 𝑛 的 01 串,定义如下操作为一次 “切割”: 将长度大于 1 的字符串分割为两个非空的连续字串,记分割出来的左侧字串 a 中 0 的出现次数为 C 0 C_0 C0​,右侧字串 b 中 1 出现的…

ChatGPT:Java 的文档标准 OAS 是什么的缩写

ChatGPT:Java 的文档标准 OAS 是什么的缩写 OAS 是 “OpenAPI Specification” 的缩写。OpenAPI Specification 是一个用于描述和定义 RESTful APIs 的标准。最初由 Swagger 开发,现在由 OpenAPI Initiative 维护。OAS 使用一种标准的格式(通…

【人工智能】穿越科技迷雾:解锁人工智能、机器学习与深度学习的奥秘之旅

文章目录 前言一、人工智能1. 人工智能概述a.人工智能、机器学习和深度学习b.人工智能发展必备三要素c.小案例 2.人工智能发展历程a.人工智能的起源b.发展历程 3.人工智能的主要分支 二、机器学习1.机器学习工作流程a.什么是机器学习b.机器学习工作流程c.特征工程 2.机器学习算…

基于GEC6818开发板+Linux+Qt设计的智能养老院出入管理系统

一、前言 1.1 项目介绍 【1】项目功能介绍 随着我国老龄化进程的加快,养老问题日益突出,如何有效保障老年人的生活质量与安全成为社会关注的重点。智能化、信息化技术的发展为解决这一问题提供了新的思路和手段。基于Linux系统的智能养老院出入管理系统应运而生,为了实现…

Thinkphp仿华为商城源码/红色风格电脑手机数码商城系统网站源码

Thinkphp仿华为商城,主要实现了商品首页展示、用户意见、商品分类列表、商品搜索、商品详细展示、购物车、订单生成、在线付款、以及个人中心完善个人资料、用户修改收货地址、余额查询、消费查询、订单管理、商品评价、热销商品和最近商品浏览; 后台是…

大模型的架构演进史——为什么Decoder-Only成为最终的胜利者

文章目录 大模型的架构encoder onlydecoder nolyencoder-decoder为什么现在decoder-only为主流 大模型的架构 encoder only 使用encoder-only的模型主要的思路是通过编码器,将大量文本、时序数据等资料进行编码、压缩,达到进一步抽象理解输入数据的能力…

WEB前端12-axios基础

Vue2-axios基础 1.axios基本概念 在现代的前端开发中,处理网络请求是至关重要的一部分。Axios 是一个流行的基于 Promise 的 HTTP 客户端,它可以在浏览器和 Node.js 环境中使用。它的设计简单易用,支持并行请求、拦截器、CSRF 防护等特性&a…

【JavaScript】函数的动态传参

Javacript(简称“JS”)是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript基于原型编程、多范式的动态脚本语言&…

Linux 常用命令之文件处理

Linux 文件处理命令指南 文件查看命令 cat (Concatenate and display files) # 显示文件内容 cat file.txt# 显示多个文件的内容 cat file1.txt file2.txt# 将文件内容合并并输出到新文件 cat file1.txt file2.txt > combined.txt# 以行号显示文件内容 cat -n file.txtta…

写代码对人的影响

1 代码是需要跑起来的,不能你写了一段代码运行不了 2 代码过程中有大量的bug,经常异常报错,你需要花费时间去解决 对人的影响就是解决问题的态度得到强化,解决问题要比坚持正确困难,坚持正确只是需要自然而然的努力&…