热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php和redis处理回调处理,php如何解决redis中的并发问题详解

具体问题实例有个键,假设名称为myNum,里面保存的是阿拉伯数字,假设现在值为1,存在多个连接对myNum进行操作的情况&#

3f8f77312fdda311eae553a2ae2e0e23.png

具体问题实例

有个键,假设名称为myNum,里面保存的是阿拉伯数字,假设现在值为1,存在多个连接对myNum进行操作的情况,这个时候就会有并发的问题。假设有两个连接linkA和linkB,这两个连接都执行下面的操作,取出myNum的值,+1,然后再存回去,看看下面的交互:

linkA get myNum => 1

linkB get myNum => 1

linkA set muNum => 2

linkB set myNum => 2

执行完操作之后,结果可能是2,这和我们预期的3不一致。

再看一个具体的例子:

require "vendor/autoload.php";

$client = new Predis\Client([

'scheme' => 'tcp',

'host' => '127.0.0.1',

'port' => 6379,

]);

for ($i &#61; 0; $i <1000; $i&#43;&#43;) {

$num &#61; intval($client->get("name"));

$num &#61; $num &#43; 1;

$client->setex("name", $num, 10080);

usleep(10000);

}

设置name初始值为0&#xff0c;然后同时用两个终端执行上面的程序&#xff0c;最后name的值可能不是2000&#xff0c;而是一个<2000的值&#xff0c;这也就证明了我们上面的并发问题的存在&#xff0c;这个该怎么解决呢&#xff1f;

redis中的事务

redis中也是有事务的&#xff0c;不过这个事务没有mysql中的完善&#xff0c;只保证了一致性和隔离性&#xff0c;不满足原子性和持久性。

redis事务使用multi、exec命令

原子性&#xff0c;redis会将事务中的所有命令执行一遍&#xff0c;哪怕是中间有执行失败也不会回滚。kill信号、宿主机宕机等导致事务执行失败&#xff0c;redis也不会进行重试或者回滚。

持久性&#xff0c;redis事务的持久性依赖于redis所使用的持久化模式&#xff0c;遗憾的是各种持久化模式也都不是持久化的。

隔离性&#xff0c;redis是单进程&#xff0c;开启事务之后&#xff0c;会执行完当前连接的所有命令直到遇到exec命令&#xff0c;才处理其他连接的命令。

一致性&#xff0c;看了文档&#xff0c;觉得挺扯的&#xff0c;但是貌似说的没有问题。

redis中的事务不支持原子性&#xff0c;所以解决不了上面的问题。

当然了redis还有一个watch命令&#xff0c;这个命令可以解决这个问题&#xff0c;看下面的例子&#xff0c;对一个键执行watch&#xff0c;然后执行事务&#xff0c;由于watch的存在&#xff0c;他会监测键a&#xff0c;当a被修该之后&#xff0c;后面的事务就会执行失败&#xff0c;这就确保了多个连接同时来了&#xff0c;都监测着a&#xff0c;只有一个能执行成功&#xff0c;其他都返回失败。

127.0.0.1:6379> set a 1

OK

127.0.0.1:6379> watch a

OK

127.0.0.1:6379> multi

OK

127.0.0.1:6379> incr a

QUEUED

127.0.0.1:6379> exec

1) (integer) 2

127.0.0.1:6379> get a

"2"

失败时候的例子&#xff0c;从最后可以看出&#xff0c;test的值被其他连接修改了&#xff1a;

127.0.0.1:6379> set test 1

OK

127.0.0.1:6379> watch test

OK

127.0.0.1:6379> multi

OK

127.0.0.1:6379> incrby test 11

QUEUED

127.0.0.1:6379> exec

(nil)

127.0.0.1:6379> get test

"100"

我的问题如何解决

redis中命令是满足原子性的&#xff0c;因此在值为阿拉伯数字的时候&#xff0c;我可以将get和set命令修改为incr或者incrby来解决这个问题&#xff0c;下面的代码开启两个终端同时执行&#xff0c;得到的结果是满足我们预期的2000。

require "vendor/autoload.php";

$client &#61; new Predis\Client([

&#39;scheme&#39; &#61;> &#39;tcp&#39;,

&#39;host&#39;   &#61;> &#39;127.0.0.1&#39;,

&#39;port&#39;   &#61;> 6379,

]);

for ($i &#61; 0; $i <1000; $i&#43;&#43;) {

$client->incr("name");

$client->expire("name", 10800);

usleep(10000);

}

总结

看了这么多&#xff0c;简单的总结下&#xff0c;其实redis本事是不会存在并发问题的&#xff0c;因为他是单进程的&#xff0c;再多的command都是one by one执行的。我们使用的时候&#xff0c;可能会出现并发问题&#xff0c;比如get和set这一对。

文档来源&#xff1a;http://www.cnblogs.com/iforever/p/5796902.html

fff6c98081bf8904098fb5e1bd59ff4b.gif

转载请注明来源网站:www.itxm.cn谢谢&#xff01;

分享到&#xff1a;



推荐阅读
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
  • 如何在PHP中准确获取服务器IP地址?
    如何在PHP中准确获取服务器IP地址? ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • Java能否直接通过HTTP将字节流绕过HEAP写入SD卡? ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有