关于redis集群和事务

最近为了核算项目的两个架构指标(可用性和伸缩性),需要对项目中使用的Redis数据库的集群部署进行一定程度的了解,当然顺便再学习一遍它的事务细节。

既然我在上面把Redis称之为数据库,那么在我们目前的项目里,它自然就需要持久化相关的数据,而不仅仅充当缓存而已!

在网上逛了一遍,看了不少关于redis集群搭建的文章,有一些把redis的主备当集群来讲的,也有一些讲的是以第三方代理方式搭建集群的,比较新的是讲的redis3.0beta提供的服务器端实现集群的~~

比较有代表型的一款中间代理方式实现redis集群的开源产品是Twitter推出的twemproxy。而这种方式的优劣,redis的作者早已经写过一篇分析的文章了,相信大家读过以后就能了解其中的好坏。

在这里,我主要是贴一下关于twemproxy对redis命令的支持情况的细节,相信有了这个数据,我们在设计使用redis时可以起到指导的作用。

另外,twemproxy中不少命令的支持与否需要依赖Hash Tags,简单粗暴解释的话,其实就是说twemproxy支持指定key中的某一部分用来做hash散列,这样就有助于把相关的一些数据分布在同一台服务器上,从而避免一些指令导致数据在多服务器之间不必要的迁移而影响了性能!

从这个表格中我们注意到,twemproxy不支持redis的事务操作,原因其实在上面给出的文章中已经解释了~这里我主要想来聊一下redis的事务到底是什么?记忆中看过一篇文章,模糊记得redis的事务和传统关系型数据库的事务是存在差异的。

先看一下这篇文章,写的已经非常之详细了,不是么?我们必须搞清楚: 原子性、一致性和回滚功能。这可能显得有一些过于纠结定义了,不过查了一下GG才发现,其实关于原子性和一致性的理解却是有很多种说法~~而我更偏向于下面这种解释:

  • **一致性:**如果事务启动时数据是一致的,那么当这个事务成功结束的时候数据库也应该是一致的;
  • **原子性:**事务的所有操作在数据库中要么全部正确反映,要么全部不反映。

分别举例子来说,一致性就是数据库的数据状态符合数据库所描述的业务逻辑和规则,比如最简单的一条一致性规则:银行账户存款余额不能是负值。

而原子性就是其字面解释:要么都执行,要么都取消!这时候就需要数据库事务有回滚能力。不难理解吧?

接下来我们再说redis的事务,上面的资料中提到:

当事务失败时,Redis 也不会进行任何的重试或者回滚动作。

也就是说,redis不具备事务原子性(非事务下的redis命令具备原子性)。看一个代码例子:

set name kazaff0  	//首先我们为key为name的键设置了一个值:kazaff0
multi				//开启事务
set name kazaff1	//事务里我们修改name的值为kazaff1
lpush name kazaff2	//故意造成一个执行错误
exec				//提交事务
get name			//?

可以猜出最后一条指令的返回结果应该:kazaff1。为什么?因为redis不支持事务失败后回滚!

但是需要注意的是,服务器在执行事务之前会先检查客户端的状态,如果发现不满足事务执行的条件的话服务器端会直接终止事务,也就是说任务队列中的指令一条都没有执行!

为什么要注意这一点呢?也就是说只有执行错误才会需要回滚,而watch,discard,入队错误等都不需要回滚,因为执行队列中的指令压根一条都没有执行过!

以前总是把redis的事务和pipe看成一个东西:打包执行指令~~但现在才发现,完全两码事儿嘛!!


参考:
理解事务的一致性和原子性

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go语言--工程管理、临时/永久设置GOPATH、main函数以及init函数

工作区 Go 代码必须放在工作区中。工作区其实就是一个对应于特定工程的目录,它应包含3个子目录:src 目录、pkg目录和bin 目录。 src 目录:用于以代码包的形式组织并保存 Go源码文件。(比如:.go.chs等)pkg 目录:用于存放经由 go install 命令构建安装后的代码包(包…

2.3.2 主程序和外部IO交互 (文件映射方式)----C#调用范例

2.3.2 主程序和外部IO交互 (文件映射方式)----C#调用范例 效果显示 1 说明 1 .1 Test_IOServer是64bit 程序, BD_SharedIOServerd.dll 在 /Debug文件夹中 1 .2 Test_IOServer是32bit 程序, BD_SharedIOClientd.dll (32bit&#…

java join与yield方法

join() join() 方法的主要作用是使当前线程(调用 join() 方法的线程)等待目标线程完成执行。当目标线程执行完毕后,当前线程才会继续执行。 代码示例: public class JoinExample {public static void main(String[] args) {Thr…

在数字化时代,自助BI是数据价值最大化的必经之路

引言:在数字化时代,数据已成为企业最宝贵的资产之一。然而,仅仅拥有海量数据并不足以带来竞争优势,关键在于如何有效地分析并利用这些数据以指导决策、优化运营、提升客户体验,并最终实现业务的持续增长。在一章里笔者…

SpringBoot新手快速入门系列教程七:基于一个低配centoos服务器,如何通过宝塔面板部署一个SpringBoot项目

1,如何打包一个项目 通过IDEA自带的命令行,执行 ./gradlew clean build 2,检查生成的JAR文件 进入 build/libs 目录,你应该会看到一个类似 helloredis-0.0.1-SNAPSHOT.jar 的文件。 3:运行生成的JAR文件 你可以使…

springboot服务启动读取不到application.yml中的nacos.config信息

我的版本: 可以添加bootstrap.yml文件,在里面添加nacos.config的配置信息 也可以添加VM参数 -Dspring.cloud.nacos.discovery.server-addr -Dspring.cloud.nacos.config.server-addr -Dspring.cloud.nacos.config.namespace -Dspring.cloud.nacos.discov…

图片管理新纪元:高效批量横向拼接图片,一键生成灰色艺术效果,打造专业视觉体验!

在数字时代,图片已成为我们生活和工作中不可或缺的一部分。但面对海量的图片,如何高效地进行批量管理、拼接和调色,成为许多人面临的难题。今天,我们为您带来了一款颠覆性的图片管理工具,让您轻松实现图片批量横向拼接…

设计模式探索:建造者模式

1. 什么是建造者模式 建造者模式 (Builder Pattern),也被称为生成器模式,是一种创建型设计模式。 定义:将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式要解决的问题: 建造者模…

前端面试题(CSS篇四)

一、CSS 优化、提高性能的方法有哪些? 加载性能: (1)css压缩:将写好的css进行打包压缩,可以减少很多的体积。 (2)css单一样式:当需要下边距和左边距的时候,很…

kafka中

Kafka RocketMQ概述 RabbitMQ概述 ActiveMQ概述 ZeroMQ概述 MQ对比选型 适用场景-从公司基础建设力量角度出发 适用场景-从业务场景出发 Kafka配置介绍 运行Kafka 安装ELAK 配置EFAK EFAK界面 KAFKA常用术语 Kafka常用指令 Kafka中消息读取 单播消息 group.id 相同 多播消息 g…

【VUE基础】VUE3第三节—核心语法之ref标签、props

ref标签 作用&#xff1a;用于注册模板引用。 用在普通DOM标签上&#xff0c;获取的是DOM节点。 用在组件标签上&#xff0c;获取的是组件实例对象。 用在普通DOM标签上&#xff1a; <template><div class"person"><h1 ref"title1">…

Vmware环境下ESXi主机 配置上行链路、虚拟交换机、端口组、VMkernel网卡

一、适用场景 1、使用专业服务器跑多种不同的业务&#xff0c;每种业务可能所需运行的server环境不同&#xff0c;有的需要Linux server CentOS7/8、kali、unbuntu……有的需要windows server2008、2003、2016、2019、2022…… 2、本例采用的是VMware ESXi6.7 update 3版本&am…

【硬件产品经理】硬件产品手板设计

目录 简介 硬件手板 手板资料 作者简介 简介 今天来聊聊产品手板这个话题。 到了手板这个层面其实就属于产品设计细节了&#xff0c; 无论你对整个开发体系如何如何了解&#xff0c; 对公司管理流程如何如何精通。 最终都是要回归到业务细节中去的&#xff0c; 你可能…

非参数检测3——单输入检测系统

输入数据 各个变量之间相互独立&#xff0c;其概率分布函数为&#xff0c;均值和方差分别为 单输入系统&#xff1a;w由确定性信号s和零均,方差为σ02高斯白噪声n组成 单输入系统的H认为是简单的&#xff0c;K认为是复杂的&#xff0c;其概率分布函数分别为 其联合概率密度函数…

Go语言--复合类型之map、结构体

map Go 语言中的 map(映射、字典)是一种内置的数据结构&#xff0c;它是一个无序的 key-value 对的集合&#xff0c;比如以身份证号作为唯一键来标识一个人的信息。 格式 map [keyType]valueType 在一个 map 里所有的键都是唯一的&#xff0c;而且必须是支持和!操作符的类型…

IT高手修炼手册(4)PowerShell命令

一、前言 PowerShell是一个功能强大的命令行界面和脚本环境&#xff0c;它允许用户管理Windows操作系统和应用程序。 二、文件和目录操作 Get-ChildItem&#xff1a;列出指定路径下的文件和文件夹。简写为ls或dir。 Copy-Item&#xff1a;复制文件和文件夹。简写为copy或cp。 M…

Docker-基础

一&#xff0c;Docker简介&#xff0c;功能特性与应用场景 1.1 Docker简介 Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化&#xff0c;容器…

备考AMC8和AMC10竞赛,吃透2000以来1850道真题和解析(持续)

距离2024年AMC10竞赛还有3个多月的时间&#xff0c;距离2025年AMC8竞赛还有6个多月的时间&#xff0c;那么&#xff0c;如何备考接下来的AMC8、AMC10竞赛呢&#xff1f; 做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可…

读人工智能全传05专家系统

1. 知识就是力量 1.1. 人工智能领域此前存在的问题是过度关注搜索和解决问题这种通用法则 1.2. “弱”方法缺少一个关键的要素&#xff0c;而这一要素才是在所有智能行为中起决定性作用的组成部分&#xff1a;知识 1.3. 一种基于知识的人工智能系统&#xff1a;专家系统开始…

14-33 剑和诗人7 - 大模型语言和 DBCopilot 方法实现数据民主化

长期以来&#xff0c;数据库一直是海量信息的守护者&#xff0c;但访问这些知识历来是只有拥有专业技术技能的人才能享有的特权。这造成了巨大的知识壁垒&#xff0c;阻碍了数据访问的民主化&#xff0c;并使许多个人和组织无法获得这些存储库中包含的见解。 数据民主化的主要…