1.Redis支持的数据类型?

答:五种,在第一节redis相关的博客我就说过,String,Hash,List,Set,zSet,也就是我们的字符串,哈希,列表,集合,有序集合五种。结构图如下。

2.什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?

答:Redis持久化主要分为三种,RDB、AOF还有我们的混合持久化,RDB是一个二进制文件,AOF是保存我们的每一次操作的命令,默认是使用RDB的持久化方式。RDB,二进制文件,速度快,但是数据安全性差,可能造成数据的丢失,AOF,命令文件,速度慢,数据安全性视配置文件而定,相对要更安全一些,数据不容易丢失,BGREWRITEAOF重写可以压缩我们已有的AOF文件,混合持久化模式就是以RDB和AOF共同使用的。

3.Redis 有哪些架构模式?讲讲各自的特点

答:主从模式,一般是一个主节点,一或多个从节点,为了保证我们的主节点宕机后,数据不丢失,我们将主节点的数据备份到从节点,从节点并不进行实际操作,只做实时同步操作,并不能起到高并发的目的。

  哨兵模式,一个哨兵集群和一组主从架构组成。比主从更好的是当我们的主节点宕机以后,哨兵会主动选举出一个主节点继续向外提供服务。

  集群架构,由很多个小主从聚集在一起,一起向外提供服务的,将16384个卡槽切分存储,并不是一个强一致性的集群架构,每一个小主从节点内会存在选举机制,保证对外的高可用架构。

4.Redis常用命令?

  答:setnx,单次插入,incr,DECR原子加减,lpush列表左侧插入,rpush列表右侧插入,rpop列表右侧移除,blpop key timeout 从列表key的表头(最左侧)弹出第一个元素,sadd集合中添加元素,sismember判断元素是否在集合中,sinter交集,sunion并集,sdiff差集,zadd有序集合添加元素。

5.使用过Redis分布式锁么,它是怎么实现的?

  答:用过分布式锁,用setnx来简单实现的,设置setnx,也就是锁的争抢,设置成功的即为拿到锁的,锁需要设置最大等待时间,并设置方法内的唯一UUID作为Value,防止其它线程解锁。方法结束以后,用finnal来解锁,需要判断value值为当前UUID才可以解锁,这样就简单实现了一个分布式的锁,为了保证原子性操作可以采用lua脚本来执行中间判断步骤。还有很成熟的redisson来设置我们的分布式锁,也解决了我们上面最大等待时间多久合适的争议。redisson底层是这样来做的,我们设置了一个线程锁,超时时间比如设置了30秒,方法开始执行,这时redisson会开启一个分线程,来查询主线程的方法是否执行完成,大概是没30/3秒执行一次,即使到了30秒还没有执行完,redisson也不会将锁释放掉,会继续给予锁10秒的生命时间,来继续使主线程正常运行,直到时间加到主线程执行完成为止。

6.使用过Redis做异步队列么,你是怎么用的?有什么缺点?

  答:用过,用列表数据来实现的。大致就是左侧进入lpush,右侧弹出brpop,或者相反的方向也是可以的,但是用我们的redis实现的消息队列,消息的发布是无状态的,无法保证可达,若订阅者在发送者发布消息期间下线,之后我们再上线将无法接受到刚才发送的消息,解决办法就是使用消息队列

7.什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免?

  答:缓存击穿是指经过缓存层并没有得到我们想要的数据,请求会向下请求我们的数据库,这就是缓存击穿,我们可以在每次请求数据库返回时做一个保存操作,即使没有值也保存一下,记得设置好超时时间,现在没有值,不代表永远没有值。

缓存雪崩是指redis宕机造成服务无法继续使用,或者大量的命令阻塞的redis,造成假死现象,使得请求直接访问我们的数据库,请求量巨大,可能压垮我们的数据服务器,可以使用高可用的架构来做redis服务,比如哨兵架构,集群架构,避免用单机的redis来作为缓存服务,对于并发量超大的情况我们可以使用限流的方式来控制。比如hystrix

8.redis的单线程为什么那么快

  答:因为它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换中性能损耗的问题。

9.Redis有哪几种数据淘汰策略?

  答:默认策略是volatile-lru,即超过最大内存后,在过期键中使用lru算法进行key的剔除,保证不过期数据不被删除,但是可能会出现OOM问题。

  其他策略如下:

allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时属性,直到腾出足够空间为止。

allkeys-random:随机删除所有键,直到腾出足够空间为止。

volatile-random: 随机删除过期键,直到腾出足够空间为止。

volatile-ttl:根据键值对象的ttl属性,删除最近将要过期数据。如果没有,回退到noeviction策略。

noeviction:不会剔除任何数据,拒绝所有写入操作并返回客户端错误信息"(error)OOM command not allowed when used memory",此时Redis只响应读操作。

10.一个字符串类型的值能存储最大容量是多少?

  答:512M,但是并不建议存储bigKeys的数值,本来就是单线程的redis,如果你使用了bigKey的体积较大的数值可能造成网络拥塞,同时也影响使用的效率,建议单个键值对大小不超过10kb。

11.Redis有哪些适合的场景?

  答:文章点赞模型,incr,DECR原子加减来实现,队列操作lpush和rpop,栈的操作lpush和lpop,关注模型,使用列表的交集并集来推荐可能认识的人,购物车模型,使用哈希存储来方面存取。

12.Jedis与Redisson对比有什么优缺点?

  答:Jedis是连接redis最常用的插件,底层用java编写的,对于redis的单机命令集成的非常好,但是对于一些集群的操作不是很友好的,而Redisson也是连接我们redis的重要插件,但是集成的redis命令并不理想,可他提供了强大的分布式锁供我们来使用,在分布式中,相比jedis,redisson表现的更为出色。

13.Redis中的管道有什么用?

  答:管道就是通过一次网络请求,一起塞给Redis客户端多条命令,不存在事务的控制,就是说,当我们其中的命令报错了,并不会中断我们管道的继续执行,同时已经执行完的操作,也会持久化下来。

14.谈一下redis中的事务

  答:redis自身的事务并不是很好用的,一般我用Lua脚本来代替Redis的事务。用eval来执行我们的Lua脚本。

15.Redis如何做内存优化?

  答:上述提到过一些优化的方法,比如我们的键最好设置为见名识意的,但是不要设置的过长,尽力的避免设置bigkey,如果真的无法避免bigkey,可以考虑水平拆分。

16.Redis分区有什么缺点?

  答:redis集群并不是一个强一致的集群,通过CRC16算法分配我们的16384个卡槽上的,这时可能造成我们的一些命令失效,比如我们取得交集,并集等命令,还有我们的批量get,批量set命令。如果不在一个服务主从集群上,会造成命令报错。

最进弄了一个公众号,小菜技术,欢迎大家的加入

												

java架构之路-(Redis专题)redis面试助力满分+的更多相关文章

  1. [转帖]java架构之路-(面试篇)JVM虚拟机面试大全

    java架构之路-(面试篇)JVM虚拟机面试大全 https://www.cnblogs.com/cxiaocai/p/11634918.html   下文连接比较多啊,都是我过整理的博客,很多答案都 ...

  2. java架构之路-(Redis专题)Redis的主从、哨兵和集群

    我们使用的redis,单机的绝对做不到高可用的,万一单机的redis宕机了,就没有备用的了,我们可以采用集群的方式来保证我们的高可用操作. 主从架构 大致就是这样的,一个主节点,两个从节点(一般两个就 ...

  3. java架构之路-(Redis专题)聊聊大厂那些redis

    上几次说了redis的主从,哨兵,集群配置,但是内部的选举一直没说,先来简单说一下选举吧. 集群选举 redis cluster节点间采取gossip协议进行通信,也就是说,在每一个节点间,无论主节点 ...

  4. java架构之路-(Redis专题)SpringBoot连接Redis超简单

    上次我们搭建了Redis的主从架构,哨兵架构以及我们的集群架构,但是我们一直还未投入到实战中去,这次我们用jedis和springboot两种方式来操作一下我们的redis 主从架构 如何配置我上次已 ...

  5. java架构之路-(Redis专题)Redis的高性能和持久化

    上次我们简单的说了一下我们的redis的安装和使用,这次我们来说说redis为什么那么快和持久化数据 在我们现有的redis中(5.0.*之前的版本),Redis都是单线程的,那么单线程的Redis为 ...

  6. java架构之路-(Redis专题)简单聊聊redis分布式锁

    这次我们来简单说说分布式锁,我记得过去我也过一篇JMM的内存一致性算法,就是说拿到锁的可以继续操作,没拿到的自旋等待. 思路与场景 我们在Zookeeper中提到过分布式锁,这里我们先用redis实现 ...

  7. java架构之路-(面试篇)Mysql面试大全

    说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了.后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和B+Tree结构,很少提到我们的集群配置优化方案. 1.索引是什么 ...

  8. java架构之路-(面试篇)JVM虚拟机面试大全

    下文连接比较多啊,都是我过整理的博客,很多答案都在博客里有详细说明,理解记忆是最扎实的记忆.而且我的答案不一定是最准确的,但是我的答案不会让你失望,而且几乎每个答案都是问题的扩展答案. 1.JVM内存 ...

  9. java架构之路-(微服务专题)初步认识微服务与nacos初步搭建

    历史演变: 以前我们都是一个war包,包含了很多很多的代码,反正我开始工作的时候做的就是这样的项目,一个金融系统,代码具体多少行记不清楚了,内部功能超多,但是实际能用到的不多,代码冗余超大,每次部署大 ...

随机推荐

  1. 关于读写APP.config文件能读却写不了的问题

    今天要求用winform写一个窗口用来读写一个App.config,要对  <appSettings>里面的add key和value进行添加和修改.要实现的效果图如下: -------- ...

  2. (二)spring 高级装配-Condition -条件化的bean

    Condition:满足某个特定条件的情况下创建bean 条件化配置bean: a:@Conditional 指定一个class ,它指明了通过条件对比的类.如果没有指定class则通过Condito ...

  3. Linux初识之VMWare中Centos7的安装

    Windows平台下VMWare 14安装Centos 7 一.虚拟机硬件配置 1.选择创建新的虚拟机: 2.选择自定义(高级)进行自定义配置,单击下一步: 3.选择虚拟机硬件兼容性为默认,单击下一步 ...

  4. ASP.NET Core 3.0 gRPC 双向流

    目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 认证授权 一.前言 在前一文 <ASP.NE ...

  5. 【数据结构与算法】--JavaScript 链表

    一.介绍 JavaScript 原生提供了数组类型,但是却没有链表,虽然平常的业务开发中,数组是可以满足基本需求,但是链表在大数据集操作等特定的场景下明显具有优势,那为何 JavaScript 不提供 ...

  6. shell脚本一键部署lvs+keepalived

    环境 两个调度器dr1.dr2,两台真实机rs1.rs2.两台真实机安装httpd,并编辑主页内容用于验证 vip="192.168.132.250"dr1="192.1 ...

  7. adb之wm学习笔记

    为什么学习adb的wm指定 自动化测试平台获取手机的屏幕分辨率 adb -s iphoneCode shell wm usage: wm [subcommand] [options] wm size ...

  8. Spring boot 梳理 - 模版引擎 -freemarker

    开发环境中关闭缓存 spring: thymeleaf: cache: false freemarker: cache: false Spring boot 集成 freemarker <dep ...

  9. linux查看cpu核数和内存指令

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...

  10. 【SQL server初级】数据库性能优化二:数据库表优化

    数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第二部分 数据库性能优化二:数据库表优化 优化①:设计规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询 ...