2024年网络安全最新JAVA面试八股文之Redis相关(3),2024年最新超全网络安全中高级面试复习大纲

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

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

一个人可以走的很快,但一群人才能走的更远!不论你是正从事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、锁一旦释放了就不在续期
\*\*/
lock();

/\*\*
1、加锁,用户指定获取锁等待的时间
2、会自动给锁续期
3、等待指定的时间后返回布尔值
// 一般使用这个方法比较多,锁的超时时间就是业务执行的最大时间。超过这个时间说明业务执行出
问题了,应该马上释放锁,因为续期没有意义了。
\*/



本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。


最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。


最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。


![](https://img-blog.csdnimg.cn/img_convert/311903982dea1d8a5d2c98fc271b5b41.jpeg)



### 学习路线图


 其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。


相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。


![](https://img-blog.csdnimg.cn/img_convert/1ddfaf7dc5879b1120e31fafa1ad4dc7.jpeg)


#### 网络安全工具箱


当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份**我自己整理的网络安全入门工具以及使用教程和实战。**


![](https://img-blog.csdnimg.cn/img_convert/bcd1787ce996787388468bb227d8f959.jpeg)


#### 项目实战


最后就是项目实战,这里带来的是**SRC资料&HW资料**,毕竟实战是检验真理的唯一标准嘛~


![](https://img-blog.csdnimg.cn/img_convert/35fc46df24091ce3c9a5032a9919b755.jpeg)


#### 面试题


归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值