凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~

Java架构没有996 等级 963 0 0

凉凉!面试阿里我被Redis技术专题给弄死了~

📚我本以为我可以像是别的博主一样去阿里面试随随便便,因为Redis,我直接被阿里大佬淦翻在地上

凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~

好了不装了 没过没关系 我总结了一些这些最难的知识点!!!!然后自己总结归类再去百度查询了一些 最终得出这份Redis技术专题

凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~

题目开淦

Redis集群的主从复制模型是怎样的?

为了是在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群是用了主从复制模型,每个节点都会有N-1个复制品

Redis集群会有写操作丢失吗?为什么?

Redis并不能保证数据强一致性,这意味着在实际中集群在特定的条件下可能会丢失写操作

Redis集群之间是如何复制的

异步复制

Redis如何做内存优化

尽可能使用散列表(hashes),散列表(是说列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面,比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户所有信息存储到一张散列表中 【参考文档】

Redis回收进程如何工作?

一个Client运行了新的命令,添加了新的数据,Redis会检查内存使用情况,如果大于maxmemory的限制,则根据设定好的策略进行回收

Redis支持哪几种常用数据类型?

  • String(字符串)
  • List(列表)
  • Set(集合)
  • Sorted Set(有序集合)
  • hash(哈希表)

Redis 与 memcached 相比有哪些优势?(主要是Redis的优势)

  • 1.memcached所有的值均是简单的字符串,redis支持更为丰富的数据类型。
  • 2.redis的速度比memcached快很多,redis的速度比memcached快很多(有争议,考虑到Memache多线程可以充分利用多核,在考虑6.0后的Redis支持多线程,所以存在版本的概念)。
  • 3.redis可以持久化其数据redis可以持久化其数据,数据的可靠性和一致性更高。
  • 4.redis单个key存储的value可以达到1G而Memcache只有1M存储大小。
  • 5.redis对集群情况下的高可用支持的方案很多,所以集群情况下高可用更好。
  • 6.针对于第一条的补充,包含功能场景的丰富化,比如,消息队列、原子操作处 理(Lua脚本以及自增自减的操作)、事务机制和延时队列机制等等功能。
  • 7.采用的网络模型非常好(epoll机制)摈弃给纯内存考虑,并且采用了内部共享内存池机制(可以复用内存,惰性分配),采用单线程机制减少用户态和内核态的切换以及线程之间上下文的切换。

Redis 集群方案应该怎么做?都有哪些方案?

  • codis目前用的最多的集群方案,属于一个基于服务端操作的负载均衡机制属于代理后端服务实例的机制,可以支持1024的集群节点,但它支持在节点数量改变情况下,旧节点数据可恢复到新hash(CRC32算法)节点。//加入Java开发交流君样:756584822一起吹水聊天
  • twemproxy ,基本和codis一致的效果,但是对于节点变化的情况处理不是很好,所以性能方面来讲依赖于twemproxy的节点的吞吐能力。
  • redis cluster3.0 自带的集群,特点在于他的分布式算法不是一致性hash,而是 hash槽(slot)的概念,以及自身支持节点设置从节点,并且节点之间都有引用链接关系帮助定位hash槽的数据,支持节点达到16384个节点。

(Redis)什么是缓存击穿?如何避免?

高并发的系统中,大量的请求同时查询一个 key 时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去。这种现象我们称为缓存击穿。

📚如何避免?

  • 1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存。
  • 2:做二级缓存,A1 为原始缓存,A2 为拷贝缓存,A1 失效时,可以访问 A2,A1 缓存失效时间设置为短期,A2 设置为长期,牺牲一致性,提高可用性
  • 3:设置热点数据永远不过期(不推荐哦)。

Redis如何实现高可用呢?

Redis实现高可用主要有三种方式:主从复制、哨兵模式,以及 Redis 集群。

📚主从复制 凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~ 将从前的一台 Redis 服务器,同步数据到多台从 Redis 服务器上,即一主多从的模式,这个跟MySQL主从复制的原理一样。

📚主从复制哨兵模式 凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~ 使用 Redis 主从服务的时候,会有一个问题,就是当 Redis 的主从服务器出现故障宕机时,需要手动进行恢复,为了解决这个问题,Redis 增加了哨兵模式(因为哨兵模式做到了可以监控主从服务器,并且提供自动容灾恢复的功能)。

📚Redis Cluster(集群)凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~ Redis Cluster 是一种分布式去中心化的运行模式,是在 Redis 3.0 版本中推出的 Redis 集群方案,它将数据分布在不同的服务器上,以此来降低系统对单主节点的依赖,从而提高 Redis 服务的读写性能。

使用哨兵模式在数据上有副本数据做保证,在可用性上又有哨兵监控,一旦master宕机会选举slave节点为master节点,这种已经满足了我们的生产环境需要,那为什么还需要使用集群模式呢?

哨兵模式归根节点还是主从模式,在主从模式下我们可以通过增加slave节点来扩展读并发能力,但是没办法扩展写能力和存储能力,存储能力只能是master节点能够承载的上限。所以为了扩展写能力和存储能力,我们就需要引入集群模式。 【参考文档】

凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~

Redis为何那么快???

Redis的快速很多人都知道是因为基于内存,但这只是一方面,其实redis在底层是一套很完善的多路复用事件处理机制来保证执行的高效的

线程模型 redis内部使用文件事件处理器file event handler,它包含如下几个部分

  • 多个socket
  • IO多路复用程序
  • 文件事件分派器
  • 事件处理器(连接应答处理器,命令请求处理器,命令回复处理器)
  • 之所以说redis是单线程其实是指这个文件事件处理器是单线程的,它采用多路复用的方式监听系统上多个socket,将socket上产生的事件压入队列中,由文件事件分派器从队列中取出一个socket根据事件类型发给相应的事件处理器 整个处理过程如图:

凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~

处理过程可以分为以下几个步骤:

  • 客户端向redis发起一个socket请求,向redis的server socket请求连接,这里命名为socket01
  • server socket产生一个AE_READABLE事件,IO多路复用程序监听到事件后将这个socket01压入队列
  • 文件事件分派器从队列中取出socket01,交给连接应答处理器
  • 连接应答处理器会将socket01的AE_READABLE事件与命令请求处理器相关联
  • 假设客户端执行set操作,这时命令请求处理器会从socket01读取key value,在内存中完成key value的设置
  • 在内存中完成设置后,会将socket01的AE_WRITEABLE事件与命令回复处理器相关联,然后压入队列中
  • 事件分派器拿到socket01后,交给命令回复处理器,由命令回复处理器向socket01写入本次操作的结果,比如OK,之后解除关联

以上就是一个命令在redis中执行的过程

总结一下效率高的原因

  • 内存操作
  • IO多路复用机制,减少了阻塞
  • 单线程避免了线程切换的开销和竞争问题
  • 最最根本的redis是用C语言写的,本来就直接跟操作系统交互,命令执行快得飞起

最新2021整理收集的很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,需要获取这些内容的朋友加Q君样:756584822 凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~

最后希望大家可以给我一个三连也算是对我的一个小小的支持,我们都是Hello World一家人啊

【参考文档】

收藏
评论区

相关推荐

我是Redis,MySQL大哥被我害惨了!
本文转自 轩辕之风 ,链接如下 https://mp.weixin.qq.com/s?__bizMzIyNjMxOTY0NA&mid2247486528&idx1&sn3f7b09eb21969fdb16f5b0805ff69fed&scene21wechat_redirect 我是Redis 你好,我是Redis,一个叫Antirez的
Windows 下编译 PHP Redis 扩展并支持 Igbinary 序列器
这是 PHP 下扩展的下载地址:当然,通过这个地址我们能够轻松的获取到 Redis 和 Igbinary 扩展并启用,但是,我们可以在页面上打开 phpinfo() 瞧瞧上方截图为重编译的 Redis 扩展,默认情况下通过上方网站下载的 Redis 扩展在 Available serializers 中只有 php 一项。目前仅编译了
凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~
凉凉!面试阿里我被Redis技术专题给弄死了📚我本以为我可以像是别的博主一样去阿里面试随随便便,因为Redis,我直接被阿里大佬淦翻在地上好了不装了 没过没关系 我总结了一些这些最难的知识点!!!!然后自己总结归类再去百度查询了一些 最终得出这份Redis技术专题 题目开淦 Redis集群的主从复制模型是怎样的?为了是在部分节点失败或者大部分节点无法通信的情
Ubuntu下redis开放端口
redis在ubuntu安装后默认是只有本地访问,需要别的ip访问我们需要修改redis的配置文件 1. dpkg -L redis-server  这命令我们可以看到redis的安装的文件在那些目录 ![](http://img.blog.csdn.net/20160509145512370?watermark/2/text/aHR0cDovL2Js
CentOS 7 Redis 5.0.8 哨兵模式配置
**准备三台虚拟机CentOS 7环境, 然后再下载 redis-5.0.8 安装包, 我是放在 /opt 目录** wget https://github.com/redis/redis/archive/5.0.8.tar.gz 解压 tar -xzvf redis-5.0.8.tar.gz 每台虚拟机的redis安装过程可以参考[
Docker安装redis操作命令
最近学习了redis,那么今天我们来学习以下在Docker上安装我们的redis,并查看有关redis的一系列命令 查找redis docker search redis 拉取redis docker pull redis 查看镜像 docker images
Flink读取数据存入Redis中
1.环境准备:   1.搭建单机版的Redis   2.虚拟机上nc -l 9000方式产生数据 2.需求分析: 通过socket的nc -l 9000方式产生数据,然后将数据以list的形式存入到Redis中 3.flink依赖的redis的pom文件         [redis的依赖](https://www.oschina.net/ac
Linux 安装Redis 详细教程
在windows下使用redis只要下载解压后启动就可以了,但是在linux下和windows下还是有些区别的,下面我们详细看看linux下redis的安装、配置、使用过程。 ### 一、环境说明 1.Linux 操作系统    本文使用deepin 15.7发行版,下载地址:https://www.deepin.org/ 2.redis安装包  
Redis migrate 数据迁移工具
在工作中可能会遇到单点Redis向Redis集群迁移数据的问题,但又不能老麻烦运维来做。为了方便研发自己迁移数据,我这里写了一个简单的Redis迁移工具,希望对有需要的人有用。 #### 本工具支持: * 单点Redis到单点Redis迁移 * 单点Redis到Redis集群迁移 * Redis集群到Redis集群迁移 * Redis集群
Redis 单线程如何处理那么多的并发客户端连接?
为什么Redis是单线程的 ------------- 1.官方答案 因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。 IO多路复用技术 -------- redis 采用网络IO多路复用技术来保证在多连接的
Redis(二十九)PHP 使用 Redis
安装 -- 开始在 PHP 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 PHP redis 驱动,且你的机器上能正常使用 PHP。 接下来让我们安装 PHP redis 驱动:下载地址为:[**https://github.com/phpredis/phpredis/releases**](https://www.oschina.
Redis内存淘汰机制
摘要 == Redis是一款优秀的、开源的内存数据库,我在阅读Redis源码实现的过程中,时时刻刻能感受到Redis作者为更好地使用内存而费尽各种心思,例如最明显的是对于同一种数据结构在不同应用场景下提供了基于不同底层编码的实现(如压缩列表、跳跃表等)。今天我们暂时放下对Redis不同数据结构的探讨,来一起看看Redis提供的另一种机制——内存淘汰机制。
Redis请求路由
简介 == 我们通过上几篇的介绍已经初步的掌握了Redis集群的相关内容,但这都是针对Redis服务端来说。我们还没有使用客户端去操作Reids集群。Redis为了追求性能的最大化,对集群环境的客户端通信协议做了非常大的修改,也就是说如果我们要从单节点连接Redis切换到连接集群环境Redis,那么客户端的代码需要做出相应的修改。 * * * 下面我们
SpingSession+redis解决分布式服务session共享问题
首先呢,先在windows环境搞个redis吧,下载地址:http://redis.cn/download.html 启动命令:cmd   redis-server.exe redis.windows.conf 停止命令,先启动客户端redis-cli.exe   再输入shutdown 添加密码:修改redis.windows.conf  搜索req
Spring该如何整合Redis集群
**前言:在上一文中,我讲到了---[如何搭建redis集群---让集群拥有分片的数据内存的扩容和哨兵的高可用](https://my.oschina.net/u/4115134/blog/3210013)。今天给大家讲解一下Spring如何整合Redis集群** * * * 在这里首先给大家说一说**分片和哨兵的特点**: * 1.分片的主要的作