news 2026/5/4 17:53:20

0x3f 第42天 黑马点评lua脚本加阻塞队列优化秒杀以及redis数据结构常用场景 + 二分查找二维矩阵

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
0x3f 第42天 黑马点评lua脚本加阻塞队列优化秒杀以及redis数据结构常用场景 + 二分查找二维矩阵

1.搜索二维矩阵

简单的方法,排除法,从右上角往左下角找,时间复杂度m+n

class Solution: def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: m,n = len(matrix),len(matrix[0]) i,j = 0,n-1 while i<m and j >=0: if matrix[i][j]==target: return True if matrix[i][j]<target: i+=1 else: j-=1 return False

使用二分法的话,其实相当于把二维矩阵拉开变成一维的一个数组,毕竟顺序都排好了,直接二分就完事了,时间复杂度m*n

利用一个技巧:不用变成一维,先求得mid,mid在二维矩阵中的行就是 mid//n

列就是mid%n

然后lowerbound就行

class Solution: def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: m,n = len(matrix),len(matrix[0]) left,right = 0,m*n-1 while left<=right: mid = (left+right)//2 x = matrix[mid//n][mid%n] if x == target: return True elif x > target: right = mid -1 else: left = mid + 1 return False

2.有效的括号

核心思路,遍历所有的字符串,如果是( [ {,新建一个栈,存入),] }

如果不是 那就判断栈是否为空

解决的就是第一个字符串就是) ] },那肯定无效啊

接着判断是否和栈里的一样,一样就说明可以和之前的匹配上

elif not st or st.pop()!=c:拦截无匹配或者右括号和左括号不匹配的错误

但是没有拦截最终左括号多于右括号的情况

所以最后是return not st 只有st为空,匹配完毕,才说明完事

否则证明左括号还有剩余,那也是错误的

黑马点评

redission看门狗的机制不是基于trylock,而是基于lock或者ttrylock或者各种锁的leasetime,只要没有设定leasetime,自动开启看门狗机制,每隔一段时间就会去续期,解决了即使因为网络延迟错过了续期,后面还有容错机会,避免了业务还没完成,却因为固定的过期时间而释放掉锁,出现的并发错误。

看门狗的实现原理,看门狗的调度给予的是Netty的时间轮处理大量的续期任务,基于pexpire毫秒级的过期时间进行续期

今天学习了如何优化秒杀的业务场景,我们使用lua脚本+阻塞队列,这样可以使原先的串行单行的业务流程,变成异步的流程,在redis里完成用户是否有秒杀的资格的判断,再新开一个线程异步独立的完成用户下单的写操作进数据库。使用lua脚本保证原子性的看库存是否充足并查看用户id判断是否下过单,然后将消费券id和用户id封装给阻塞队列,进行下单写操作

阻塞队列有基于list的,有基于stream的,基于list的就是使用LPUSH和BLPOP模拟阻塞队列,缺点单消费者,信息丢失,基于stream可以使用xread,xread参数有count,id$,block,block=0可以实现永久阻塞,直到来新消息,count可以实现一次取多条信息,起始id$查询历史信息,读取最新消息,缺点 会丢失信息,在引入了消费者组,消费者组的原理是将多个消费者组织成一个组,共享一个消息stream,可以实现漏读,因为每个消息都会分配给至少一个消费者,负载均衡,消息会平均的分配给每个消费者,对于消费失败的消息,全部放入pending列表中,每隔一段时间会重新分配给其他消费者重试,如果还是多次失败,最后进入死信队列,交由人工处理,pending列表加上ACK确认,可以防止消息丢失

redis的数据结构,string可以实现短信登录共享session,基础版的setnx的分布式锁,还可以实现原子性的自增,用于查询网站访问量

list可以实现阻塞队列,简单的朋友圈,用户id为key,朋友圈消息为value

哈希结构可以实现redission的可重入,锁名称为key,线程唯一标识为field,可重入次数为value,购物车,用户id为key,商品id为field,商品数据为value

set可以实现秒杀这个业务场景中,用户下单的用户id存入set,因为set是不可重复的,就可以避免一人多单,set可以共同好友,共同关注,key是用户id,value是朋友id,取交集,还可以抽奖系统,把奖品放入set集合,直接pop或者srandommember

zset可以实现排行榜之类,比如步数排行榜,score是步数,value是用户id,也可以实现浏览记录时间戳是 score,用户id是key,帖子是member

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 22:54:55

5个步骤掌握全流程资产管理:Chemex的智能化追溯应用指南

5个步骤掌握全流程资产管理&#xff1a;Chemex的智能化追溯应用指南 【免费下载链接】chemex &#x1f525; 咖啡壶是一个免费、开源、高效且漂亮的资产管理平台。资产管理、归属/使用者追溯、盘点以及可靠的服务器状态管理面板。基于优雅的Laravel框架开发。 项目地址: http…

作者头像 李华
网站建设 2026/5/2 9:32:02

CAM++运行卡顿?GPU算力优化部署实战详解

CAM运行卡顿&#xff1f;GPU算力优化部署实战详解 1. 问题现场&#xff1a;为什么你的CAM总在“转圈圈” 你兴冲冲地把科哥开源的CAM说话人识别系统拉到本地&#xff0c;跑通了bash scripts/start_app.sh&#xff0c;浏览器打开http://localhost:7860——界面出来了&#xff…

作者头像 李华
网站建设 2026/5/1 9:06:24

Multisim原理图设计完整指南:高效布局布线技巧

以下是对您提供的博文内容进行深度润色与结构化重构后的专业级技术文章。全文已彻底去除AI生成痕迹&#xff0c;强化了工程师视角的实战语感、教学逻辑与行业经验沉淀&#xff1b;摒弃模板化章节标题&#xff0c;代之以自然递进、层层深入的技术叙事节奏&#xff1b;所有技术要…

作者头像 李华
网站建设 2026/4/27 21:02:20

实测分享:如何正确配置mjpg.service开机运行

实测分享&#xff1a;如何正确配置mjpg.service开机运行 在嵌入式设备或树莓派类开发板上部署视频流服务时&#xff0c;经常需要让mjpg-streamer这类工具随系统自动启动。但很多用户反馈&#xff1a;明明写了systemd服务文件&#xff0c;也执行了enable命令&#xff0c;重启后服…

作者头像 李华
网站建设 2026/5/3 18:50:20

企业级软件部署方案选型:6大维度评估矩阵

企业级软件部署方案选型&#xff1a;6大维度评估矩阵 【免费下载链接】eigent Eigent: The Worlds First Multi-agent Workforce to Unlock Your Exceptional Productivity. 项目地址: https://gitcode.com/GitHub_Trending/ei/eigent 需求定位&#xff1a;明确部署决策…

作者头像 李华
网站建设 2026/5/3 5:01:30

如何构建本地AI模型智能路由系统:零成本优化AI服务全指南

如何构建本地AI模型智能路由系统&#xff1a;零成本优化AI服务全指南 【免费下载链接】claude-code-router Use Claude Code without an Anthropics account and route it to another LLM provider 项目地址: https://gitcode.com/GitHub_Trending/cl/claude-code-router …

作者头像 李华