本文总结最近一段时间面试中被问到的专项知识点,一些基础的内容可以直接到 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进行监控,当客户端没有挂掉就续期。
网友评论