• 【面试 redis】【第十二篇】redis的相关面试问题【完结】


    redis的相关面试问题==完结,详情查看日记

    ==========================================

    redis教程:http://www.redis.net.cn/tutorial/3501.html

     ===============================================================================

    1.redis如何实现高并发

     redis通过一主多从,主节点负责写,从节点负责读,读写分离,从而实现高并发。

    https://www.cnblogs.com/mengchunchen/p/10044603.html

     ===============================================================================

    2.redis如何实现高可用

    主备切换,哨兵集群,主节点宕机的情况下,自动选举出一个从节点变成主节点,从而保证了redis集群的高可用。

    https://www.cnblogs.com/mengchunchen/p/10044840.html

     ===============================================================================

    3.redis是单线程还是多线程?为什么单线程还能处理速度那么快?

       首先,redis是单进程单线程的k-v内存型可持久化数据库。

      单线程还能处理速度很快的原因:

        1》redis操作是基于内存的,内存的读写速度非常快

        2》正是由于redis的单线程模式,避免了线程上下文切换的损耗

        3》redis采用的IO多路复用技术,可以很好的解决多请求并发的问题。  多路代表多请求,复用代表多个请求重复使用同一个线程。epoll

      IO多路复用原理图如下:

      ===============================================================================

    4.redis的应用场景

      1》key-value结构,内存存取,速度快,做缓存

      2》list或sort set 实现消息队列

      3》list的有序性,也可以做时间轴

      4》sort set的权重特性,可以做排行榜

      5》redis的原子性自增,可以实现计数器

      6》redis的set,实现好友关系的功能   A关注的人存放set   被谁关注存放set,B也同样存放两个set,A的关注的人set和B的关注的人set求交集,可以得到共同关注;A的关注的人set和A的被关注的set求交集,获取互相关注好友列表。

      7》分布式锁,可以设置过期时间,注意使用完成要delete掉

    https://www.cnblogs.com/mengchunchen/p/9691021.html

      ===============================================================================

    5.redis如何保证原子性,又是如何解决异步以及并发阻塞的?

       redis可以保证操作的原子性,是因为redis本身就是单进程单线程的。

      那既然是单进程的如何解决异步以及并发阻塞的?

      是通过IO多路复用技术解决的这个问题!

      ===============================================================================

    6.redis 缓存穿透、缓存雪崩、缓存击穿

    https://baijiahao.baidu.com/s?id=1619572269435584821&wfr=spider&for=pc

    https://www.cnblogs.com/duanxz/p/3788366.html

    https://www.cnblogs.com/dream-to-pku/p/9153999.html

    这些问题的处理核心思想,就是尽可能的减小DB的访问压力!!

    缓存穿透:无效ID,在redis缓存中查不到,去查询DB,造成DB压力增大。

    解决方法:

      1》解决方法1:布隆过滤器,提供一个很大的Bit-Map,提供多个hash函数,分别对查询参数值【比如UUID】,进行求hash,然后分别对多个hash结果,在对应位置对比是否全为1或者某个位置为0,

              一旦有一个位置标识为0,表示本次查询UUID,不存在于缓存,再去查询DB.

        起到一个再过滤的效果。

      2》解决方法2:把无效的ID,也在redis缓存起来,并设置一个很短的超时时间。

    缓存雪崩:缓存同一时间批量失效,导致大量的访问直接访问DB

    解决方法:

      在做缓存时候,就做固定失效时间+随机时间段,保证所有的缓存不会同一时间失效

    缓存击穿:在缓存失效的时候,会有高并发访问失效的缓存【热点数据】

    解决方法:

      最简单的解决方法,就是将热点数据设置永不超时!

      第二个解决方法:对访问的Key加上互斥锁,请求的Key如果不存在,则加锁,去数据库取,新请求过来,如果相同KEy,则暂停10s再去缓存取值;如果Key不同,则直接去缓存取!

     ===============================================================================

    7.redis的两种持久化策略  RDB和AOF 【深入一下,重启以后的备份恢复】

    https://www.cnblogs.com/sxdcgaq8080/diary/2019/05/06/10819315.html

     ===============================================================================

    8.AOF的瘦身重写机制

    https://www.cnblogs.com/sxdcgaq8080/diary/2019/05/06/10819315.html

     ===============================================================================

    9.Redis过期策略+内存淘汰机制

     https://www.cnblogs.com/sxdcgaq8080/diary/2019/05/07/10824026.html

     ===============================================================================

    10.redis调用了flushdb 或者flushAll,之后,重启后数据还存在么

    重启以后,RDB中就没有了数据,AOF文件中最后一行的命令就是flushdb。

    如果删除flushdb,可以保留所有数据,否则,没有了。

    如果AOF执行了rewrite,那数据也没有了!

     https://www.cnblogs.com/sxdcgaq8080/diary/2019/05/06/10819315.html

     ===============================================================================

    11.redis中的lua脚本【涨姿势】

     ===============================================================================

     12.redis的主从复制

    https://www.cnblogs.com/sxdcgaq8080/diary/2019/05/07/10826519.html

     ===============================================================================

    13.redis的哨兵机制

     https://www.cnblogs.com/sxdcgaq8080/diary/2019/05/09/10836654.html

     ===============================================================================

    14.redis的集群部署

     https://www.cnblogs.com/sxdcgaq8080/diary/2019/05/10/10843989.html

     ===============================================================================

  • 相关阅读:
    JavaScript的作用域和块级作用域概念理解
    正则表达式中组的理解
    正则表达式的字符组取反(负值字符集合/范围)^必须出现在起始位置
    利用TortoiseGit(小乌龟)将项目上传至GitHub网站
    (.Net) NLog 记录日志功能
    关于网站中引用COM组件的部署问题
    备份与还原ORACLE数据库(通过CMD命令执行)
    C# Task中的Func, Action, Async与Await的使用
    ASP.NET WebAPI 项目示例(增删改查)
    .NET内存泄漏(之 静态事件)
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/10682525.html
Copyright © 2020-2023  润新知