• 技术文章 >数据库 >Redis

    总结分享一些关于redis缓存的面试题

    青灯夜游青灯夜游2021-07-26 09:35:33转载514
    本篇文章给大家分享一些关于redis缓存的面试题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

    redis缓存的面试题

    1、redis和memcached什么区别?为什么高并发下有时单线程的redis比多线程的memcached效率要高?

    区别:

    3.redis可以做消息队列。

    原因:memcached多线程模型引入了缓存一致性和锁,加锁带来了性能损耗。

    2、redis主从复制如何实现的?redis的集群模式如何实现?redis的key是如何寻址的?

    主从复制实现:主节点将自己内存中的数据做一份快照,将快照发给从节点,从节点将数据恢复到内存中。之后再每次增加新数据的时候,主节点以类似于mysql的二进制日志方式将语句发送给从节点,从节点拿到主节点发送过来的语句进行重放。

    分片方式:

    【相关推荐:Redis视频教程

    3、使用redis如何设计分布式锁?说一下实现思路?使用zk可以吗?如何实现?这两种有什么区别?

    redis:

    zk:

    4、知道redis的持久化吗?底层如何实现的?有什么优点缺点?

    RDB(RedisDataBase:在不同的时间点将redis的数据生成的快照同步到磁盘等介质上):内存到硬盘的快照,定期更新。缺点:耗时,耗性能(fork+io操作),易丢失数据。

    AOF(AppendOnlyFile:将redis所执行过的所有指令都记录下来,在下次redis重启时,只需要执行指令就可以了):写日志。缺点:体积大,恢复速度慢。

    bgsave做镜像全量持久化,aof做增量持久化。因为bgsave会消耗比较长的时间,不够实时,在停机的时候会导致大量的数据丢失,需要aof来配合,在redis实例重启时,优先使用aof来恢复内存的状态,如果没有aof日志,就会使用rdb文件来恢复。Redis会定期做aof重写,压缩aof文件日志大小。Redis4.0之后有了混合持久化的功能,将bgsave的全量和aof的增量做了融合处理,这样既保证了恢复的效率又兼顾了数据的安全性。bgsave的原理,fork和cow,fork是指redis通过创建子进程来进行bgsave操作,cow指的是copyonwrite,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分囲开来。

    5、redis过期策略都有哪些?LRU算法知道吗?写一下java代码实现?

    过期策略:

    定时过期(一key一定时器),惰性过期:只有使用key时才判断key是否已过期,过期则清除。定期过期:前两者折中。

    LRU:newLinkedHashMap<K,V>(capacity,DEFAULT_LOAD_FACTORY,true);第三个参数置为true,代表linkedlist按访问顺序排序,可作为LRU缓存;设为false代表按插入顺序排序,可作为FIFO缓存

    LRU算法实现:

    LinkedHashMap:HashMap和双向链表合二为一即是LinkedHashMap。HashMap是无序的,LinkedHashMap通过维护一个额外的双向链表保证了迭代顺序。该迭代顺序可以是插入顺序(默认),也可以是访问顺序。

    6、缓存穿透、缓存击穿、缓存雪崩解决方案?

    **缓存穿透:**指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到DB去查询,可能导致DB挂掉。

    解决方案:

    **缓存击穿:**对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把DB压垮。

    解决方案:

    解决方案:

    将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

    7、在选择缓存时,什么时候选择redis,什么时候选择memcached

    选择redis的情况:

    选择memcache的场景:

    纯KV,数据量非常大的业务,使用memcache更合适,原因是:

    8、缓存与数据库不一致怎么办?

    假设采用的主存分离,读写分离的数据库,
    如果一个线程A先删除缓存数据,然后将数据写入到主库当中,这个时候,主库和从库同步没有完成,线程B从缓存当中读取数据失败,从从库当中读取到旧数据,然后更新至缓存,这个时候,缓存当中的就是旧的数据。

    发生上述不一致的原因在于,主从库数据不一致问题,加入了缓存之后,主从不一致的时间被拉长了。

    处理思路:在从库有数据更新之后,将缓存当中的数据也同时进行更新,即当从库发生了数据更新之后,向缓存发出删除,淘汰这段时间写入的旧数据。

    9、主从数据库不一致如何解决?

    场景描述,对于主从库,读写分离,如果主从库更新同步有时差,就会导致主从库数据的不一致

    10、Redis常见的性能问题和解决方案

    11、Redis的数据淘汰策略有哪些

    voltile-lru从已经设置过期时间的数据集中挑选最近最少使用的数据淘汰

    voltile-ttl从已经设置过期时间的数据库集当中挑选将要过期的数据

    voltile-random从已经设置过期时间的数据集任意选择淘汰数据

    allkeys-lru从数据集中挑选最近最少使用的数据淘汰

    allkeys-random从数据集中任意选择淘汰的数据

    no-eviction禁止驱逐数据

    12、Redis当中有哪些数据结构

    字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。如果是咼级用户,那么还会有,如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。

    13、假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?

    使用keys指令可以扫出指定模式的key列表。

    对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?

    这个时候你要回答redis关键的一个特性:redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。

    14、使用Redis做过异步队列吗,是如何实现的

    使用list类型保存数据信息,rpush生产消息,lpop消费消息,当lpop没有消息时,可以sleep一段时间,然后再检查有没有信息,如果不想sleep的话,可以使用blpop,在没有信息的时候,会一直阻塞,直到信息的到来。redis可以通过pub/sub主题订阅模式实现一个生产者,多个消费者,当然也存在一定的缺点,当消费者下线时,生产的消息会丢失。

    15、Redis如何实现延时队列

    使用sortedset,使用时间戳做score,消息内容作为key,调用zadd来生产消息,消费者使用zrangbyscore获取n秒之前的数据做轮询处理。

    16、什么是Redis?简述它的优缺点?

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

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

    Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据
    结构,此外单个value的最大限制是1GB,不像memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。

    比方说用他的List来做FIFO双向链表,实现一个轻量级的高性能消息队列服务,用他的Set可以做高性能的tag系统等等。

    另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一个功能加强版的memcached来用。Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

    17、Redis相比memcached有哪些优势?

    18、Redis支持哪几种数据类型?

    String、List、Set、SortedSet、hashes

    19、Redis主要消耗什么物理资源?

    内存。

    20、Redis的全称是什么?

    Remote Dictionary Server

    21、Redis有哪几种数据淘汰策略?

    noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)

    allkeys-lru:尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。

    volatile-lru:尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。

    allkeys-random:回收随机的键使得新添加的数据有空间存放。

    volatile-random:回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。

    volatile-ttl:回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。

    22、Redis官方为什么不提供Windows版本?

    因为目前Linux版本已经相当稳定,而且用户量很大,无需开发windows版本,反而会带来兼容性等问题。

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

    512M

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

    Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。

    所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。

    在内存越来越便宜的今天,redis将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。

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

    26、Redis集群方案什么情况下会导致整个集群不可用?

    有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。

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

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

    28、Redis有哪些适合的场景?

    29、Redis支持的Java客户端都有哪些?官方推荐用哪个?

    Redisson、Jedis、lettuce等等,官方推荐使用Redisson。

    30、Redis和Redisson有什么关系?

    Redisson是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象(Bloomfilter,BitSet,Set,SetMultimap,ScoredSortedSet,SortedSet,Map,ConcurrentMap,List,ListMultimap,Queue,BlockingQueue,Deque,BlockingDeque,Semaphore,Lock,ReadWriteLock,AtomicLong,CountDownLatch,Publish/Subscribe,HyperLogLog)。

    31、Jedis与Redisson对比有什么优缺点?

    Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;
    Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

    32、Redis如何设置密码及验证密码?

    设置密码:config set require pass 123456 授权密码:auth123456

    33、说说Redis哈希槽的概念?

    Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。

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

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

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

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

    36、Redis集群之间是如何复制的?

    异步复制

    37、Redis集群最大节点个数是多少?

    16384个。

    38、Redis集群如何选择数据库?

    Redis集群目前无法做数据库选择,默认在0数据库。

    39、怎么测试Redis的连通性?

    ping

    40、Redis中的管道有什么用?

    一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。

    这就是管道(pipelining),是一种几十年来广泛使用的技术。例如许多POP3协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。

    41、怎么理解Redis事务?

    事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

    42、Redis事务相关的命令有哪几个?

    MULTI、EXEC、DISCARD、WATCH

    43、Rediskey的过期时间和永久有效分别怎么设置?

    EXPIRE和PERSIST命令。

    44、Redis如何做内存优化?

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

    45、Redis回收进程如何工作的?

    一个客户端运行了新的命令,添加了新的数据。
    Redi检查内存使用情况,如果大于maxmemory的限制,则根据设定好的策略进行回收。一个新的命令被执行,等等。

    所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。

    如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。

    更多编程相关知识,请访问:编程视频!!

    以上就是总结分享一些关于redis缓存的面试题的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:redis 缓存 面试
    上一篇:快速了解Redis中的单机、主从、哨兵和集群模式 下一篇:聊聊Redis中的哨兵模式
    第16期线上培训班

    相关文章推荐

    • Redis高频面试题(附答案分析)• 详解SpringBoot集成redis• 使用Redis实现一个安全可靠的分布式锁• windows环境下如何安装Redis?方法介绍• 使用Redis可能遇到的15个坑,快来收藏避雷!!• 如何使用springBoot集成redis?

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网