网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- 如何控制Redis实现分布式锁有效时长呢?
- redisson实现的分布式锁是可重入的吗?
- redisson实现的分布式锁能解决主从一致性的问题吗?
- 如果业务非要保证数据的强一致性,这个该怎么解决呢?
- Redis集群有哪些方案?
- 什么是主从同步?
- 主从同步数据的流程
- 怎么保证Redis的高并发高可用?
- redis集群脑裂,该怎么解决呢?
- redis的分片集群有什么作用?
- Redis分片集群中数据是怎么存储和读取的?
- Redis是单线程的,但是为什么还那么快?
- 能解释一下I/O多路复用模型?
Redis6.0为什么要用多线程?
提高请求数,redis的瓶颈在于内存,使用分一个子线程去进行IO操作。
在Redis中存一个list集合怎么实现排序?
list类型中有一个sort命令可以排序。(sort key)
Redis的5大基本类型的底层原理?
Redis底层使用一个redisObject来表示所有的key和value
type:表示属于哪种基本类型;
encoding:表示底层使用数据结构;
ptr:指向底层数据结构的指针;
vm:虚拟内存,默认是关闭的;
- String:动态字符串SDS
- int:字符串类型的整型,底层使用int实现,比如set a 100;
- raw:动态字符串,大于39字节,分配两次;
- embstr:动态字符串,小于39字节,内存类型,只分配一次;
- List 类型:链表
- zipList:列表的长度小于512,元素的字节数小于64,使用ziplist,它进行了压缩;
- linkedList:不满足上面的条件就使用linkedlist,双向链表;
- set类型:intset或者hashtable
- intest:集合长度512且元素都是整数,使用intset;
- hashtble:hashtable底层使用字典结构(hash),键为字符串对象,value为null;
- hash类型:ziplist或者hashtable
- 键值对数量小于512,且所有键值对长度小于64字节,使用ziplist压缩;
- 键值对数量大于512,且其中有键值对长度大于64字节,使用hashtable;
- zset类型:ziplist或者skiplist
- 集合长度小于128,元素的字节数小于64使用ziplist压缩;
- 上面不满足使用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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**