美文网首页
redis大厂面试问答

redis大厂面试问答

作者: helo123 | 来源:发表于2021-07-15 14:52 被阅读0次

    本文总结最近一段时间面试中被问到的专项知识点,一些基础的内容可以直接到 GitHub - laozhu123/interview: 各大厂java面试内容总结、所有知识点总结 下载,文中有一些简写的地方,不懂的可以看github里的文档

    一、锁

    1.是否用过redis锁,如何使用?

    答:通过setnx方法获取获取锁,而后使用setex设置过期时间,通过SET key-with-expire-and-NX "hello" EX 10086 NX的方式实现。(扩展点,在redis集群中,当master在锁获取后挂掉了,新的master又被加锁时,出现双锁的情况,需要使用redlock)。

    二、redis中的缓存异常 

    1.缓存雪崩

    缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。

    解决方案:

            1-1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。

            1-2.一般并发量不是特别多的时候,使用最多的解决方案是加锁排队(获取互斥锁,而后进行db查询,回来更新redis,删除互斥锁)。

    2.缓存穿透

    缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。

    解决方案:

            2-1.接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;

            2-2.从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

            2-3.采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力

    3.缓存击穿

    缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。和缓存雪崩不同的是缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

    解决方案:

            3-1设置热点数据永远不过期。

            3-2.加互斥锁,互斥锁

    三、redis持久化

    1.缓存持久化有哪些方式

    答:rdb和aof

    2.分别是干嘛的

    答:

    1)rdb快照模式 对数据完整性要求不行 (set m n) 设置当m时间后并且n个数据更改则进行持久化

    2)aof是添加模式 设置间隔时间进行持久话 3种写入方式:每秒、每次写入、no(放入buffer中,当大小达到一定后写入)

    四、redis的key过期问题

    1.redis的key过期机制

    答:

    1)懒处理方式:每次查到数据后,判断数据是否过期,若过期进行删除。

    2)定时方式:每隔一段时间,查询一次redis中的一定数量的键,删除其中过期的,若过期率高于预设值,责继续一次操作,直到过期率低于预设值。

    2. redis锁在执行过程中过期如何弥补

    答:使用watch dog进行监控,当客户端没有挂掉就续期。

    五、redis的数据结构

    1.zset的结构:跳表 ziplist

    2.set结构:hashtable inset

    3.hash:ziplist hashtable

    相关文章

      网友评论

          本文标题:redis大厂面试问答

          本文链接:https://www.haomeiwen.com/subject/fabppltx.html