Redis的事务操作的命令与执行操作(代码)

本篇文章给大家带来的内容是关于redis的事务操作的命令与执行操作(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

本文主要研究一下redis的事务操作

命令

multi与exec

命令行

码哩写作 码哩写作

最懂作者的AI辅助创作工具

码哩写作 60 查看详情 码哩写作

127.0.0.1:6379> multiOK127.0.0.1:6379> incr totalQUEUED127.0.0.1:6379> incr lenQUEUED127.0.0.1:6379> exec1) (integer) 22) (integer) 2127.0.0.1:6379> get total"2"127.0.0.1:6379> get len"2"

lettuce实例

    @Test    public void testMultiExec(){        RedisClient client = RedisClient.create("redis://192.168.99.100:6379/0");        StatefulRedisConnection connection = client.connect();        RedisCommands syncCommands = connection.sync();        syncCommands.set("hello","1");        syncCommands.set("world","2");        syncCommands.multi();        syncCommands.incr("hello");        syncCommands.incr("world");        //DefaultTransactionResult[wasRolledBack=false,result=[1, 2, 1, 3, 1]]        TransactionResult transactionResult = syncCommands.exec();        System.out.println(transactionResult);        System.out.println(syncCommands.get("hello"));        System.out.println(syncCommands.get("world"));    }

部分执行

命令行

127.0.0.1:6379> multiOK127.0.0.1:6379> set a helloQUEUED127.0.0.1:6379> set b worldQUEUED127.0.0.1:6379> incr aQUEUED127.0.0.1:6379> set c partQUEUED127.0.0.1:6379> exec1) OK2) OK3) (error) ERR value is not an integer or out of range4) OK127.0.0.1:6379> get a"hello"127.0.0.1:6379> get b"world"127.0.0.1:6379> get c"part"

lettuce实例

    @Test    public void testMultiExecError(){        RedisClient client = RedisClient.create("redis://192.168.99.100:6379/0");        StatefulRedisConnection connection = client.connect();        RedisCommands syncCommands = connection.sync();        syncCommands.multi();        syncCommands.set("a","hello");        syncCommands.set("b","world");        syncCommands.incr("a");        syncCommands.set("c","part");        //DefaultTransactionResult[wasRolledBack=false,result=[OK, OK, io.lettuce.core.RedisCommandExecutionException: ERR value is not an integer or out of range, OK, 1]]        TransactionResult transactionResult = syncCommands.exec();        System.out.println(transactionResult);        System.out.println(syncCommands.get("a"));        System.out.println(syncCommands.get("b"));        System.out.println(syncCommands.get("c"));    }

multi与discard

命令行

127.0.0.1:6379> set sum 1OK127.0.0.1:6379> multiOK127.0.0.1:6379> incr sumQUEUED127.0.0.1:6379> discardOK127.0.0.1:6379> get sum"1"

lettuce实例

    @Test    public void testMultiDiscard(){        RedisClient client = RedisClient.create("redis://192.168.99.100:6379/0");        StatefulRedisConnection connection = client.connect();        RedisCommands syncCommands = connection.sync();        syncCommands.incr("key1");        syncCommands.multi();        syncCommands.incr("key1");        //需要有multi才可以执行discard,成功返回OK        String result = syncCommands.discard();        System.out.println(result);        System.out.println(syncCommands.get("key1"));    }

check and set

    @Test    public void testWatch(){        RedisClient client = RedisClient.create("redis://192.168.99.100:6379/0");        StatefulRedisConnection connection = client.connect();        RedisCommands syncCommands = connection.sync();        String key = "key";        syncCommands.watch(key);        //another connection        StatefulRedisConnection conn2 = client.connect();        RedisCommands syncCommands2 = conn2.sync();        syncCommands2.set(key, "a");        syncCommands.multi();        syncCommands.append(key, "b");        //DefaultTransactionResult [wasRolledBack=true, responses=0]        TransactionResult transactionResult = syncCommands.exec();        System.out.println(transactionResult);        System.out.println(syncCommands.get(key));    }

小结

reids提供multi exec/discard指令,类似open commit/rollback transaction,不过exec遇到类型操作等错误时不会滚,该成功执行的命令还是成功执行,该失败的还是失败

multi exec保证的是,只要exec命令有执行成功,则事务中一系列的命令都能执行,如果exec因为网络等问题,server端没有接收到,则事务中的一系列命令都不会被执行

discard需要在有调用multi的前提下才能使用,该命令会清空事务队列等待执行的命令

redis提供watch指令,可以配合multi exec来使用,可以实现类似数据库的乐观锁的机制,一旦watch的key被其他client有更新,则整个exec操作失败

以上就是Redis的事务操作的命令与执行操作(代码)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/381624.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月6日 11:32:44
下一篇 2025年11月6日 11:36:33

相关推荐

  • PHP初学者如何连接Redis数据库?

    如何使用 php 连接到 redis 对于初学者来说,使用 redis 可能令人望而生畏,但是可以通过循序渐进的方法轻松实现。下面将详细介绍使用 php 连接到 redis 的步骤。 首先,需要安装 php redis 扩展。可以在 php 文档中找到详细的安装说明。 安装完成后,可以使用 pred…

    2025年12月10日
    000
  • 新浪微博关注功能:如何高效存储海量关注关系?

    求指导:类似新浪微博关注功能的数据存储实现方案 关系型数据库对于海量数据的处理能力存在局限性,因此对于社交媒体中常见的关注功能,推荐使用NoSQL 数据库进行存储和管理。 一种可行的方案是使用 Redis 中的 zset 或 set 数据结构。 Zset 可以基于排序值来存储关注关系,而 set 则…

    2025年12月10日
    000
  • ## 使用 Workerman 和 Predis 连接 Redis 出现断开问题如何解决?

    php workerman 使用predis 在命令运行一段时间后就断开了 问题描述:使用 php workerman 结合 predis 操作 redis 服务时,一段时间后出现断开的错误:error while reading line from the server。运行的进程也终止。 代码段…

    2025年12月10日
    000
  • PHP函数缓存的未来发展趋势

    PHP 函数缓存的未来发展趋势 随着 PHP 应用的规模和复杂性的不断增长,函数缓存已成为提高性能的关键技术。本文将探讨 PHP 函数缓存的未来发展趋势,并提供一个实战案例。 趋势 1:对 JIT 编译的支持 JIT(即时编译)是一种编译技术,可以在运行时将 PHP 代码编译成机器代码。这可以显著提…

    2025年12月10日
    000
  • 探索 PHP 函数在高并发场景中的应用和优化

    在高并发场景中优化 php 函数的应用:使用缓存:存储频繁执行函数的结果以避免重复执行。多进程/多线程:并行执行耗时函数,以提高处理能力。减少函数调用次数:合并相似函数调用或使用循环替代嵌套函数调用。避免递归:尽可能使用循环替代递归调用,以节省堆栈空间。利用 php 扩展:启用 opcache 或 …

    2025年12月10日
    000
  • PHP函数面试必备知识点,解析缓存函数的性能优化

    php 缓存函数性能优化技巧包括:减少命中时间(批量读写、大块缓存、哈希索引);优化配置(调整大小、超时、持久性);使用键空间分片;监控使用率(淘汰预加载、动态调整大小);通过 cacheable() 扩展实现缓存优化。 解析缓存函数的性能优化 概述 在 PHP 应用中,缓存函数至关重要,用于存储频…

    2025年12月10日
    000
  • PHP函数云原生优化

    通过云原生优化 php 函数的方法:使用无服务器函数: 提升可扩展性和成本效益。优化代码结构: 微服务架构和容器化部署。分布式缓存: 提高数据访问速度。面向消息的架构: 实现异步处理。云原生工具: 自动部署、弹性伸缩和故障监控。实战案例:无服务器函数优化文件上传: 无需服务器管理,自动伸缩,解放开发…

    2025年12月10日
    000
  • 如何优化php函数中的网络请求?

    如何优化 php 函数中的网络请求?缓存响应,避免重复请求,如使用 memcached 或 redis。使用并发请求,如通过 curl 或 guzzle 执行,显著提高性能。优化网络设置,如调整超时值、启用压缩和使用 cdn。使用异步请求,不阻塞脚本,处理大量请求时效率高。 如何优化 PHP 函数中…

    2025年12月10日
    000
  • 如何使用 PHP 函数和 C 扩展进行高效的数据交换?

    在 php 中高效数据交换:php 内置函数:json_encode() 和 json_decode():序列化和反序列化为 json。serialize() 和 unserialize():序列化和反序列化为二进制流(仅限同一服务器)。base64_encode() 和 base64_decode…

    2025年12月10日
    000
  • 提升 PHP 函数在高并发下的稳定性

    提升 php 函数在高并发下的稳定性可以通过:1、缓存计算结果;2、限制并发请求;3、异步执行任务;4、使用 cdn 托管静态内容;5、优化代码性能。 提升 PHP 函数在高并发下的稳定性 问题背景 PHP 作为一种解释性语言,在高并发环境下可能会遇到性能问题和稳定性问题。尤其是当某个函数被频繁调用…

    2025年12月10日
    000
  • 优化 PHP 函数性能的最佳实践

    优化 php 函数性能的最佳实践包括:避免不必要的变量分配;使用类型提示;使用内置函数;缓存结果;减少数据库查询。例如,通过应用这些技术,我们显著提高了数组排序函数的性能。 优化 PHP 函数性能的最佳实践 1. 避免不必要的变量分配 使用 & 引用运算符代替函数参数来避免不必要的变量分配,…

    2025年12月10日
    000
  • PHP怎么配置缓存_PHP各种缓存配置教程

    PHP的缓存配置,本质上是为了让你的应用跑得更快,更稳定。它不是一个单一的技术,而是一套组合拳,涵盖了从PHP代码本身到数据存储的多个层面。核心观点在于,通过减少重复计算、重复查询或重复加载,来节省资源和时间。常见的手段包括利用操作码缓存(如OpCache)加速脚本执行,以及使用数据缓存(如Redi…

    2025年12月10日
    000
  • PHP怎么迁移环境_PHP环境迁移与部署教程

    迁移PHP环境需先备份文件、数据库和配置,再部署新环境并保持PHP版本与扩展一致,随后迁移代码、数据库及配置文件,完成DNS解析后全面测试功能并监控运行状态;选择PHP版本时应评估代码兼容性,优先考虑稳定性和长期支持,迁移后通过OPcache、CDN、数据库优化、缓存、HTTP/2和Gzip压缩等手…

    2025年12月10日
    000
  • php如何实现多进程编程?PHP多进程编程基础与实践

    PHP多进程编程主要依赖PCNT扩展,通过pcntl_fork()创建子进程实现并行处理,父进程需用pcntl_waitpid()回收子进程避免僵尸进程,结合信号处理可提升健壮性;实际项目中常用消息队列或Swoole等替代方案以增强扩展性与跨平台支持。 PHP实现多进程编程主要依赖PCNT(Proc…

    2025年12月10日
    000
  • PHP怎么锁定文件_PHP文件锁定机制与使用方法

    文件锁定通过flock()函数实现,用于解决PHP并发操作文件时的数据一致性问题。首先使用fopen()打开文件,再调用flock($handle, LOCK_EX)获取独占锁以阻止其他进程读写,或用LOCK_SH加共享锁允许多进程读取但禁止写入,操作完成后需调用flock($handle, LOC…

    2025年12月10日
    000
  • php如何实现一个简单的REST API?php构建RESTful API基础教程

    核心是通过PHP处理HTTP请求并返回JSON响应。需设计URI、选择HTTP方法、实现路由与数据处理。示例中根据GET请求返回用户信息,支持单个或全部用户查询,并返回对应状态码。POST请求通过解析php://input获取JSON数据,验证后创建新用户并返回201状态码。安全方面需过滤输入防止注…

    2025年12月10日
    000
  • php如何将数据写入文件?php文件写入操作教程

    答案:PHP写入文件需使用fopen()、fwrite()、fclose()函数,注意权限、模式选择及错误处理。通过flock()避免并发问题,优化性能可合并写入、用缓冲、异步处理等。 PHP将数据写入文件,核心在于使用文件操作函数,例如 fopen() 、 fwrite() 、 fclose() …

    2025年12月10日
    000
  • PHP怎么配置队列_PHP消息队列环境搭建

    答案:PHP配置队列需选择消息中间件如RabbitMQ,安装php-amqplib扩展,编写生产者发送持久化消息、消费者通过ACK机制可靠处理任务,并利用RabbitMQ Management Plugin监控队列状态。 PHP配置队列,简单来说,就是让你的PHP程序能够异步处理一些耗时的任务,比如…

    2025年12月10日
    000
  • Laravel Redis队列任务清理指南:兼顾旧版本与Laravel 8+

    本文详细介绍了在Laravel应用中清空Redis队列任务的方法。对于Laravel 8及更高版本,可使用内置的php artisan queue:clear命令;而对于Laravel 8之前的版本,则需通过创建自定义Artisan命令来直接操作Redis键,实现队列任务的快速清理,尤其适用于开发环…

    2025年12月10日
    000
  • php如何实现定时任务_php实现计划任务的方法

    答案:PHP定时任务依赖系统调度工具如Cron或任务计划程序,通过绝对路径调用PHP解释器执行脚本,并重定向输出以避免日志堆积;为防止并发执行,可使用文件锁flock()机制;在复杂场景下,推荐结合消息队列(如RabbitMQ、Redis)与消费者进程实现解耦和高并发处理,利用Laravel Sch…

    2025年12月10日
    000

发表回复

登录后才能评论
关注微信