redis数据安全(五)事务

news2024/12/22 19:52:20
一、概念:

1、介绍:Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。

2、实现方法:在一个客户端操作的时候,把所有的指令一次性按照顺序排他的放在一个队列中,执行完了之后再让其他的客户端操作

二、基本操作:

1、开启事务:

设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中

 multi 
2、执行事务:

设定事务的结束位置,同时执行事务。与multi成对出现,成对使用。加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行。若在事务队列中存在命令性错误(类似于java编译性错误),则执行EXEC命令时,所有命令都不会执行

exec 

3、取消事务:

终止当前事务的定义,发生在multi之后,exec之前。遇到multi指令,创建队列,遇到discard指令销毁队列

discard

已经执行完毕的命令对应的数据不会自动回滚,需要在代码中实现回滚。

三、Redis事务锁:

1、问题引入:多个客户端有可能同时操作同一组数据,并且该数据一旦被操作修改后,将不适用于继续操作。

2、解决方法:在操作之前锁定要操作的数据,一旦发生变化,终止当前操作。

(1)对 key 添加监视锁,在执行exec前如果key发生了变化,终止事务执行

watch key1 [key2……] 

关系型数据库执行的锁为悲观锁,Redis的watch命令是乐观锁。

(2)取消对所有 key 的监视

unwatch

注意:

  • 一但执行 EXEC 开启事务的执行后,无论事务是否执行成功, WARCH 对变量的监控都将被取消。
  • 故当事务执行失败后,需重新执行WATCH命令对变量进行监控,并开启新的事务进行操作。
四、非事务型流水线:

使用事务的一个好处是底层的客户端会通过流水线来提高事务执行时的性能。下面看下不使用事务时使用流水线来进一步提升命令的执行性能。将标准的Redis连接替换成流水线连接,减少通信往返的次数。

以java为例,可以使用executePipelined打包执行命令,一次发送给redis服务器执行。

/**
     * 使用pipeline
     */
    @Test
    void pipeLineTest() {
        List<Object> objects = redisTemplate.executePipelined(new SessionCallback<String>() {
            @Override
            public String execute(RedisOperations operations) throws DataAccessException {
                redisTemplate.opsForList().leftPush("pipe", "k1");
                redisTemplate.opsForList().rightPush("pipe", "k2");
                redisTemplate.opsForList().leftPop("pipe");
                redisTemplate.opsForList().rightPop("pipe");
                return null;
            }
        });
        objects.stream().forEach(System.out::println);
    }

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

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

相关文章

css实现动态水波纹效果

效果如下&#xff1a; 外层容器 (shop_wrap)&#xff1a; 设置外边距 (padding) 提供一些间距和边距 圆形容器 (TheCircle)&#xff1a; 使用相对定位 (position: relative)&#xff0c;宽度和高度均为 180px&#xff0c;形成一个圆形按钮圆角半径 (border-radius) 设置为 50%&…

Linux编译器--gcc和g++使用

gcc和g使用 一、gcc/g的作用1.1 预处理1.2 编译1.3 汇编1.4 链接 二、静态库和动态库三、make/Makefile3.1 make/Makefile3.2 依赖关系和依赖方法3.3 多文件编译3.4 make原理3.5 项目清理 四、linux下的第一个小程序-进度条4.1 行缓冲区的概念4.2 \r和\n4.3 进度条代码 一、gcc…

rt-thread修改全局中断屏蔽函数,解决内核频繁关闭中断影响精密计时问题

带rtt-nano实时操作系统的小板子需要读取单总线设备&#xff0c;使用软件延时吧&#xff0c;总是由于时隙不精确&#xff0c;通信不稳定。按说不稳定情况也不频繁&#xff0c;但考虑到未来需要对上百、上千米外的单总线设备通信&#xff0c;开发的时候偷个懒&#xff0c;到应用…

Jmeter后置处理器——JSON提取器

目录 1、简介 2、使用步骤 1&#xff09;添加线程组 2&#xff09;添加http请求 3&#xff09; 添加JSON提取器 1、简介 JSON是一种简单的数据交换格式&#xff0c;允许互联网应用程序快速传输数据。JSON提取器可以从JSON格式响应数据中提取数据、简化从JSON原始数据中提取特定…

《Unix环境高级编程》第三版源代码编译报错汇总(WSL)

文章目录 Error: unable to disambiguate: -dylib (did you mean --dylib ?)undefined reference to majorerror: ‘FILE’ has no member named ‘__pad’; did you mean ‘__pad5’?error: ‘FILE’ has no member named ‘_flag’; did you mean ‘_flags’?error: ‘FIL…

AAAI 2024 | TEx-Face,5秒内按需生成照片级3D人脸

本文介绍一篇来自浙江大学ReLER实验室的工作&#xff0c;"Controllable 3D Face Generation with Conditional Style Code Diffusion"&#xff0c;目前该文已被AAAI 2024录用。 论文题目&#xff1a; Controllable 3D Face Generation with Conditional Style Code D…

(C语言)冒泡排序

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现buble_sort函数&#xff1b; void buble_sort(int arr[], int sz) {//初始化变量值&#xff1b;int i 0;//嵌套循环冒泡排序&#xff1b;//外层循环&…

adb、monkey的下载和安装

adb下载 官网网址&#xff1a;Downloads - ADB Shell 尽量不要下载最新的ADB Kits&#xff0c;因为兼容性可能不太好。 点击下载 ADB Kits 作者下载的版本是1.0.36 解压adb 到指定的目录即可。 然后把adb配置 环境变量。 检查adb是否安装成功

android 自定义八边形进度条

自定义八边形动画效果图如下 绘制步骤&#xff1a; 1.先绘制橙色底部八边形实心 2.黑色画笔绘制第二层&#xff0c;让最外层显示一条线条宽度即可 3.再用黄色画笔绘制黄色部分 4.使用渐变画笔根据当前进度绘制覆盖黄色部分 5.使用黑色画笔根据当前进度绘制刻度条 6.黑色画笔绘制…

C语言经典练习3——[NOIP2008]ISBN号码与圣诞树

前言 在学习C语言的过程中刷题是很重要的&#xff0c;俗话说眼看千遍不如手动一遍因为在真正动手去刷题的时候会暴露出更多你没有意识到的问题接下来我就为各位奉上两道我认为比较有代表性的题 1. [NOIP2008]ISBN号码 1.1 题目描述 每一本正式出版的图书都有一个ISBN号码与之对…

BKP备份寄存器读取

1.简介&#xff1a; BKP&#xff08;Backup&#xff09;备份寄存器是一种特殊的功能寄存器&#xff0c;用于存储某些设备的备份数据。这些数据通常是非常重要的&#xff0c;因此需要定期备份以防止意外丢失。 具体来说&#xff0c;BKP寄存器可以用于以下几种情况&#xff1a;…

100天精通鸿蒙从入门到跳槽——第6天:TypeScript 知识储备:类

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

保留图片原画质图片无损放大

在数字时代&#xff0c;图片的放大和缩放是常见的操作。然而&#xff0c;传统的图片放大方法往往会导致图片质量的损失&#xff0c;使得图片的细节和清晰度降低。为了解决这个问题&#xff0c;水印云推出了一项新的功能——无损放大&#xff0c;让你可以在不损失图片质量的情况…

精选100 GPTs深度解析专题

精选100 GPTs深度解析专题 背景 1月10日&#xff0c;GPT应用商店&#xff08;GPT Store&#xff09;的正式上线&#xff0c;GPT技术的应用已经呈现爆炸性增长。目前&#xff0c;市场上已经出现了超过300万种GPTs&#xff0c;应用领域涵盖图像生成、写作、效率提升、研究分析、编…

部署Sqli-labs靶场:一篇文章解析全过程

部署Sqli-labs靶场&#xff1a;一篇文章解析全过程 0x01 前言 Sqli-labs是一个在线的SQL注入练习平台&#xff0c;提供了一系列关卡供用户练习SQL注入的技巧和防范方法。在这个平台上&#xff0c;用户可以尝试注入攻击&#xff0c;并测试自己的技能和工具&#xff0c;同时也可…

python数字图像处理基础(六)——模板匹配、直方图

目录 模板匹配概念单对象模板匹配多对象模板匹配 直方图1.查找直方图2.绘制直方图3.掩膜的应用 模板匹配 概念 模板匹配和卷积原理很像&#xff0c;模板在原图像上从原点开始滑动&#xff0c;计算模板与图像被模板覆盖的地方的差别程度&#xff0c;这个差别程度的计算方法在o…

CS8370错误,这是由于使用了C# 7.3中不支持的功能

目录 背景: 第一种方法: 第二种办法: 背景: 在敲代码的时候&#xff0c;程序提示报错消息提示:CS8370错误&#xff0c;那么这是什么原因导致的&#xff0c;这是由于使用了C# 7.3中不支持的功能&#xff0c;不支持该功能&#xff0c;那就是版本太低我们就需要升级更高的版本&…

DAY03_Spring—自动装配注解模式优化XML文件

目录 1 Spring注解模式1.1 自动装配1.1.1 说明1.1.2 配置规则 1.2 注解模式1.2.1 关于注解的说明1.2.2 注解使用原理1.2.3 编辑配置文件1.2.4 属性注解 1.3 实现MVC结构的纯注解开发1.3.1 编写java代码1.3.2 编辑xml配置文件1.3.3 编写测试类1.3.4 关于注解说明1.3.5 关于Sprin…

python对自动驾驶进行模拟

使用了 Pygame 库来创建一个简单的游戏环境,模拟了一辆自动驾驶汽车在道路上行驶。汽车的位置和速度通过键盘控制&#xff0c;可以左右移动和加速减速。道路的宽度和颜色可以根据需要进行调整。 import pygame import random # 游戏窗口大小 WINDOW_WIDTH 800 WINDOW_HEIG…

3dmax中怎么在模型上开洞?

3dmaxS是Autodesk公司开发的基于PC系统的三维动画渲染和制作软件。我们可以使用它来做各种模型。那么怎么在模型上开洞呢&#xff1f;我们一起来看看吧&#xff01; 1、首先我们打开我们的3damx&#xff0c;这里面我使用的版本为3damxs2012,虽然版本可能各不相同。但是功能并没…