Redis面试合集

概念

Redis是一种key-value型非关系数据库。

特点:

1、速度快,存在于内存中,类似于HashMap,HashMap的操作和查找的时间复杂度都是O(1)

2、支持丰富的数据类型,包括字符串、哈希、列表、集合、有序集合五种数据类型。

3、支持事务,操作都是原子性的,要么都执行要么都不执行。

4、memcached所有值都是简单的字符串,Redis可以持久化数据(RDB、AOF)。

过期策略

定时过期(定时器)、惰性过期(访问时判断)、定期过期(每隔一段时间扫描)

如何保证Redis都是热点数据?(数据回收)

最近最少使用/随机/最近最少使用/更早过期时间的

持久化(RDB和AOF)

RDB:一定时间将内存数据以快照形式保存到硬盘dump.rdb。通过save参数配置快照周期。
保存成一个文件,更安全。数据量大时,启动效率更高。子进程单独进行持久化保证Redis高性能。持久化过程中发生事故数据容易丢失。

AOF:将Redis执行命令写到单独日志文件中。
数据安全。通过append追加到日志,即使服务器宕机也可通过redis-check-aof工具解决数据一致问题。AOF文件更大,恢复更慢,启动效率低。

保证Redis和MYSQL数据一致

缓存单删: 更新DB前先删除缓存,再更新库,查询缓存无数据则直接访问DB。
延时双删: 为了解决缓存单删,在高并发读情况下数据不一致问题。操作数据前,先删除缓存,接着操作DB,然后延迟一段时间,再删除缓存。

定时+增量更新: 主要是利用库里行数据的更新时间字段+定时增量查询。具体为:每次更新库里的行数据,记录当前行的更新时间;然后把更新时间做为一个索引字段(加快查询速度)

定时任务: 每隔几秒,比如5秒(自定义),把库里最近5秒钟的数据查询出来,写入缓存并记录查询结束时间。查询过程和放入缓存都是单线程不存在并发问题。每次同步成功,下次执行把结束时间作为开始时间,当前时间作为结束时间实现增量查询。

优点:架构简单、逻辑和业务解耦、依赖少,最多加个分布式定时任务或者Redis分布式锁。

监听binlog+MQ: 监听MYSQL binlog把数据库的更新插入删除操作通过MQ同步给下游消费者,下游拿到日志和业务数据再放入缓存。

优点:缓存和业务解耦,减少业务代码的侵入性。
缺点:技术和架构复杂,中间件的运维,引入MQ后带来的问题,比如数据乱序:同一条数据先发后至,后发先至到达消费者,通过redis lua+数据的时间戳比较方案,解决并发问题和数据乱序问题

redis缓存三兄弟问题

PHP+Redis分布式锁

Redis分布式锁是通过线程锁来实现,同时只允许一个线程执行,其他线程进入等待状态。

优点:降低MySQL压力,比队列的并发量高。缺点:线程需要排队等待,并发量也不是特别高。

$key = "test:lock:".$id;$uuid = Uuid::uuid1()->getHex();try {$ret = Redis::set($key, $uuid, 'EX', 10, 'NX');if (!$ret) {usleep(10);return $this->test($id);}$stock = Skill::query()->where('id', $id)->value('stock');if ($stock > 0) {Skill::query()->where('id', $id)->decrement('stock');$msg = '抢购成功';} else {$msg = '库存不足,抢购失败';}if (Redis::get($key) == $uuid) {Redis::del($key);}return $msg;} catch (\Exception $exception) {return '抢购失败';}

PHP+Redis乐观锁

Redis的乐观锁就是借助Redis事务和watch监控,采用事务打断的方式实现

优点:并没有锁定任何资源,多线程可以并行。缺点:这是PHP层面的控制,而PHP是有性能瓶颈的。

$key = 'stock:'.$id;Redis::watch($key);$stock = Redis::get($key);
if (is_null($stock)) {return '没有商品';
}
if ($stock == 0) {return '库存不足';
}
Redis::multi();Redis::decr($key);
$res = Redis::exec();
if ($res) {Skill::query()->where('id', $id)->decrement('stock');return '抢购成功';
} else {return '抢购失败';}

Nginx结合Lua做桶限流+Redis乐观锁(最优方案)

这种方案是最优方案,直接绕过应用层,在接入层实现限流和防止超卖的操作,只消耗很少的服务器性能,但是可抗并发量级特别大,性能上远超上述几种方案。

逻辑分析:先使用 Nginx+Lua 漏桶算法过滤掉大部分请求,再使用Lua连接Redis,使用Redis乐观锁的方式控制库存。假设只有10个秒杀商品,那这里只保留10个请求进入应用层(PHP和MysqL),应用层不需要进行其他操作,直接操作数据库就可以。

项目应用

1、ERP的商品报表模块,API接口处理好数据,序列化成字符串后给定过期时间存储到Redis中。

2、序列号生成器,我们又很多单号,像订单、生产、调拨,但需求层面要求我们的订单尾号按照顺序来,我们生成器中会根据类别将对应序列号hash进行自增。

3、订单提取模块,

持续更新,未完待续~

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

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

相关文章

解锁跨境电商新边界:Temu API接口深度解析引言

引言 在竞争激烈的跨境电商领域,高效、精准的数据获取成为商家制胜的关键。Temu(拼多多跨境电商)作为行业内的新秀,其API接口服务为商家提供了强大的数据交互能力,尤其是其获取商品详情的核心功能,更是为商…

Python 文件操作

文件编码 将文件的内容翻译为二进制 文件操作 打开文件 open函数 语法: open(name, mode, encoding)name:文件名的字符串,可以包含具体路径。若没有路径,则默认为与py文件位于同一层 mode:打开文件的模式&#xf…

新质生产力最新测算(Shp/dta/xcel格式,2012-2022年)

数据简介:参考学者蔡湘杰、贺正楚的做法、我们通过收集数据构建了如下所示的衡量新质生产力的指标体系,但部分数据由于收集难度以及未公布等问题,部分数据有缺少,下面展示了部分原始数据,便于大家进行分析。 数据来源…

sql 的 update操作

sqlserver:在SQL Server中,你的UPDATE语句的语法需要稍微调整一下。你不能直接在SET子句之后立即跟INNER JOIN。正确的语法是将JOIN操作放在UPDATE和SET之间。以下是正确的写法: UPDATE test_item SET test_item.s1no subcontractor.s1no FROM test_it…

【PYG】简单分析Planetoid()中存储Cora数据集边的数量

文章目录 这得分析cora.cites原始文件步骤示例代码输出解释分析 chagpt生成的第一个版本答案,打印数据集的部分可以看下输出解释进一步验证总结 chatgpt生成的第二个版本答案检查 Cora 数据集的边输出解释检查边的方向性解释进一步优化运行结果解释 chagpt生成的第三…

RedHat9 | 内部YUM本地源服务器搭建

服务器参数 标识公司内部YUM服务器主机名yum-server网络信息192.168.37.1/24网络属性静态地址主要操作用户root 一、基础环境信息配置 修改主机名 [rootyum-server ~]# hostnamectl hostname yum-server添加网络信息 [rootyum-server ~]# nmcli connection modify ens160 …

mac 安装cnpm 淘宝镜像记录

mac 安装cnpm 淘宝镜像记录 本文介绍了在安装cnpm时遇到权限问题的解决方案,包括使用sudo,处理SSL证书过期,以及因版本不一致导致的错误处理方法,步骤包括设置npm配置、卸载和重新安装cnpm到特定版本。 安装 npm install cnpm …

Ansible 最佳实践:现代 IT 运维的利器

Ansible 最佳实践:现代 IT 运维的利器 Ansible 是一种开源的 IT 自动化工具,通过 SSH 协议实现远程节点和管理节点之间的通信,适用于配置管理、应用程序部署、任务自动化等多个场景。本文将介绍 Ansible 的基本架构、主要功能以及最佳实践&a…

免费开源的后端API服务-supabase安装和使用-简直是前端学习者福音

文章目录 它是什么安装和部署关于安装关于部署1、注册用户2、创建组织3、创建项目 创建数据库表(填充内容)填充数据库表 使用postman联调API 它是什么 一个开源免费的后端框架,firebase的替代品。可以简单理解类似于headless cms&#xff0c…

8605 删数问题

这是一个典型的贪心算法问题。我们可以从高位开始,找到第一个比后面数字大的数字,删除它,然后继续这个过程,直到删除k个数字。如果我们已经删除了k个数字,但是还没有找到一个比后面数字大的数字,那么我们就…

【多模态LLM】以ViT进行视觉表征的多模态模型1(BLIP-2、InstructBLIP)

note CLIP和BLIP的区别: CLIP:通过对比学习联合训练,预测图像和文本之间的匹配关系。即使用双塔结构,分别对图像和文本编码,然后通过计算cos进行图文匹配。BLIP:包括两个单模态编码器(图像编码…

[Day 21] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的智能合約運行機制 區塊鏈技術自比特幣誕生以來,便以其去中心化、安全性和透明性等特點引起了廣泛的關注和應用。而智能合約作為區塊鏈技術的一大創新,進一步擴展了區塊鏈的應用場景,使其不僅僅局限於數字貨幣,還可以應用…

Netty EventLoopGroup 详解:Nio、Epoll、Poll 、KQueue和IoUring

Netty EventLoopGroup 详解:Nio、Epoll、Poll 、KQueue和IoUring 概述 Netty 是一个高性能的网络通信框架,它使用 EventLoopGroup 来处理 I/O 事件(学习更多请参考:深入探索Netty的事件驱动模型与实现原理)。不同的 EventLoopGroup 实现针对…

springboot项目加载外部配置文件

springboot项目一般使用application.yml配置文件,数据库信息写在里面,做部署时,各个项目可能密码要求不一样需要修改密码,每次修改密码都要打包就比较麻烦,可以增加个外部配置文件进行处理,具体如下&#x…

javascript 常见设计模式

什么是设计模式? 在软件开发中,设计模式是解决特定问题的经验总结和可复用的解决方案。设计模式可以提高代码的复用性、可维护性和可读性,是提高开发效率的重要手段。 单例模式 1.概念 单例模式 (Singleton Pattern)&#xf…

深入理解二分法

前言 二分法(Binary Search)是一种高效的查找算法,广泛应用于计算机科学和工程领域。它用于在有序数组中查找特定元素,其时间复杂度为 O(log n),显著优于线性搜索的 O(n)。本文将深入介绍二分法的原理、实现及其应用场…

单片机语音识别控制蓝牙通信

基于单片机语音识别控制&蓝牙控制 1、Arduino单片机语音控制1.1 直连1.2 蓝牙无线连接1.3 部分核心程序1.4 实物演示 2、51单片机语音控制2.1 直连2.2 蓝牙无线连接2.3 部分核心程序2.4 实物演示 3、STM32单片机语音控制3.1 直连3.2 蓝牙无线连接3.3 部分核心程序3.4 实物演…

器件频频更换为哪桩

曾想象,在一家大型研发型企业里有如下案例: 硬件工程师设计电路选择了器件库中的某器件,在批量试产产品时,却发现没有库存,即时申请采购,却发现货期相当长,一时难以采购,甚至根本不…

填志愿选专业,文科男生如何选专业?

又到了高考分数出炉,无数学子收获喜悦的季节,在分数刚出炉时,很多学生表现的异常兴奋,于他们而言,这么多年的努力终于有了收获,自己该考虑选择什么专业了。而毫不夸张的说,很多人在拿到专业目录…

HarmonyOS开发探索:使用Snapshot Insight分析ArkTS内存问题

识别内存问题 当怀疑应用存在内存问题的时候,首先使用DevEco Profiler的Allocation Insight来度量内存在问题场景下的大小变化以及整体趋势,初步定界问题出现的位置(Native Heap/ArkTS Heap/dev等)。 在初步识别内存问题出现的位置…