Redis面试题 - Go语言中文社区

Redis面试题


1、什么是redis?

      redis是一种面向内存的key-value数据库,储存string,list,set,z-set(有序set类型)的数据

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

     1、计算出20w数据所需要的内存大小,修改redis的配置文件,设置redis的最大可用内存

     2、设置redis的内存淘汰策略为allkeys-lcu或者volatile-lcu

3、redis内存淘汰策略?

      1、volatile-lcu:在所有设置了过期时间的key中,最近一段时间最少使用的优先被淘汰

      2、volatile-ttl:再所有设置了过期时间的key中,越接近过期时间的优先被淘汰

      3、volatile-random:所有设置过期时间的key中,随机淘汰

      4、allkeys-lcu:最近一段时间内,最少使用的优先被淘汰

      5、allkeys-random:随机淘汰

      6、noeviction(禁止驱逐):超过最大可用内存就报错

4、redis过期处理策略?

      redis是单线程的,redis收割是需要花费时间的,所以收割的次数过多会影响缓存效率,所以redis采用定期清理和惰性清理相结合的策略。

     1、定期清理

          redis中所有设置过期时间的key都储存再hash中,所以redis每秒只用扫描hash而不用扫描整个应用。主要分为

          1、redis从设置过期时间的key中随机抽取一定数量的key,

          2、将抽取的key中已经过期的数据进行清除

          3、如果过期的key占比超过1/4,则重复第一步的操作

          如果多个数据设置一样的过期时间,在某一时刻操作这些数据时,从缓存中查不到,就只能去操作数据库,此时缓存就不能起到作用,这就是缓存雪崩。

     2、惰性清理

           客户端访问redis时,如果操作的是过时的数据,就清理,否则就不清理。

           当定情清理和惰性清理还是没能把数据清理干净时,此时就会用到内存淘汰策略

5、缓存穿透?

      客户端访问的key不存在时,此时在缓存中差不到,就只能去数据库查找,当下一次又请求这个key时重复同样的操作。此时,缓存是没有起到作用的,数据库查找也比较耗时,这个就是缓存穿透。

      处理:

      1、服务端使用拦截器控制客户端请求,让不存在的key不访问数据库

       2、当访问的key不存在时,可以将此key对应的值存入空对象放入到缓存中,给此key一个较短的过期时间

6、缓存失效策略?

      1、FIFO:先进先失效

      2、LRU:最近一段时间间隔内,最少使用的先失效

      3、LFU:一直以来最少使用的优先使用,此时,每个key给一个hit属性,hit属性小的优先失效

7、缓存更新策略

      Cache aside、Read Through、Write Through、Write Behind Cache Patten

      Cache aside:读:客户端首先读取缓存中的数据,不存在在读取数据库数据,客户端自己把数据库数据更新到缓存

                             写:客户端把数据写到数据库,然后再去更新缓存

     Read through:客户端读取数据时,如果缓存没有,就读取数据库,同时缓存服务把数据更新到缓存。

    Write through:客户端把数据写入缓存,缓存服务器同步的把数据更新到数据库

    Write Bethind Cache Patten:客户端把数据写入缓存,缓存服务器异步的把数据更新到数据库

版权声明:本文来源博客园,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.cnblogs.com/guaoxiaobailang/p/11498420.html
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-11-16 23:49:34
  • 阅读 ( 1523 )
  • 分类:面试题

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢