面试官:聊聊Redis有哪些特性,不要慌,把你知道的都告诉他

Redis高级特性RDB、AOF、事务、Stream、Pipeline和Lua脚本 和MySQL一样,Redis也有相应的慢查询统计,Redis的慢查询统计的是步骤3的耗时。Redis提供了一个配置参数来设置慢查询的阈值,默认是10毫秒。其中1+4称为 Round Trip Time (RTT,往返时间),也就是数据在网络上传输的 时间。 Redis提供了批量操作命令(例如 mget、mset等),有效地节约 RTT。但大部分命令是不支持批量操作的,需要消耗n次RTT。 Pipeline(流水线)机制能改善上面这类问题,它能将一组Redis命令进行组装,通过传输给Redis,再将这组Re 阅读详情

图片

说说Redis有哪些特性


[宫粽号:堆栈future]


1. Redis简介

Redis是一款基于ANSI C语言编写的,BSD许可的key-value存储组件,它的所有数据结构都存在内存中,可以用作缓存、数据库和消息中间件。

Redis是Remote dictionary server的缩写,即远程字典服务,一个Redis实例可以有多个存储数据的字典,客户端可以通过select来选择字典即DB进行数据存储。

也就是我们常见的16个DB,每个DB是一个数据字典。

2. Redis 特性

图片一图胜千言。

同为K-V存储组件,Memcached只能支持二进制字节块这一种数据类型。而Redis的数据类型却丰富的多,它具有8种核心数据类型,每种数据类型都有一系列操作指令对应。Redis 性能很高,单线程压测可以达到10~11w的QPS。

虽然Redis所有数据的读写操作,都在内存中进行,但也可以将所有数据进行落盘做持久化。Redis提供了2种持久化方式。

  • 快照方式,将某时刻所有数据都写入硬盘的RDB文件;

  • 追加文件方式,即将所有写命令都以追加的方式写入硬盘的AOF文件中。

线上Redis一般会同时使用两种方式,通过开启appendonly及关联配置项,将写命令及时追加到AOF文件,同时在每日流量低峰时,通过bgsave(后台处理)保存当时所有内存数据快照。

对于互联网系统的线上流量,读写占比遵循8:2定律,读占80%左右。大量的读请求,通常会远超Redis的可承载范围。此时,可以使用Redis的复制特性,让一个Redis实例作为master,然后通过复制挂载多个不断同步更新的副本,即多个slave。通过读写分离,把所有写操作落在Redis的master,所有读操作随机落在Redis的多个slave中,从而大幅提升Redis的读写能力。图片

Lua是一个高效、简洁、易扩展的脚本语言,可以方便的嵌入其他语言中使用。Redis自 2.6版本开始支持Lua。通过支持client端自定义的Lua脚本,Redis可以减少网络开销,提升处理性能,还可以把脚本中的多个操作作为一个整体来操作,实现原子性更新。

Redis还支持事务,在multi指令后,指定多个操作,然后通过exec指令一次性执行,中途如果出现异常,则不执行所有命令操作,否则,按顺序一次性执行所有操作,执行过程中不会执行任何其他指令。但是也有缺点就是命令在exec之前没有错误,exec之后发现错误,这样已经执行成功的命令没办法回滚了,这也是Redis事务比较鸡肋的一点。

Redis还支持Cluster特性,可以通过自动或手动方式,将所有key按哈希分散到不同节点,在容量不足时,还可以通过Redis的迁移指令,把其中一部分key迁移到其他节点。

作为缓存组件,Redis的最大优势是支持丰富的数据类型。目前,Redis支持8种核心数据类型,包括string、list、set、sorted set、hash、bitmap、geo、hyperloglog。

Redis的所有内存数据结构都存在全局的dict 字典中。Redis的dict也有2个哈希表,插入新key时,一般用0号哈希表,随着key的插入或删除,当0号哈希表的keys数大于哈希表桶数,或keys数小于哈希桶的1/10时,就对hash表进行扩缩容。dict中,哈希表解决冲突的方式是使用桶内单链表,来指向多个hash相同的key/value数据。

Redis一般被看作单进程/单线程组件,因为 Redis的网络IO和命令处理,都在核心进程中由单线程处理。Redis基于Epoll事件模型开发,可以进行非阻塞网络IO,同时由于单线程命令处理,整个处理过程不存在竞争,不需要加锁,没有上下文切换开销,所有数据操作都是在内存中操作,所以Redis的性能很高,单个实例即可以达到10w级的QPS。核心线程除了负责网络IO及命令处理外,还负责写数据到缓冲,以方便将最新写操作同步到AOF、slave。

除了主进程,Redis还会fork一个子进程,来进行重负荷任务的处理。Redis fork子进程主要有3种场景。

  • 收到bgrewriteaof命令时,Redis调用fork,构建一个子进程,子进程往临时AOF文件中,写入重建数据库状态的所有命令,当写入完毕,子进程则通知父进程,父进程把新增的写操作也追加到临时AOF文件,然后将临时文件替换老的AOF文件,并重命名。

  • 收到bgsave命令时,Redis构建子进程,子进程将内存中的所有数据通过快照做一次持久化落地,写入到RDB中。

  • 当需要进行全量复制时,master也会启动一个子进程,子进程将数据库快照保存到RDB文件,在写完RDB快照文件后,master就会把RDB发给slave,同时将后续新的写指令都同步给slave。

图片主进程中,除了主线程处理网络IO和命令操作外,还有3个辅助BIO线程(bio系统)。这3个BIO线程分别负责处理:文件关闭、AOF缓冲数据刷新到磁盘,以及清理对象这三个任务队列。

Redis在启动时,会同时启动这三个BIO线程,然后BIO线程休眠等待任务。当需要执行相关类型的后台任务时,就会构建一个bio_job结构,记录任务参数,然后将bio_job追加到任务队列尾部。然后唤醒BIO线程,即可进行任务执行。

3. 小结

Redis的几种高级特性:主从复制、支持lua脚本、支持简单事务,支持集群模式、支持丰富的数据结构、完全基于内存和高性能处理IO。

这几种特性大家都应该去了解,了解完他们之后你会发现Redis也就那么回事,起码面试难不倒你了。

堆栈future

使很多处于迷茫阶段的coder能从这里找到光明,堆栈创世,功在当代,利在千秋

124篇原创内容

图片

Redis高级特性 发布/订阅模式是一种消息通信模式,允许一个或多个发布者将消息发送到一个或多个订阅者。Redis提供简单的事务功能,可以确保一组命令按顺序执行,具有原子性。Redis支持Lua脚本,可以将多个命令封装在一个脚本中执行,确保原子性和高效性。Redis提供两种持久化方式:RDB快照和AOF日志。RDB (Redis Database)快照:在指定时间间隔保存数据快照。AOF (Append Only File)日志:记录每次写操作,重启时重放日志。 阅读详情

相关推荐

阿里面试官:来手写一下Redis的LRU算法 我当场懵了

三个大腹便便,穿着格子衬衣的中年男子,拿着三个满是划痕的mac向你走来,看着快秃顶的头发,心想着肯定是尼玛顶级架构师吧! 小伙子你好,之前问过了你基础知识以及一些缓存的常见几个大问题了,那你能跟我聊聊为啥Redis那么快么? 哦,帅气迷人的面试官您好,我们可以先看一下关系型数据库跟Redis本质上的区别。 Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提...

qianlia的博客 1366

Redis高级特性完整总结

Redis高级特性总结,redis的一些特殊用法

qq_40905284的博客 342

《吊打面试官》系列-Redis哨兵、持久化、主从、手撕LRU

前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。作为一个在互联网公司面一次拿一次offer的面霸(请允许我使用一下夸张的修辞手法),打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚,在一个寂寞难耐的夜晚,我痛定思痛,决定开始写《吊打面试官》系列,希望能帮助各位读者以后面试势如破竹,对面试官...

weixin_45127309的博客 6052

Redis的高级特性

发布/订阅(publish/subscribe)是一种消息通信模式,redis客户端订阅redis服务器上的一个或多个channel(管道、频道),客户端发布消息到redis服务器中的某个channel后,redis服务器会将消息推送给所有订阅了此channel的redis客户端。redis的事务只是把多个命令打包,放在一个队列中执行,只是保证了事务中指令的串行执行,并没有给事务添加原子性的保障机制,redis的事务具有隔离性但不具备原子性,执行失败时不会回滚。和Bitmap一样,不精确、有一定的错误率。

chy-x 的博客 979

面试官:如何用 Redis 实现分布式锁?

今天跟大家聊聊两个问题如何用Redis实现分布式锁?Redis是如何解决集群情况下分布式锁的可靠性问题的?

m0_71777195的博客 554

谢飞机的Java面试奇遇记:从HashMap到Redis的搞笑面试之旅

面试官:你好,谢飞机,欢迎来参加我们的Java开发岗位面试。我们今天会围绕Java核心技术、JUC、JVM、多线程、线程池、HashMap、ArrayList、Spring、SpringBoot、MyBatis、Dubbo、RabbitMQ、xxl-job、Redis、MySQL、Linux、Docker、设计模式、DDD等内容进行提问。准备好了吗?谢飞机:准备好了,大不了回家等通知!

weixin_45980106的博客 779

Redis 详解及高级特性

Redis 是一个基于内存的高性能键值数据库,它支持多种数据结构,包括字符串、列表、集合、有序集合和哈希表等。Redis 将数据存储在内存中,因此拥有非常高的读取和写入性能,适用于需要快速读取和写入数据的应用程序场景。同时,Redis 还支持持久化存储和数据复制等功能,更加适合在生产环境中使用。

兴趣是最好的老师,勤能补拙 1672

逆向工程师必备:用MDL绕过游戏保护读取内存数据的完整流程(附POC代码)

本文深入探讨了内核级内存访问技术,重点介绍了如何利用MDL(Memory Descriptor List)机制稳定、隐蔽地绕过游戏反作弊系统读取进程内存。通过对比MmCopyVirtualMemory等方法的优劣,提供了完整的MDL映射实战代码与反检测策略,为逆向工程师在内核态进行安全内存操作提供了专业指导。

weixin_29227425的博客 623

面试官看我简历写精通redis,让我聊聊sds是什么?

面试被问redis sds,直接挂了…

敖丙 1万+

K-L展开 (Karhunen-Loeve expansion)

K-L变换

susan_wang1的博客 2万+

工业焊缝缺陷检测实战:我用PatchCore在自建数据集上踩过的那些坑

本文详细介绍了PatchCore算法在工业焊缝缺陷检测中的实战应用,包括数据准备、模型调参和阈值优化等关键环节。通过分析焊缝图像的特殊性和anomaly detection技术的优化策略,分享了在自建数据集上提升检测精度的实用经验,为工业质检领域提供有价值的参考方案。

weixin_42624889的博客 397

贝壳面试官:Redis为什么这么快?过来,我们聊聊!

极简设计:单线程也能顶万线程精妙结构:数据结构就是生产力智能管理:每一个字节都物尽其用Redis不是因为单线程才快,而是因为它把简单的事情做到了极致。看完这篇面试对话,相信你对Redis的性能特点有了更深入的理解。不知道你是否也遇到过类似的面试题?你在面试中遇到过哪些关于Redis的问题?你觉得还有哪些Redis性能相关的知识点值得补充?你在实际工作中是如何优化Redis性能的?

xujunson的博客 951

RK3576平台Buildroot嵌入式Linux镜像构建实战

嵌入式Linux镜像构建是连接硬件能力与软件功能的核心技术环节,其本质是基于目标SoC架构的交叉编译、内核定制与根文件系统集成过程。原理上依赖工具链适配、设备树绑定、分区镜像生成等关键步骤,技术价值在于实现轻量、确定、可复现的系统交付。典型应用场景涵盖ARM64开发板(如RK3576)、工业边缘网关及国产化信创终端。本文以TaishanPi-3为载体,深入解析Buildroot在RK3576平台上的配置裁剪、并行编译优化、genimage分区合成及update.img烧录准备,覆盖从环境选型(Ubuntu

weixin_36047538的博客 139

Java大厂面试实战:严肃面试官与搞笑程序员的面试记 - Java SE, Spring Boot, Redis, Spring Cloud技术栈

Java 8引入的Lambda表达式可以简化函数式编程,Stream API提供了丰富的操作集合的API,新的日期时间API(java.time包)更加灵活和易用,Optional类用于处理null值,避免NullPointerException。String用于存储字符串,List用于存储列表,Set用于存储集合,Hash用于存储哈希表,ZSet用于存储有序集合。Hystrix的断路器会监控服务调用的失败率,当失败率达到一定阈值时,断路器会自动切换到打开状态,后续的请求会立即失败,不再发送到服务端。

qq_32087723的博客 972

2006NOIP普及组真题 4. 数列

从上述推理中,我们发现要输出的幂次和中的第 N 项(也就是幂次和中的序号N),对应的二进制位数和幂次和对应的二进制位数相同。当 k=3 时,k的幂次为1, 3, 9, 27, 81…,即第0位,第2位均为1,转成 k 进制(k=3)时。,即第2位,第3位均为1,转成 k 进制(k=3)时。转成 k 进制(k=3)时的幂次和为。,即第0位,第1位,第2位均为1,(即第0位,第1位,第2位均为1)N=12时,12的二进制是。(即第0位,第2位均为1)(即第2位,第3位均为1)结论:这道题就变成了。

weixin_40252159的博客 1514

71、CAN总线双绞线绞距与抗共模干扰的定量关系

摘要:本文探讨了CAN总线双绞线绞距与抗共模干扰的定量关系。通过理论推导得出共模电压与绞距平方成正比,绞距越小抑制效果越好。工程实践表明,工业现场推荐绞距不超过30mm,高频干扰场景需优先优化绞距。实测数据验证了绞距均匀性的重要性,建议控制在15-25mm范围,安装时保持绞合结构完整。案例显示,将绞距从50mm改为15mm后,共模干扰从12V降至1.8V,有效解决了CAN通信问题。绞距选择需兼顾理论计算与现场实测,同时注意与屏蔽层的协同设计。

2401_88858637的博客 184

面试官与二蛋的对决:Spring Boot、Kafka和Redis在内容社区中的应用

你好,二蛋,欢迎来参加我们的技术面试。我们今天的主题是围绕内容社区与用户生成内容(UGC)展开的。首先问个简单的问题,如何在Spring Boot中使用Kafka进行消息传递?(自信满满):哎呀,这个问题我会!首先得加依赖。然后弄个配置,像啊,序列化器那些都设好。发消息可以用,收消息就写个类用注解。(点头微笑):不错嘛,看来你对基础还算了解。那我再加点难度——如果系统流量增大,你觉得应该怎样扩展Kafka以应对呢?(摸下巴):嗯……是不是多搞几个分区?还有就是消费者组也得多整几个,不然消息堆积会爆炸。

m0_74295492的博客 682

携程滑块、点选验证码登录识别逆向

本文分析了携程登录系统的风控机制,主要包含三种验证场景:无验证码、滑块验证码和二次图标点选验证码。通过跟踪risk_inspect风控接口,发现验证流程采用标准AES加密,需提交设备指纹等加密信息。当触发验证码时,需额外提交包含轨迹坐标的verify_msg参数及token/rid参数。最终通过风控检测后,需使用一致的指纹参数和验证token完成加密登录。文章强调所有分析仅用于学习,代码实现需确保符合法律规范。

码王吴彦祖的博客 1100

阿里Redis最全面试全攻略,读完这个就可以和阿里面试官好好聊聊

什么是Redis及其重要性?Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久化的高性能键值对数据库。Redis的之父是来自意大利的西西里岛的Salvatore Sanfilippo,Github网名antirez,笔者找了作者的一些简要信息并翻译了一下,如图: 从2009年第一个版本起Redis已经走过了10个年头,目前Redis仍然是最流行的key-value型...

Java架构技术交流 397

漫画安全HIDS、EDR、NDR、XDR

漫画安全HIDS、EDR、NDR、XDR

墨痕诉清风的博客 3445

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

互联网大厂Java求职者必看:谢飞机与面试官的技术对决(含Spring Boot、Redis、Kafka等核心技术)

在一家互联网大厂的会议室里,一位名叫谢飞机的程序员正在接受一场严苛的面试。面试官神情严肃,而谢飞机却满脸轻松。让我们一起看看这场技术较量。

qq_54002085的博客 984

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

互联网大厂Java面试真题解析:谢飞机与面试官的爆笑对决(Spring Boot/Redis/JVM)

通过谢飞机这位“水货程序员”的面试过程,我们可以看到即使是基础问题也要理解透彻,复杂问题更要逻辑清晰。希望本篇文章能够帮助正在准备Java面试的朋友,掌握高频考点与实战技巧,顺利拿到心仪Offer!

qq_54002085的博客 479

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Redis面试实录:面试官VS水货程序员谢飞机的技术对决

谢飞机,我们先从Redis的基础数据结构开始。请你说说Redis常用的数据结构有哪些?:啊,这个我知道!有String、List、Set、Hash、Zset...还有那个什么Stream?反正就是这些啦!:不错,回答正确。那你能说说String类型在什么业务场景下使用比较合适吗?:String啊,就是存字符串嘛!比如用户信息、商品信息,反正就是存东西的地方。:那Hash和String有什么区别?在什么情况下选择Hash更合适?:呃...Hash就是多个String放在一起?

m0_73689466的博客 953

被面试官问:MySQL 有 Redo Log,为什么 Redis 还要搞个 AOF?我直接语塞了。

摘要:本文对比了MySQL和Redis的日志系统设计差异

Tjy2186987211的博客 519

Java面试记:谢飞机的搞笑求职之旅(Spring Boot, Kafka, Redis)

啊,这个嘛... 我知道Kafka是分布式的消息队列,Producer负责发送消息,Consumer负责接收消息,然后还有Topic和Partition的概念。:呃... 消费者组的话,不同的消费者可以共享一个Group ID,然后每个分区只能被一个消费者消费,这样就能实现负载均衡了。:这个我知道,它是用来启用Spring Boot的自动配置功能的,会根据classpath中的依赖和配置来决定加载哪些组件。:最后一个话题,假设你在做一个直播平台,主播发布视频流,观众订阅观看,你会用什么技术栈实现?

sinat_26229211的博客 949

面试官:Redis分布式锁超时了,任务还没执行完怎么办?

做一个单纯的程序圆,分享干货,聊聊人生。 今天主要分享的是面试中常见的redis的一些面试内容。如果你正好需要刚好可以帮你回顾一下,如果不需要可以收藏起来后面用到的时候翻出来回顾。 一、背景 面试官:你们项目中有使用分布式锁么? 我:有使用。 面试官:你们使用分布式锁主要是为了干啥? 我:多节点并发访问同一份数据的时候,防止造成脏数据。 面试官:都有哪些方案实现分布式锁?你们用的是哪一种? 我:有基于zk的临时顺序节点的方案,有redis的setnx和指定expire超时时间的方案。 面试

yangjnsjbad的博客 2322
上一篇: 2021-我的年终总结不一样
下一篇: RedisJson特性让我放弃了MongoDB,也让我放弃了Hash,我就问你们香不香?
stackfuture
博客等级 码龄5年 23粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值