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架构&…

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版本不同&…

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.…

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

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

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

文章目录 前言一、人工智能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的模型主要的思路是通过编码器,将大量文本、时序数据等资料进行编码、压缩,达到进一步抽象理解输入数据的能力…

【JavaScript】函数的动态传参

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

Python接口自动化测试框架(实战篇)-- 数据库操作MySQL

文章目录 一、前言二、数据库什么是数据验证为什么需要操作数据库做数据验证?现在回到怎样做数据验证的问题上来 三、[PyMSQL](https://pypi.org/project/pymssql/)pymysql如何操作数据库实际应用 四、总结 一、前言 说起数据库的操作,咱们应该保持一颗敬畏的心&a…

Ubuntu安装terminator教程

Terminator 是一个高级的终端仿真器,专为 Linux 和 Unix 系统设计。它的主要特点是提供了丰富的多窗口和多标签功能,使用户能够在一个窗口中管理多个终端会话。这对于系统管理员、开发人员以及需要同时运行多个命令行任务的用户来说,极为方便。 一、安装 1、更新包 sudo a…

vue项目启动报错 vue与vue-template-compiler版本不一致

出现错误 Vue packages version mismatch: vue2.6.12 (/Users/work_ws/project/my/astar-education/astar-education-ui/node_modules/vue/dist/vue.runtime.common.js)vue-template-compiler2.6.13 (/Users/work_ws/project/my/astar-education/astar-education-ui/node_mod…

图中的最短环

2608. 图中的最短环 现有一个含 n 个顶点的 双向 图,每个顶点按从 0 到 n - 1 标记。图中的边由二维整数数组 edges 表示,其中 edges[i] [ui, vi] 表示顶点 ui 和 vi 之间存在一条边。每对顶点最多通过一条边连接,并且不存在与自身相连的顶…

Java1.2标准之重要特性及用法实例(十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列…

征服 Docker 镜像访问限制:KubeSphere v3.4.1 成功部署全攻略

近期,KubeSphere 社区的讨论中频繁出现关于 Docker 官方镜像仓库访问受限的问题。 本文旨在为您提供一个详细的指南, 展示在 Docker 官方镜像访问受限的情况下,如何通过 KubeKey v3.1.2 一次性成功部署 KubeSphere v3.4.1 以及 Kubernetes …

深入剖析:GaussDB与MySQL在COUNT查询中的并行化技术

引言 数据库查询性能优化是数据库管理和开发中的一个重要议题。在处理大数据量的COUNT查询时,传统的单线程处理方式可能无法满足现代应用的性能需求。GaussDB(for MySQL)和MySQL作为流行的数据库系统,它们在并行查询优化方面有着各自的策略和技术。本文…

Python批量采集某东评论,实现可视化分析

女朋友没事就喜欢网购,买一大堆又不用,总说不合适,为了不让她花冤枉钱,于是我决定用Python写一个采集商品评论的脚本,然后对商品进行分析,这样就不怕踩到坑了! 让我们直接开始本次操作 准备工作…

Python及Jupyter-Notebook安装

来源: “码农不会写诗”公众号 链接:Python及Jupyter-Notebook安装 文章目录 01 Python安装1.1 下载安装包1.2 双击安装包,开始安装1.3 选择安装配置1.4 选择需要安装的Optional Feature,点击Next1.5 选择需要安装的Advanced Feat…