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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 面试官:聊聊Redis有哪些特性,不要慌,把你知道的都告诉他

640.png

说说Redis有哪些特性


[公众号:堆栈future]


1. Redis简介


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


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


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


2. Redis 特性


640.png

一图胜千言。

同为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的读写能力。

640.png


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。


640.png

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

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


3. 小结


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


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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
29天前
|
SQL 存储 关系型数据库
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
老架构师尼恩在其读者交流群中分享了关于 MySQL 中 redo log、undo log 和 binlog 的面试题及其答案。这些问题涵盖了事务的 ACID 特性、日志的一致性问题、SQL 语句的执行流程等。尼恩详细解释了这些日志的作用、所在架构层级、日志形式、缓存机制以及写文件方式等内容。他还提供了多个面试题的详细解答,帮助读者系统化地掌握这些知识点,提升面试表现。此外,尼恩还推荐了《尼恩Java面试宝典PDF》和其他技术圣经系列PDF,帮助读者进一步巩固知识,实现“offer自由”。
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
|
17天前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
51 10
|
1月前
|
存储 NoSQL Java
可能是最漂亮的Redis面试基础详解
我是南哥,相信对你通关面试、拿下Offer有所帮助。敲黑板:本文总结了Redis基础最常见的面试题!包含了Redis五大基本数据类型、Redis内存回收策略、Redis持久化等。相信大部分Redis初学者都会忽略掉一个重要的知识点,Redis其实是单线程模型。我们按直觉来看应该是多线程比单线程更快、处理能力更强才对,比如单线程一次只可以做一件事情,而多线程却可以同时做十件事情。但Redis却可以做到每秒万级别的处理能力,主要是基于以下原因:(1)Redis是基于内存操作的,Redis所有的数据库状态都保存在
可能是最漂亮的Redis面试基础详解
|
29天前
|
NoSQL Java API
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
1月前
|
NoSQL 算法 Redis
Redis面试篇
Redis面试篇
36 5
|
1月前
|
缓存 NoSQL Java
Java中redis面试题
Java中redis面试题
33 1
|
17天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
1月前
|
存储 消息中间件 NoSQL
【redis】redis的特性和主要应用场景
【redis】redis的特性和主要应用场景
101 1
|
1月前
|
NoSQL Redis
redis 的 key 过期策略是怎么实现的(经典面试题)超级通俗易懂的解释!
本文解释了Redis实现key过期策略的方式,包括定期删除和惰性删除两种机制,并提到了Redis的内存淘汰策略作为补充,以确保过期的key能够被及时删除。
54 1