首页优质面试题库

最新题库

最新题目

  • Redis的数据淘汰策略

    问:Redis的数据淘汰策略有哪些?
    答:嗯,这个在redis中提供了很多种,默认是noeviction,不删除任何数据,内部不足时直接报错。这个可以在redis的配置文件中进行设置。里面有两个非常重要的概念:一个是LRU,另外一个是LFU。LRU的意思就是最少最近使用。它会用当前时间减去最后一次访问时间。这个值越大,则淘汰优先级越高。LFU的意思是最少频率使用。它会统计每个key的访问频率。值越小,淘汰优先级越高。我们在项目中设置的是allkeys-lru,它会挑选最近最少使用的数据进行淘汰,把一些经常访问的key留在redis中。
    • redis后端
  • Redis数据过期策略

    问:Redis的数据过期策略有哪些?
    答:嗯~,在redis中提供了两种数据过期删除策略。第一种是惰性删除。在设置该key过期时间后,我们不去管它。当需要该key时,我们检查其是否过期。如果过期,我们就删掉它;反之,返回该key。第二种是定期删除。就是说,每隔一段时间,我们就对一些key进行检查,并删除里面过期的key。定期清理的两种模式是:1) SLOW模式,是定时任务,执行频率默认为10hz,每次不超过25ms,可以通过修改配置文件redis.conf的hz选项来调整这个次数;2) FAST模式,执行频率不固定,每次事件循环会尝试执行,但两次间隔不低于2ms,每次耗时不超过1ms。Redis的过期删除策略是:惰性删除 + 定期删除两种策略配合使用。
    • redis数据过期策略
  • Redis持久化

    问:redis做为缓存,数据的持久化是怎么做的?
    答:在Redis中提供了两种数据持久化的方式:1) RDB;2) AOF。
    • Redis持久化
  • 延时双删

    问:你听说过延时双删吗?为什么不用它呢?
    答:嗯!就说我最近做的这个项目,里面有xxxx(根据自己的简历上写)的功能。数据同步可以有一定的延时(这符合大部分业务需求)。我们当时采用的阿里的Canal组件实现数据同步:不需要更改业务代码,只需部署一个Canal服务。Canal服务把自己伪装成mysql的一个从节点。当mysql数据更新以后,Canal会读取binlog数据,然后再通过Canal的客户端获取到数据,并更新缓存即可。
    • redis延时双删
  • 排它锁

    问:那这个排他锁是如何保证读写、读读互斥的呢?
    答:其实排他锁底层使用的也是SETNX,它保证了同时只能有一个线程操作锁住的方法。
    • Redis
  • MySQL与Redis数据同步

    问:redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致性)
    答:嗯!就说我最近做的这个项目,里面有xxxx(根据自己的简历上写)的功能,需要让数据库与redis高度保持一致,因为要求时效性比较高。我们当时采用的读写锁保证的强一致性。我们使用的是Redisson实现的读写锁。在读的时候添加共享锁,可以保证读读不互斥、读写互斥。当我们更新数据的时候,添加排他锁。它是读写、读读都互斥,这样就能保证在写数据的同时,是不会让其他线程读数据的,避免了脏数据。这里面需要注意的是,读方法和写方法上需要使用同一把锁才行。
    • Redis数据同步
  • 缓存雪崩

    问:什么是缓存雪崩?怎么解决?
    答:嗯!缓存雪崩意思是,设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重而雪崩。与缓存击穿的区别是:雪崩是很多key,而击穿是某一个key缓存。解决方案主要是,可以将缓存失效时间分散开。比如,可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机。这样,每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
    • redis缓存
  • 缓存击穿

    问:什么是缓存击穿?怎么解决?
    答:嗯!缓存击穿的意思是,对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这个时间点对这个Key有大量的并发请求过来。这些请求发现缓存过期,一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。解决方案有两种方式:第一,可以使用互斥锁:当缓存失效时,不立即去load db,先使用如 Redis 的 SETNX 去设置一个互斥锁。当操作成功返回时,再进行 load db的操作并回设缓存,否则重试get缓存的方法。第二种方案是设置当前key逻辑过期,大概思路如下:1) 在设置key的时候,设置一个过期时间字段一块存入缓存中,不给当前key设置过期时间;2) 当查询的时候,从redis取出数据后判断时间是否过期;3) 如果过期,则开通另外一个线程进行数据同步,当前线程正常返回数据,这个数据可能不是最新的。当然,两种方案各有利弊:如果选择数据的强一致性,建议使用分布式锁的方案,但性能上可能没那么高,且有可能产生死锁的问题。如果选择key的逻辑删除,则优先考虑高可用性,性能比较高,但数据同步这块做不到强一致。
    • Redis缓存
热门标签
JavaJavaScriptReactVuePythonC++
关于我们
欢迎来到编程小栈,这是一个专注于编程学习、分享和交流的平台。在这里,你可以找到各种编程相关的资源、教程、问题解答、编程社区等。我们致力于为编程爱好者提供更好的学习环境和交流平台。
联系我们
邮箱:2917314230@qq.com
加入我们
如果你对编程感兴趣,并且想加入编程小栈,欢迎加入我们的编程学习交流社区。你可以通过以下方式加入我们: