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

记一次redis并发处理问题

记一次redis并发处理问题一、场景分析所在的公司是物联网公司,涉及到向设备发送指令,现在的问题是在和天猫语音对接的一个产品线上出现了一个bug启用组合指令模式,例如一个情景模式,
记一次redis并发处理问题

一、场景分析

所在的公司是物联网公司,涉及到向设备发送指令,现在的问题是在和天猫语音对接的一个产品线上出现了一个bug

启用组合指令模式,例如一个情景模式,1、开卧室灯、2开走廊灯、3开客厅灯

  • 上面的三个灯对于我们的产品来说就是一个开关面板,面板上面是一个三路开关,也就是每一个灯对应一个开关,如下图:

《记一次redis并发处理问题》

当天猫精灵一条控制指令发送过来,我在将指令发送给设备,流程图如下

《记一次redis并发处理问题》

二、流程分析

上面可以看到整个流程,包括天猫语音触发应用云到下发控制指令的过程,
那几乎可以把重点锁定在下发参数上面

1.下发二进制指令

  • 现在有三路面板 对应的是 1 1 1 二进制位,公司最多是8路开关
  • 则如上面的流程所示,当控制客厅的时候 下发参数 0 0 0 0 0 1 0 0

2.缓存机制

上面也看到了,在下发控制指令的时候会将 其他开关位的状态也带上。

  • 那么实际在控制的时候,会去查下其他开关位的状态
  • 那么这个缓存状态是由设备来更新的

到这里来看,几乎也不会出现啥问题,接下来我们就要直面真正遇到的问题

三、并发问题分析

上面的例子都是单次请求,因为同一个面板的不同开关位虽然会依赖设备更新缓存,但是单次控制占时还是没有问题的,也就是用户触发天猫控制灯的时候都是一个一个控制的

但是现在引入了场景,也就是天猫精灵上面有场景模式,例如设置场景
回家了,那么就是三路开关上所有的灯都要打开所有的灯,!而且天猫精灵是并发处理的,也就是会把三个请求同时发送到应用云上,然后应用云在下发控制指令。

问题分析

那么问题来了,三次请求之间都是有依赖关系的

  • 列如开客厅灯会查询走廊灯的状态,还有卧室灯的状态,都会去查询缓存,而三条控制指令都是同时到达,那么设备还没有更新缓存
  • 比如卧室灯(00000100) 走廊灯(00000101)已经开了,但是客厅灯最后进来,发现其他灯的缓存都是关的,那么会将0带下去((00000010)),然后导致前两次的灯开了又关。

四、优化处理方案

1.不依赖设备更新缓存,采用临时缓存

也就是不用去查询设备的缓存,直接采用临时缓存 ,时间1-2s,当并发的三个请求同时到来时,直接存储一个临时值,告诉其他请求针对要控制的面板有其他开关在控制

服务端采用的sowole进程模型
//采用hash结构,每一个案件对应一个key值,
//每一个按键的请求到来时更新hashkey时间为1s
$redis->hset("concurrent_control_hash_off".$devSn,$keynum,1);
$redis->expire("concurrent_control_hash_off".$devSn,1);
//直接从临时缓存里获取,如果没有在去设备缓存里获取
$res = $redis->hGetAll("concurrent_control_hash_off".$devSn);

  • 上诉的方法的方法在高并发下还是有问题!

2.保证单次请求的redis操作原子性

也就是当并发请求的时候每条redis指令没有顺序

$redis->multi();
$redis->hset("concurrent_control_hash_on".$devSn,$keynum,1);
$redis->expire("concurrent_control_hash_on".$devSn,1);
$redis->hGetAll("concurrent_control_hash_on".$devSn);
$res = $redis->exec();
$cOncurrentArr= $res[2];

  • @multi()
  • @exec()

保持原子操作,效果到现在为止要好了些

总结

即使上面根据流程做了多次修改,已经对接流程的修改,总之没有绝对的情况,都需要进行优化,并发测试


推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 旁路|发生_Day749.旁路缓存:Redis是如何工作的Redis 核心技术与实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Day749.旁路缓存:Redis是如何工作的-Redis核心技术与实战相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • 玩转直播系列之消息模块演进(3)
    一、背景即时消息(IM)系统是直播系统重要的组成部分,一个稳定的,有容错的,灵活的,支持高并发的消息模块是影响直播系统用户体验的重要因素。IM长连接服务在直播系统有发挥着举足轻重的 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 从相邻元素对还原数组的解题思路和代码
    本文介绍了从相邻元素对还原数组的解题思路和代码。思路是使用HashMap存放邻接关系,并找出起始点,然后依次取。代码使用了HashMap来存放起始点所在的adjacentPairs中的位置,并对重复的起始点进行处理。 ... [详细]
  • HashMap的扩容知识详解
    本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
author-avatar
丫头2502892725
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有