2024年网络安全最全JAVA面试八股文之Redis相关,附学习笔记+面试整理+进阶书籍

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

在这里插入图片描述

Redis6.0为什么要用多线程?

提高请求数,redis的瓶颈在于内存,使用分一个子线程去进行IO操作。

在Redis中存一个list集合怎么实现排序?

list类型中有一个sort命令可以排序。(sort key)

Redis的5大基本类型的底层原理?

Redis底层使用一个redisObject来表示所有的key和value
在这里插入图片描述
type:表示属于哪种基本类型;
encoding:表示底层使用数据结构;
ptr:指向底层数据结构的指针;
vm:虚拟内存,默认是关闭的;

  • String:动态字符串SDS
  1. int:字符串类型的整型,底层使用int实现,比如set a 100;
  2. raw:动态字符串,大于39字节,分配两次;
  3. embstr:动态字符串,小于39字节,内存类型,只分配一次;
  • List 类型:链表
  1. zipList:列表的长度小于512,元素的字节数小于64,使用ziplist,它进行了压缩;
  2. linkedList:不满足上面的条件就使用linkedlist,双向链表;
  • set类型:intset或者hashtable
  1. intest:集合长度512且元素都是整数,使用intset;
  2. hashtble:hashtable底层使用字典结构(hash),键为字符串对象,value为null;
  • hash类型:ziplist或者hashtable
  1. 键值对数量小于512,且所有键值对长度小于64字节,使用ziplist压缩;
  2. 键值对数量大于512,且其中有键值对长度大于64字节,使用hashtable;
  • zset类型:ziplist或者skiplist
  1. 集合长度小于128,元素的字节数小于64使用ziplist压缩;
  2. 上面不满足使用skiplist,底层使用跳表实现;

缓存穿透?

查询到空数据,缓存中没有,数据库中也没有,当有大量的空数据访问,会造成数据库压力过大,容易宕机。

解决方法:

1.缓存空数据:查到数据库中也没有,在缓存中缓存一个空数据,下次访问直接从数据库中获取

2.布隆过滤器:用于检索一个数据是否存在于一个集合中,(底层主要是先去初始化一个比较大数组,里面存放的二进制0或1。在一开始都是0,当一个key来了之后经过3次hash计算,模于数组长度找到数据的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一个key的存在。)访问时先判断布隆过滤器中是否有数据,没有则直接返回。不过存在误判问题。

缓存击穿?

对于设置了过期时间的数据,缓存在某个时间点过期,而恰好这个时间有大量的数据进行访问。

解决方法:
双重锁

互斥锁:在缓存中没有查询到时,先获取互斥锁,查询数据库重建缓存,然后释放锁。此时其他线程只能等待。

(强一致性,性能差)

逻辑过期:在缓存中没有查询到时,一个线程先获取到互斥锁,再开一个线程去查询数据库重建缓存,其他线程则返回过期的时间。(高可用,性能优)

缓存雪崩?

大量的缓存在同一时间失效,或者redis宕机,请求直接到数据库。

解决方法:

给key的过期时间设置一个随机值,

搭建redis集群,

给业务添加多级缓存,

给业务添加降级限流策略。

redis做为缓存怎么保持和mysql数据进行同步?(双写一致性)

存强一致性的

  • redisson实现的读写锁,在读的时候添加共享锁,可以保证读读不互斥,读写互斥。当我们更新数据的时候,添加排他锁,它是读写,读读都互斥,这样就能保证在写数据的同时是不会让其他线程读数据的,避免了脏数据。这里面需要注意的是读方法和写方法上需要使用同一把锁才行。(强一致性)

允许延时一致的业务

  • 写入数据库后,清空缓存。
  • 设置过期时间来保证最终一致性。
  • 使用canal同步(阿里的canal组件实现数据同步:不需要更改业务代码,部署一个canal服务。canal服务把自己伪装成mysql的一个从节点,当mysql数据更新以后,canal会读取binlog数据,然后在通过canal的客户端获取到数据,更新缓存即可。)
  • 使用MQ中间中间件,更新数据之后,通知缓存删除。

先删除缓存或者删除数据库都会出现问题,所有需要延时双删
在这里插入图片描述

redis做为缓存,数据的持久化是怎么做的?

redis的数据持久化有两种,RDB和AOF

RDB:是以快照的形式把redis存储在内存的数据转到磁盘上去,当redis宕机恢复后,再从快照文件中加载数据。(二进制文件,体积小,恢复快)

快照分为手动快照和自动快照:

手动快照分为前台快照(save)和后台快照(bgsave);

AOF:含义是追加文件,当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据,因为AOF文件中保存的都是命令,所以必然会出现重复的命令,Redis采用重写机制来解决这个问题,重写要解决的问题就是删除AOF文件中重复的命令,已经被删除或者过期的命令。(默认关闭)
在这里插入图片描述
RDB缺点:容易丢失数据,耗时效率低;
RDB优点:适用于数据备份,方便传输,恢复大数据快,最大化redis性能(后台快照)
AOF优点:数据更加耐久(一旦出现故障最多丢失一秒数据),只进行追加的日志文件,体积过大会进行重写,容易读懂;
AOF缺点:体积大,速度低;
实际是两个一起用;

Redis的数据过期策略有哪些 ?

惰性删除和定期删除

惰性删除:当key过期时,只有当需要key时,去查询key判断是否过期,当过期就删除该key。

定期删除:每隔一段时间就对一些key检查,过期就删除。

Redis的数据淘汰策略有哪些 ?

这个在redis中提供了很多种,默认是noeviction,不删除任何数据,内存不足直接报错

是可以在redis的配置文件中进行设置的,里面有两个非常重要的概念,一个是LRU,另外一个是LFU。

LRU的意思就是最少最近使用,用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

LFU的意思是最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。

数据库有1000万数据 ,Redis只能缓存20w数据, 如何保证Redis中的数据都是热点数据 ?

可以使用 allkeys-lru (挑选最近最少使用的数据淘汰)淘汰策略,那留下来的都是经常访问的热点数据。

Redis分布式锁如何实现 ?

在redis中提供了一个命令setnx(SET if not exists)

由于redis的单线程的,用了命令之后,只能有一个客户端对某一个key设置值,只有当redis中没有这个key时才可以添加。(在没有过期或删除key的时候是其他客户端是不能设置这个key的)

如何控制Redis实现分布式锁有效时长呢?

采用的redis的一个框架redisson实现的。在redisson中需要手动加锁,并且可以控制锁的失效时间和等待时间,当锁住的一个业务还没有执行完成的时候,在redisson中引入了一个看门狗机制,就是说每隔一段时间(每个锁默认时间是30s,如果30s之内业务代码没有执行完,会有定时任务自动续期,(1/3的时间)10s中续期1次,续的的时间还是30s)就检查当前业务是否还持有锁,如果持有就增加加锁的持有时间,当业务执行完成之后需要使用释放锁就可以了。
在这里插入图片描述

还有一个好处就是,在高并发下,一个业务有可能会执行很快,先客户1持有锁的时候,客户2来了以后并不会马上拒绝,它会自旋不断尝试获取锁,如果客户1释放之后,客户2就可以马上持有锁,性能也得到了提升。

/\*\*
1、加锁,默认的超时时间是看门狗的时间(30s)
2、自动给锁续期(原理是只要占锁成功会启动一个定时任务给锁重新设置超时时间,默认续期的超时时
间是看门狗的时间,定时任务会在三分之一的看门狗的时间被触发一次)
3、获取不到锁阻塞阻塞
4、锁一旦释放了就不在续期
\*\*/



还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!


王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。


对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!


【完整版领取方式在文末!!】


***93道网络安全面试题***


![](https://img-blog.csdnimg.cn/img_convert/6679c89ccd849f9504c48bb02882ef8d.png)








![](https://img-blog.csdnimg.cn/img_convert/07ce1a919614bde78921fb2f8ddf0c2f.png)





![](https://img-blog.csdnimg.cn/img_convert/44238619c3ba2d672b5b8dc4a529b01d.png)





内容实在太多,不一一截图了


### 黑客学习资源推荐


最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

#### 1️⃣零基础入门


##### ① 学习路线


对于从来没有接触过网络安全的同学,我们帮你准备了详细的**学习成长路线图**。可以说是**最科学最系统的学习路线**,大家跟着这个大的方向学习准没问题。


![image](https://img-blog.csdnimg.cn/img_convert/acb3c4714e29498573a58a3c79c775da.gif#pic_center)


##### ② 路线对应学习视频


同时每个成长路线对应的板块都有配套的视频提供:


![image-20231025112050764](https://img-blog.csdnimg.cn/874ad4fd3dbe4f6bb3bff17885655014.png#pic_center)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 27
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值