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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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
相关文章
|
1月前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
1月前
|
存储 NoSQL 算法
阿里面试:亿级 redis 排行榜,如何设计?
本文由40岁老架构师尼恩撰写,针对近期读者在一线互联网企业面试中遇到的高频面试题进行系统化梳理,如使用ZSET排序统计、亿级用户排行榜设计等。文章详细介绍了Redis的四大统计(基数统计、二值统计、排序统计、聚合统计)原理和应用场景,重点讲解了Redis有序集合(Sorted Set)的使用方法和命令,以及如何设计社交点赞系统和游戏玩家排行榜。此外,还探讨了超高并发下Redis热key分治原理、亿级用户排行榜的范围分片设计、Redis Cluster集群持久化方式等内容。文章最后提供了大量面试真题和解决方案,帮助读者提升技术实力,顺利通过面试。
|
1月前
|
存储 NoSQL 算法
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?
|
2月前
|
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的哪个特性?
|
1月前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
71 10
|
2月前
|
存储 NoSQL Java
可能是最漂亮的Redis面试基础详解
我是南哥,相信对你通关面试、拿下Offer有所帮助。敲黑板:本文总结了Redis基础最常见的面试题!包含了Redis五大基本数据类型、Redis内存回收策略、Redis持久化等。相信大部分Redis初学者都会忽略掉一个重要的知识点,Redis其实是单线程模型。我们按直觉来看应该是多线程比单线程更快、处理能力更强才对,比如单线程一次只可以做一件事情,而多线程却可以同时做十件事情。但Redis却可以做到每秒万级别的处理能力,主要是基于以下原因:(1)Redis是基于内存操作的,Redis所有的数据库状态都保存在
可能是最漂亮的Redis面试基础详解
|
2月前
|
NoSQL Java API
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
2月前
|
NoSQL 算法 Redis
Redis面试篇
Redis面试篇
66 5
|
2月前
|
缓存 NoSQL Java
Java中redis面试题
Java中redis面试题
53 1
|
2月前
|
存储 消息中间件 NoSQL
【redis】redis的特性和主要应用场景
【redis】redis的特性和主要应用场景
163 1