Redis如何实现异步消息队列?

List配合LPUSHRPOP

另外就是用 Redis 的 Pub/Sub 来实现简单的消息广播和订阅。

但是这两种方式都是不可靠的,因为没有 ACK 机制所以不能保证订阅者一定能收到消息,也不支持消息持久化。

Redis如何实现延时消息队列?

延时消息队列在实际业务中很常见,比如订单超时取消、定时提醒等场景。

可以使用ZSet有序集合,将消息作为 member,把消息的需要执行时的时间戳作为 score。

这样消息就会按照执行时间自动排序,消费者只需要定期扫描当前时间之前的消息进行处理就可以了。

具体来讲,生产者向ZSet中发送消息时计算其应该执行的时间戳,然后通过ZADD命令将消息和时间戳添加到Zset;消费者用ZREMRANGEBYSCORE命令获取当前时间戳之前的消息进行处理。

Redis支持事务吗?

Redis支持简单的事务,用MULTI开启事务,将一系列命令放入执行队列,中间可以用DISCARD取消事务队列,放弃事务执行,最后用EXEC按照先进先出的顺序执行队列里的命令。

WATCH命令用于监视一个或多个key,如果这个key在事务最后执行之前被其它命令改动,那么事务将会被放弃执行

不支持回滚,只有执行和不执行的区别,也不支持多种隔离级别

说一下Redis事务的原理? 

MULTI会将客户端打一个事务的标记,表示先把命令存到队列里,EXEC的时候再看情况执行(如果中间有DISCARD或者WATCH监控的key被其它命令修改则放弃执行事务),命令队列按照FIFO执行,由于Redis是单线程的,天然支持原子性,不会被其它命令打断 

Redis事务为什么不支持回滚?

没有类似于MySQL那样的undo log机制,设计理念是简单高效而不是完整的ACID特性,引入回滚机制会增加复杂性和性能开销

Redis事务满足原子性吗?要怎么改进? 

Redis命令执行的实际过程中虽然不会被其它命令打断,但是如果执行的过程中有报错,后续的命令仍然会执行,事务不会被回滚,不符合传统的原子性的定义。

使用Lua脚本代替事务实现报错时回滚,可以在脚本中处理整个业务逻辑,包括条件检查错误处理,保证要么执行成功,要么回滚到初始状态。

Redis事务的ACID特性如何实现?

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务在执行过程中如果某个命令失败了,其他命令还是会继续执行,不会回滚

一致性指的是,如果数据在执行事务之前是一致的,那么在事务执行之后,无论事务是否执行成功,数据也应该是一致的。但 Redis 事务并不保证一致性,因为如果事务中的某个命令失败了,其他命令仍然会执行,就会出现数据不一致的情况。

Redis 是单线程执行事务的,并且不会中断,直到执行完所有事务队列中的命令为止。因此,我认为 Redis 的事务具有隔离性的特征。

Redis 事务的持久性完全依赖于 Redis 本身的持久化机制,如果开启了 AOF,那么事务中的命令作为一个整体记录到 AOF 文件中,当然也要看 AOF 的 fsync 策略。

如果只开启了 RDB,事务中的命令可能会在下次快照前丢失。如果两个都没有开启,肯定是不满足持久性的。

有Lua脚本操作Redis的经验吗?

用Lua脚本实现过分布式锁,因为发现就算一个线程成功获取了锁,在设置过期时间的时候如果进程崩溃,由于Redis本身没有回滚机制,这个锁将永远不会被释放造成死锁。其次,Lua脚本可以实现只有加锁者才能释放锁的逻辑。

// 解锁脚本特别重要,必须验证是自己的锁才能删
private final String UNLOCK_SCRIPT = "if redis.call('GET', KEYS[1]) == ARGV[1] then " +"    return redis.call('DEL', KEYS[1]) " +"else " +"    return 0 " +"end";

Redis的管道Pipeline了解吗?

Pipeline允许客户端一次性向Redis服务器发送多个命令,不必等待一个命令执行完毕后再发送下一个。Redis服务器按照FIFO的顺序执行命令,将所有结果打包发回客户端。

什么场景下适合使用Pipeline?

需要批量插入、删除、更新数据时,或者需要执行大量相似命令的时候,比如批量加载热点数据,统计数据的批量更新、大批量数据的导入导出、批量删除过期或无效的缓存

了解过Pipeline的底层原理吗?

底层是缓冲的思想,我在RedisClient类中封装了一个PipelineAction 内部类,用来缓存命令

PipelineAction的add方法将命令封装成Runnable对象,放入List中。execute方法调用RedisTemplate的executePipeline方法开启管道模式将多个命令发送给Redis客户端。

Redis从输入缓冲区中读取到命令后,依次执行这些命令,将执行结果写入输出缓冲区,最后再将结果一次性打包返回给客户端。

Redis分布式锁如何解决锁过期问题

具体场景是,A获取到了分布式锁并设置了过期时间,但是由于执行的时间过长,任务还没执行完毕锁就被释放了,其他线程就获取到了锁,但此时如果A执行完毕,释放掉的其实是B的锁。

可以通过锁的自动续期机制来解决锁过期的问题,比如Redission的看门狗机制,后台启动一个定时任务,隔一段时间就检查锁是否还被当前线程持有,如果是则延迟锁的持有时间,这样避免了锁被提前释放

Redisson了解多少? 

Redission是基于Redis的java客户端,它不只是对Redis进行简单封装,还提供了很多分布式的数据结构和服务,比如最常用的分布式锁 

Redisson 的分布式锁比 SETNX 完善的得多,它的看门狗机制可以让我们在获取锁的时候省去手动设置过期时间的步骤,它在内部封装了一个定时任务,每隔 10 秒会检查一次,如果当前线程还持有锁就自动续期 30 秒。

另外,Redisson 还提供了分布式限流器 RRateLimiter,基于令牌桶算法实现,用于控制分布式环境下的访问频率。

详细说说Redission的看门狗机制?

Redisson 的看门狗机制是一种自动续期机制,用于解决分布式锁的过期问题。

基本原理是这样的:当调用 lock() 方法加锁时,如果没有显式设置过期时间,Redisson 会默认给锁加一个 30 秒的过期时间,同时启用一个名为“看门狗”的定时任务,每隔 10 秒(默认是过期时间的 1/3),去检查一次锁是否还被当前线程持有,如果是,就自动续期,将过期时间延长到 30 秒。

续期时,Redission Lua 脚本检查锁的 value 是否匹配当前线程,如果匹配就延长过期时间。这样就能保证只有锁的真正持有者才能续期

当调用unlock()时,看门狗任务结束,但是如果执行完任务忘记unlock了,看门狗也会自动检查锁,如果当前线程已经退出了或者锁已经不属于当前线程了,也会停止自动续期

看门狗机制中的锁检查和续期过程是原子操作吗? 

在Redis层面是原子的,通过Lua脚本实现原子的批量操作,不会被其他命令打断,hexists命令和expire操作放在同一个Lua脚本中,是不可分割的,是原子的,要么都成功,要么回滚,确保续期的一定是当前线程持有的锁

RedLock你了解多少? 

是一种分布式锁算法,用于解决单个Redis实例用作分布式锁的时候存在的单点故障问题。

通过在多个完全独立的Redis实例上同时获取锁来实现容错,只要成功的实例数量超过一半就认为获取锁成功。

RedLock能不能保证百分百上锁?

不能,由于网络分区,因为客户端不能保证和集群中所有的Redis实例建立连接,比如集群中有五个节点,但是客户端只能和两个建立连接,永远也无法成功获取半数以上的锁,从而一定失败。

如果各个 Redis 实例之间存在明显的时钟漂移,或者客户端在获取锁的过程中耗时过长,比如网络延迟、GC 停顿等,都可能会导致锁在获取完成前就过期,从而获取失败。

项目中有用到Redis分布式锁吗?

有使用到Redis分布式锁防止用户多端登陆同时大量调用人脸识别攻击操作绕过阈值检查

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89876.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89876.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/89876.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

因果语言模型、自回归语言模型、仅解码器语言模型都是同一类模型

因果语言模型、自回归语言模型、仅解码器语言模型都是同一类模型 flyfish 因果语言模型(causal Language Models) 自回归语言模型(autoregressive language models) 仅解码器语言模型(decoder-only language models&am…

jvm架构原理剖析篇

简单题(5道) 考查内容:JVM运行时数据区域 题干:Java虚拟机栈的主要作用是? A. 存储对象实例 B. 存储方法调用和局部变量 C. 存储静态字段 D. 存储字节码指令 正确答案:B 解析:虚拟机栈用于存储方…

智链万物:人工智能驱动的产业智能化革命

当生成式AI在艺术与创意领域掀起风暴,大型语言模型重塑信息交互方式时,一场更为基础、影响更为深远的变革,正在全球实体经济的根基处悄然发生并加速推进——这就是产业智能化。它并非简单的“机器换人”,而是人工智能(…

python中上下文管理器 与 try finally有什么区别

目录 主要区别代码对比何时使用哪种方式 主要区别 语法简洁性 上下文管理器使用 with 语句,语法更简洁优雅try-finally 需要显式编写异常处理代码,更冗长 代码复用性 上下文管理器可以封装为类或函数,便于在多处复用try-finally 通常需要在每…

人体属性识别+跌倒检测:儿童行为监测与安全升级

智慧幼儿园的AI智能检测盒应用实践 背景:传统园区管理的三大痛点 传统幼儿园管理长期面临三大核心挑战:一是安全监控依赖人工巡查,存在视觉盲区与响应延迟,如某连锁幼儿园曾因人工巡查疏漏,导致3起儿童跌倒事故未能及…

【ESP32-IDF笔记】09-UART配置和使用

环境配置 Visual Studio Code :版本1.98.2 ESP32:ESP32-S3 ESP-IDF:V5.4 支持型号:ESP32、ESP32-C2、ESP32-C3、ESP32-C5、ESP32-C6、ESP32-C61、ESP32-H2、ESP32-P4、 ESP32-S2、ESP32-S3 简介 通用异步接收器/发送器 (UART) …

在 .NET Core 和 React 中使用 WebSockets 和 SignalR 进行实时数据传输

对于需要即时更新和通知的应用程序来说,实时数据传输至关重要。在 .NET Core 中,WebSocket 和 SignalR 提供了强大的工具来实现客户端和服务器之间的实时通信。在本指南中,我们将探讨如何在 .NET Core 应用程序中使用 WebSocket 和 SignalR 实…

第八十六篇 大数据排序算法:从厨房整理到分布式排序的智慧

目录一、基础排序算法:生活场景中的计算智慧1.1 冒泡排序:图书馆的书籍整理1.2 插入排序:厨房调料的整理艺术二、高效排序算法:大数据处理的利器2.1 快速排序:音乐APP的智能歌单2.2 归并排序:学校成绩单的合…

开源 | V3.1.1慧知开源重卡运营充电桩平台 - 重卡运营充电桩平台管理解决方案;企业级完整代码 多租户、模拟器、多运营商、多小程序;

【开源免费版】推荐一套企业级开源充电桩平台:完整代码包含多租户、硬件模拟器、多运营商、多小程序,汽车 电动自行车、云快充协议;——(慧哥)慧知开源充电桩平台;https://liwenhui.blog.csdn.net/article/details/148242725?spm…

ONLYOFFICE 协作空间 企业版使用秘籍-8.使用虚拟数据房间,处理机密文档更安全

在当今快节奏的社会中,信息已成为极其关键的资源,因此,保护敏感数据至关重要。ONLYOFFICE 协作空间中的虚拟数据房间(VDR)提供了一个安全便捷的工作空间,确保文档受到严密保护的同时,也能实现轻…

系统架构设计师论文分享-论软件架构复用

我的软考历程 摘要 2023年2月,我所在的公司通过了研发纱线MES系统的立项,该项目为国内纱线工厂提供SAAS服务,旨在提升纱线工厂的数字化和智能化水平。我在该项目中担任架构设计师,负责该项目的架构设计工作。本文结合我在该项目…

虚拟主机与独立服务器如何选择

在搭建和维护网站时,选择合适的服务器套餐至关重要。虚拟主机和独立服务器是两种常见的选择,它们各有优缺点,适用于不同需求的用户。本文将深入探讨这两种服务器类型的特点,以帮助您为您的网站选择最合适的服务器解决方案。虚拟主…

NFC的安全技术体系

NFC(近场通信)技术因广泛应用于移动支付、身份认证、门禁控制等敏感场景,其安全技术体系是保障用户数据与交易安全的核心。该体系涵盖数据传输安全、存储安全、身份认证、防攻击机制等多个维度,通过硬件隔离、加密算法、协议规范等…

Echarts3D柱状图-圆柱体-文字在柱体上垂直显示的实现方法

全部代码 <!DOCTYPE html> <html lang"en" style"height: 100%"> <head><meta charset"utf-8"><title>3D柱状图-圆柱体-文字竖排</title> </head> <body style"height: 100%; margin: 0"…

【算法训练营Day08】字符串part2

文章目录 反转字符串里的单词右旋字符串KMP算法双指针法总结 反转字符串里的单词 题目链接&#xff1a;151. 反转字符串中的单词 双指针法解题逻辑 head指针遍历字符串遍历到单词首单词&#xff0c;生成end指针移动到单词尾部遇到完整单词收集&#xff0c;压入栈中head指针移动…

如何使用backtrace定位Linux程序的崩溃位置

在嵌入式Linux开发中&#xff0c;特别是复杂软件&#xff0c;多人协作开发时&#xff0c;当某人无意间写了一个代码bug导致程序崩溃&#xff0c;但又不知道崩溃的具体位置时&#xff0c;单纯靠走读代码&#xff0c;很难快速的定位问题。 本篇就来介绍一种方法&#xff0c;使用…

十大排序算法汇总

好的&#xff0c;下面为你整理一篇面试全覆盖、极其深入的十大排序算法总结博客&#xff0c;涵盖算法原理、复杂度、稳定性、应用场景、工程实践、C与Python实现&#xff08;含详细注释&#xff09;&#xff0c;并对比分析各种排序的优缺点与适用情境。内容力求结构清晰、讲解透…

零基础 “入坑” Java--- 七、数组(二)

文章目录 一、数组转字符串二、数组的拷贝三、求数组中元素的平均值四、查找数组中指定元素&#xff08;顺序查找&#xff09;五、数组排序&#xff08;冒泡排序&#xff09;六、查找数组中指定元素&#xff08;二分查找&#xff09;七、判断两个数组中的元素是否相等八、填充数…

【C++ 真题】P1104 生日

P1104 生日 题目描述 cjf 君想调查学校 OI 组每个同学的生日&#xff0c;并按照年龄从大到小的顺序排序。但 cjf 君最近作业很多&#xff0c;没有时间&#xff0c;所以请你帮她排序。 输入格式 输入共有 n 1 n 1 n1 行&#xff0c; 第 1 1 1 行为 OI 组总人数 n n n&…

Oracle DB和PostgreSQL,OpenGauss主外键一致性的区别

针对于unique索引在主外键上的表现&#xff0c;o和PG的行为确实不一致&#xff0c;测试样例&#xff1a;PG:测试1&#xff1a;test# CREATE TABLE gdb_editingtemplates ( objectid INTEGER NOT NULL, globalid VARCHAR(38) DEFAULT {00000000-0000-0000-0000-000000000000} …