澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站Redis面试总结,进阶面试总结

2019-11-10 作者:澳门新萄京官方网站   |   浏览(95)

一、Redis简介

1、Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品。
2、Redis采用内存(In-Memory)数据集(DataSet)。
3、支持多种数据类型。
4、运行于大多数POSIX系统,如Linux、*BSD、OS X等。
5、作者:Salvatore Sanfilippo

这里有一份面试题相关总结,涉及高并发、分布式、高可用相关知识点,在此分享给大家,希望大家能拿到一份理想的 Offer!

什么是redis?

Redis是一个key-value存储系统,现在在各种系统中的使用越来越多,大部分情况下是因为其高性能的特性,被当做缓存使用,这里介绍下Redis经常遇到的使用场景。

二、软件获取和帮助

  • Redis.io
  • Download/redis.io
  • Redisdoc.com

澳门新萄京官方网站 1

Redis 是一个基于内存的高性能key-value数据库。 (有空再补充,有理解错误或不足欢迎指正)

Redis特性

一个产品的使用场景肯定是需要根据产品的特性,先列举一下Redis的特点:

  • 读写性能优异
  • 持久化
  • 数据类型丰富
  • 单线程
  • 数据自动过期
  • 发布订阅
  • 分布式

这里我们通过几个场景,不同维度说下Redis的应用。

三、功能特性

  • 高速读写
  • 数据类型丰富
  • 支持持久化
  • 多种内存分配及回收策略
  • 支持事务
  • 澳门新萄京官方网站Redis面试总结,进阶面试总结。消息队列、消息订阅
  • 支持高可用
  • 支持分布式分片集群

高并发架构

Reids的特点

高性能适合当做缓存

缓存是Redis最常见的应用场景,之所有这么使用,主要是因为Redis读写性能优异。而且逐渐有取代memcached,成为首选服务端缓存的组件。而且,Redis内部是支持事务的,在使用时候能有效保证数据的一致性。
作为缓存使用时,一般有两种方式保存数据:

  • 1、读取前,先去读Redis,如果没有数据,读取数据库,将数据拉入Redis。
  • 2、插入数据时,同时写入Redis。

方案一:实施起来简单,但是有两个需要注意的地方:
1、避免缓存击穿。(数据库没有就需要命中的数据,导致Redis一直没有数据,而一直命中数据库。)
2、数据的实时性相对会差一点。

方案二:数据实时性强,但是开发时不便于统一处理。

当然,两种方式根据实际情况来适用。如:方案一适用于对于数据实时性要求不是特别高的场景。方案二适用于字典表、数据量不大的数据存储。

四、缓存数据库解决方案对比

  • Memcached

    优点:高性能读写、单一数据类型、支持客户端分布式集群、一致性hash多核结构、多线程读写性能高。 缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复杂度高

  • Redis

    优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高 缺点:多线程读写较Memcached慢

  • Tair

    优点:高性能读写、支持三种存储引擎(ddb、rdb、ldb)、支持高可用、支持分布式分片集群、支撑了几乎所有淘宝业务的缓存。 缺点:单机情况下,读写性能较其他两种产品较慢

消息队列

Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。

丰富的数据格式性能更高,应用场景丰富

Redis相比其他缓存,有一个非常大的优势,就是支持多种数据类型。

数据类型 说明
string 字符串,最简单的k-v存储
hash hash格式,value为field和value,适合ID-Detail这样的场景。
list 简单的list,顺序列表,支持首位或者末尾插入数据
set 无序list,查找速度快,适合交集、并集、差集处理
sorted set 有序的set

其实,通过上面的数据类型的特性,基本就能想到合适的应用场景了。

  • string——适合最简单的k-v存储,类似于memcached的存储结构,短信验证码,配置信息等,就用这种类型来存储。
  • hash——一般key为ID或者唯一标示,value对应的就是详情了。如商品详情,个人信息详情,新闻详情等。
  • list——因为list是有序的,比较适合存储一些有序且数据相对固定的数据。如省市区表、字典表等。因为list是有序的,适合根据写入的时间来排序,如:最新的***,消息队列等。
  • set——可以简单的理解为ID-List的模式,如微博中一个人有哪些好友,set最牛的地方在于,可以对两个set提供交集、并集、差集操作。例如:查找两个人共同的好友等。
  • Sorted Set——是set的增强版本,增加了一个score参数,自动会根据score的值进行排序。比较适合类似于top 10等不根据插入的时间来排序的数据。

如上所述,虽然Redis不像关系数据库那么复杂的数据结构,但是,也能适合很多场景,比一般的缓存数据结构要多。了解每种数据结构适合的业务场景,不仅有利于提升开发效率,也能有效利用Redis的性能。

对比测试

为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么优点和缺点?

因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。

单线程可以作为分布式锁

谈到Redis和Memcached 的区别,大家更多的是谈到数据结构和持久化这两个特性,其实还有一个比较大的区别就是:

  • Redis 是单线程,多路复用方式提高处理效率。
  • Memcached 是多线程的,通过CPU线程切换来提高处理效率。

所以Redis单线程的这个特性,其实也是很重要的应用场景,最常用的就是分布式锁。
应对高并发的系统,都是用多服务器部署,每个技术框架针对数据锁都有很好的处理方式,如 .net 的lock,java 的synchronized,都能通过锁住某个对象来应对线程导致的数据污染问题。但是毕竟,只能控制本服务器的线程,分布式部署以后数据污染问题,就比较难处理了。Redis的单线程这个特性,就非常符合这个需求,伪代码如下:

//产生锁
while lock!=1
    //过期时间是为了避免死锁
    now = int(time.time())
    lock_timeout = now   LOCK_TIMEOUT   1
    lock = redis_client.setnx(lock_key, lock_timeout)

//真正要处理的业务
doing() 

//释放锁
now = int(time.time())
if now < lock_timeout:
    redis_client.delete(lock_key)

以上是一个只说明流程的伪代码,其实整体的逻辑是很简单的,只要考虑到死锁时的情况,就比较好处理了。Redis作为分布式锁,因为其性能的优势,不会成为瓶颈,一般会产生瓶颈的是真正的业务处理内容,还是尽量缩小锁的范围来确保系统性能。

单线程写入测试

澳门新萄京官方网站 2

如何保证消息队列的高可用?

Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。

自动过期能有效提升开发效率

Redis针对数据都可以设置过期时间,这个特点也是大家应用比较多的,过期的数据清理无需使用方去关注,所以开发效率也比较高,当然,性能也比较高。最常见的就是:短信验证码、具有时间性的商品展示等。无需像数据库还要去查时间进行对比。因为使用比较简单,就不赘述了。

单线程读取测试

澳门新萄京官方网站 3

如何保证消息不被重复消费?(如何保证消息消费时的幂等性)

另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。

分布式和持久化有效应对海量数据和高并发

Redis初期的版本官方只是支持单机或者简单的主从,大多应用则都是自己去开发集群的中间件,但是随着应用越来越广泛,用户关于分布式的呼声越来越高,所以Redis 3.0版本时候官方加入了分布式的支持,主要是两个方面:

  • Redis服务器主从热备,确保系统稳定性
  • Redis分片应对海量数据和高并发

而且Redis虽然是一个内存缓存,数据存在内存,但是Redis支持多种方式将数据持久化,写入硬盘,所有,Redis数据的稳定性也是非常有保障的,结合Redis的集群方案,有的系统已经将Redis当做一种NoSql数据存储来适用。

多线程写入测试

澳门新萄京官方网站 4

如何保证消息的可靠性传输?(如何处理消息丢失的问题)

Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

示例:秒杀和Redis的结合

秒杀是现在互联网系统中常见的营销模式,作为开发者,其实最不愿意这样的活动,因为非技术人员无法理解到其中的技术难度,导致在资源协调上总是有些偏差。秒杀其实经常会出现的问题包括:

  • 并发太高导致程序阻塞。
  • 库存无法有效控制,出现超卖的情况。

其实解决这些问题基本就两个方案:

  • 数据尽量缓存,阻断用户和数据库的直接交互。
  • 通过锁来控制避免超卖现象。

现在说明一下,如果现在做一个秒杀,那么,Redis应该如何结合进行使用?

  • 提前预热数据,放入Redis
  • 商品列表放入Redis List
  • 商品的详情数据 Redis hash保存,设置过期时间
  • 商品的库存数据Redis sorted set保存
  • 用户的地址信息Redis set保存
  • 订单产生扣库存通过Redis制造分布式锁,库存同步扣除
  • 订单产生后发货的数据,产生Redis list,通过消息队列处理
  • 秒杀结束后,再把Redis数据和数据库进行同步

以上是一个简略的秒杀系统和Redis结合的方案,当然实际可能还会引入http缓存,或者将消息对接用MQ代替等方案,也会出现业务遗漏的情况,这个只是希望能抛砖引玉。

每个技术都有属于自己的应用场景,只有对技术的特点有一定清晰的认识,才能更好的利用技术,发挥其最大的优势。


欢迎大家关注我的公众号交流、学习、第一时间获取最新的文章。
微信号:itmifen

澳门新萄京官方网站 5

多线程读取测试

澳门新萄京官方网站 6

如何保证消息的顺序性?

Redis支持的数据类型

五、Redis应用场景

  • 数据高速缓存
  • web会话缓存(Session Cache)
  • 排行榜应用
  • 消息队列
  • 发布订阅

 

如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?

Redis通过Key-Value的单值不同类型来区分, 以下是支持的类型:

如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路。

Strings

搜索引擎

Lists

es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?

Sets 求交集、并集

es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?

Sorted Set

es 在数据量很大的情况下如何提高查询效率啊?

hashes

es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?

为什么redis需要把所有数据放到内存中?

缓存

Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。

在项目中缓存是如何使用的?缓存如果使用不当会造成什么后果?

如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。

Redis 和 Memcached 有什么区别?Redis 的线程模型是什么?为什么单线程的 Redis 比多线程的 Memcached 效率要高得多?

如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。

Redis 都有哪些数据类型?分别在哪些场景下使用比较合适?

Redis是单进程单线程的

Redis 的过期策略都有哪些?手写一下 LRU 代码实现?

redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销

如何保证 Redis 高并发、高可用?Redis 的主从复制原理能介绍一下么?Redis 的哨兵原理能介绍一下么?

虚拟内存

Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?

当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大.

Redis 集群模式的工作原理能说一下么?在集群模式下,Redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?如何动态增加和删除一个节点?

当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value.

了解什么是 Redis 的雪崩和穿透?Redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 Redis 的穿透?

vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的.

如何保证缓存与数据库的双写一致性?

可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.

Redis 的并发竞争问题是什么?如何解决这个问题?了解 Redis 事务的 CAS 方案吗?

自己测试的时候发现用虚拟内存性能也不错。如果数据量很大,可以考虑分布式或者其他数据库

生产环境中的 Redis 是怎么部署的?

分布式

分库分表

redis支持主从的模式。原则:Master会将数据同步到slave,而slave不会将数据同步到master。Slave启动时会连接master来同步数据。

为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?你们具体是如何对数据库如何进行垂直拆分或水平拆分的?

这是一个典型的分布式读写分离模型。我们可以利用master来插入数据,slave提供检索服务。这样可以有效减少单个机器的并发访问数量。

现在有一个未分库分表的系统,未来要分库分表,如何设计才可以让系统从未分库分表动态切换到分库分表上?

读写分离模型

如何设计可以动态扩容缩容的分库分表方案?

通过增加Slave DB的数量,读的性能可以线性增长。为了避免Master DB的单点故障,集群一般都会采用两台Master DB做双机热备,所以整个集群的读和写的可用性都非常高。

分库分表之后,id 主键如何处理?

读写分离架构的缺陷在于,不管是Master还是Slave,每个节点都必须保存完整的数据,如果在数据量很大的情况下,集群的扩展能力还是受限于单个节点的存储能力,而且对于Write-intensive类型的应用,读写分离架构并不适合。

读写分离

数据分片模型

如何实现 MySQL 的读写分离?MySQL 主从复制原理是啥?如何解决 MySQL 主从同步的延时问题?

为了解决读写分离模型的缺陷,可以将数据分片模型应用进来。

高并发系统

可以将每个节点看成都是独立的master,然后通过业务实现数据分片。

如何设计一个高并发系统?

结合上面两种模型,可以将每个master设计成由一个master和多个slave组成的模型。

分布式系统

Redis的回收策略

系统拆分

volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗?

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

分布式服务框架

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

说一下 Dubbo 的工作原理?注册中心挂了可以继续通信吗?

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

Dubbo 支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的?

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

Dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?

no-enviction:禁止驱逐数据

Dubbo 的 spi 思想是什么?

1. 使用Redis有哪些好处?

如何基于 Dubbo 进行服务治理、服务降级、失败重试以及超时重试?

速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O

分布式服务接口的幂等性如何设计?

支持丰富数据类型,支持string,list,set,sorted set,hash

分布式服务接口请求的顺序性如何保证?

支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

如何自己设计一个类似 Dubbo 的 rpc 框架?

丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

分布式锁

2. redis相比memcached有哪些优势?

Zookeeper 都有哪些应用场景?

memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

使用 Redis 如何设计分布式锁?使用 Zookeeper 来设计分布式锁可以吗?以上两种分布式锁的实现方式哪种效率比较高?

redis的速度比memcached快很多

分布式事务

redis可以持久化其数据

分布式事务了解吗?你们如何解决分布式事务问题的?TCC 如果出现网络连不通怎么办?XA 的一致性如何保证?

3. redis常见性能问题和解决方案:

分布式会话

Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

集群部署时的分布式 Session 如何实现?

如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

高可用架构

为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

Hystrix 介绍

尽量避免在压力很大的主库上增加从库

电商网站详情页系统架构

主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...

高可用系统

这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

如何设计一个高可用系统?

4. MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

限流

相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

如何限流?在工作中是怎么做的?说一下具体的实现?

redis 提供 6种数据淘汰策略,上文已经列出。

熔断

5. Memcache与Redis的区别都有哪些?

如何进行熔断?

1)、存储方式

熔断框架都有哪些?具体实现原理知道吗?

Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。

降级

Redis有部份存在硬盘上,这样能保证数据的持久性。

如何进行降级?

2)、数据支持类型

最全阿里高级Java必考题与答案

Memcache对数据类型支持相对简单。

澳门新萄京官方网站 7澳门新萄京官方网站 8

Redis有复杂的数据类型。

欢迎Java工程师朋友们加入Java进阶架构学习交流:952124565,进群即可获取BAT最新面试答案,以及免费的进阶学习资料。

3)、使用底层模型不同

它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。

Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

4)、value大小

redis最大可以达到1GB,而memcache只有1MB

6. Redis 常见的性能问题都有哪些?如何解决?

1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。

2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。

Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。

3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。

4). Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

7,redis 最适合的场景

Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别。

那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?

如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:

Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

Redis支持数据的备份,即master-slave模式的数据备份。

Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

、会话缓存(Session Cache)

最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?

幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。

澳门新萄京官方网站,、全页缓存

除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。

再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。

此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

、队列

Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言对 list 的 push/pop 操作。

如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。

,排行榜/计数器

Redis在内存中对数字进行递增或递减的操作实现的非常好。集合和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:

当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。

、发布/订阅

最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。

Redis提供的所有特性中,我感觉这个是喜欢的人最少的一个,虽然它为用户提供如果此多功能。

欢迎工作一到五年的Java工程师朋友们加入Java架构开发:643694753

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

本文由澳门新萄京官方网站发布于澳门新萄京官方网站,转载请注明出处:澳门新萄京官方网站Redis面试总结,进阶面试总结

关键词: