redis数据安全(五)事务

news/2025/4/1 18:33:26/
一、概念:

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*/@Testvoid pipeLineTest() {List<Object> objects = redisTemplate.executePipelined(new SessionCallback<String>() {@Overridepublic 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.ppmy.cn/news/1327801.html

相关文章

Docker(八)高级网络配置

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 高级网络配置 注意&#xff1a;本章属于 Docker 高级配置&#xff0c;如果您是初学者&#xff0c;您可以暂时跳过本章节&#xff0c;直接学习…

MySQL面试题:知道什么是覆盖索引吗?

覆盖索引是指查询使用了索引&#xff0c;返回的列&#xff0c;必须在索引中全部能够找到。 为什么用Id查询快&#xff0c;为什么不建议用selecte* 使用id查询&#xff0c;直接走聚集索引查询&#xff0c;一次索引扫描&#xff0c;直接返回数据&#xff0c;性能高。如果返回的…

Java 8的新特性简单分享(后续有系列篇~敬请期待)

Java 8的新特性分享 Java 8是Java语言迎来的一次革命性的更新&#xff0c;引入了众多强大的新特性&#xff0c;使得Java开发变得更加现代化和便捷。在这篇博客中&#xff0c;我们将深入探讨Java 8的一些主要特性&#xff0c;并通过丰富的案例演示展示它们的用法。 1. Lambda表…

RHEL - 更新升级软件或系统

《OpenShift / RHEL / DevSecOps 汇总目录》 文章目录 小版本软件更新yum update 和 yum upgrade 的区别升级软件和升级系统检查软件包是否可升级指定升级软件使用的发行版本方法1方法2方法3方法4 查看软件升级类型更新升级指定的 RHSA/RHBA/RHEA更新升级指定的 CVE更新升级指定…

XHCMS靶场小记(熊海)

文件包含漏洞 通过url判断文件包含漏洞&#xff08;参数直接引入文件&#xff09; 发现文件包含漏洞可以先尝试php伪协议进行命令执行&#xff08;php://input或者data://text/plain&#xff09;; 发现allow_url_include参数应该没开启&#xff1b;那么寻找文件上传点上传图…

JAVA算法-查找

目录 基本查找*&#xff1a; 二分查找*&#xff1a; 数据单调递增&#xff1a; 数据单调递减&#xff1a; 总结规律&#xff1a; 插值查找*&#xff1a; 斐波那契查找&#xff08;了解原理&#xff09;&#xff1a;以后补 分块 查找*&#xff1a; 特殊 情况&#xff0…

Web server failed to start.Port xxxx was already in use.

目录 一、报错截图&#xff1a;二、解决方式 一、报错截图&#xff1a; 某端口被占用,导致出现如下报错&#xff1a; 二、解决方式 windowsR 输入cmd—>回车 如下图所示 查看被占用的端口的进程&#xff0c;如下图&#xff1a; netstat -ano |findstr 端口号结束这个进程…

对接百度API的银行卡四要素校验

正文 因为百度提供的API文档比较难懂&#xff0c;搞了一天才弄好&#xff0c; 所以记录一下正确的demo。要使用百度API&#xff0c;要先开通服务获取到 appkey和secretKey 代码 PostMapping("/validate-bank-auth")ApiOperationSupport(order 18)ApiOperation(va…