redis博客推荐及个人学习笔记(面试必问)

https://blog.csdn.net/weixin_42167717/article/details/106527006 - redis

https://blog.csdn.net/HarderXin/article/details/105224796 - Redis面试题答案整理

https://blog.csdn.net/xuezhiwu001/article/details/105072544 - 缓存穿透、缓存击穿、缓存雪崩区别和解决方案

https://blog.csdn.net/zzti_erlie/article/details/104655455 - 缓存雪崩,缓存穿透,缓存击穿出现的原因及解决方案

https://blog.csdn.net/weixin_45749011/article/details/106454525 - Redis -- 高频面试题


总结:                                                                                                                                                                                                

为什么使用缓存?


缓存两个用途:高性能高并发

(1)高性能
对于一些需要复杂操作耗时查询出结果的,确定后期不怎么变化但是有很多读的请求的、直接把结果放在缓存中,后面直接读取缓存就好了(这个使用的场景)
假设有一个场景:一个请求过来之后,各种操作数mysql,查询很久查询出一个结果,耗时600ms,但是结果在几个小时不会变化,或者是变化了不用立即返回给客户那么就用缓存

一个600ms的查询,扔缓存里,一个key 对应一个value,在查询的时候就直接从缓存里拿,2ms ,性能提高300倍

(2)高并发
高峰期请求数据超过1W,mysql支持不好,缓存支持高并发。

为什么数据库不能支撑高并发,缓存可以支撑?

因为缓存是走的内存,内存就可以支撑大量请求,但是数据库一般并发请求不超过2000/s

一般公司不会有很大的并发,所以一般都是为了高性能

注:redis最简单的使用方法,当用户的请求访问查询接口的时候可以使用设置redis做中间缓存。而更新、插入等操作可以直接访问数据库,再写回redis。。。简单粗暴~~                                                                                                                                                            

缓存使用不当的不良后果

 

1、缓存双写不一致???

这个其实就是请求更新数据的时候,更新了数据库的信息,但是没有立即在redis缓存中更新该字段信息。所以用户查询改信息的时候依然是旧信息。

2. 缓存穿透

缓存穿透其实就是用户发送请求的时候,访问的是redis缓存中没有的key值,直接查询数据库,但请求数量大的时候。数据库io出问题。数据库io能支持并量远远小于内存。

解决方法:

(1)这个数据没有的话,在redis中存储这个key,返回一个null 。(这个其实就是用户请求的key值在redis不存在,再查询数据库不存在。就相当于立即加个补丁。把key值放入到redis缓存中,当别人再访问这个key的时候,就只能访问到缓存中了。。) - 简称加补丁

如果有一个IP频繁的一直访问这个key 的话 可以判定他是恶意的,监控这个IP,操作这个IP。


(2)在接口层校验

黑客频繁更换key访问,这样会频繁访问数据库,redis也会频繁存储(这个就是恶意操作了。好,你采取发现一个不存在(漏洞)就加一个补丁,那我不断换你redis没有存储的key值发送请求,那你就要不断打补丁,但是之前就已经请求到数据库了。这个时候如果把这个ip禁了,就是用户请求发送来的数据包,检测数据头,如果一直是这个ip,直接丢弃)
解决 : 在redis 和数据库之间 加一个过滤器,布隆过滤器。

布隆过滤器基本概念:如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表散列表(又叫哈希表,Hash table)等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大。同时检索速度也越来越慢,上述三种结构的检索时间复杂度分别为{\displaystyle O(n),O(\log n),O(1)}。

布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。

布隆过滤器其实就是把数据库的primaryKey值数据全部放入到redis缓存中,而value设置为1,可以大大节约内存。当用户发送请求的时候,直接在缓存中搜索该值,不存在返回。

 

3.缓存雪崩

查询redis的时候 大量的key 同一时间都过期了,结果就是请求直接到数据库,对数据库造成压力,这样redis失去存在意义,只需要
保证key不同时过期,可以在过期时间之后随机抽取一个random随机数字作为时间,错开过期时间
如果一个key被频繁访问那么他就是一个热点key 数据库数据不会频繁改变的话,那么就不设置过期时间

其实就是随机设置redis中的key值的过期时间,不然大量的key值在同一时间过期。如果这个时间请求忽然暴增,而对应单应的key值直接访问到数据库了。。就会出问题。

 

4.缓存击穿

缓存击穿跟缓存雪崩有点类似,不同的是雪崩是大面积的缓存失效,缓存击穿是一个热点key,缓存失效的瞬间大并发会击破缓存直接请求到数据库。

5、redis并发竞争
就是多个客户端同事并发写一个key,可能是本来先到的数据后到了,导致数据版本错了;
同时获取一个key进行修改回写、只要顺序错了数据就错了。

解决 : 使用分布式锁(zookeeper)

基于zookeeper实现分布式锁,确保同一时间只能有一个系统实例在操作某个key,别人不允许读写
 

写入缓存数据都是从mysql查询出来的,都得写入mysql,写入的时候保存一个时间戳,查询的时候也查询出时间戳,写之前判断时间戳是否比缓存中的时间戳新,是的话可以写,否则就不能用旧数据覆盖新的数据。
 

6.Redis和Memcached区别
redis支持复杂的数据结构、可以支持更复杂的场景,更好用。
redis原生支持集群模式


7.为什么redis单线程模型效率比较高

7.1、纯内存操作
7.2、核心是基于非阻塞IO多路复用机制
7.3、
单线程避免了多线程频繁上线问切换问题,预防多线程可能产生的竞争问题
 

8.redis数据结构

String(最基本的,在hash和set,zset,list中最基本的就是String)
单值缓存 key String
对想缓存 key  json 
大小512M

hash (当然去存储key-value值。查询速度快,以供用户请求时查询)
类似于map的一种结构,主要是存放一些对象

set (去重,set数据结构的特性:不保留相同的key值)
无序集合,自动去重,基于set做交集

zset (排序)
排序

list(分页查询,返回一个有序列表。。分页不用list那用set,string,hash(无序)?)
可以通过 lrange 命令,读取某个闭区间内的元素,可以基于 list 实现分页查询
 

9.redis 剔除策略 
redis过期策略是:定期删除+惰性删除

定期删除是redis 默认每100ms随机抽取一些设置过期的时间的key,检查是否过期,过期就删除;(定期)

获取key的时候,如果已经过期了,就删除,不会反悔任何东西

内存淘汰机制(惰性)

allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key

 

10.redis 持久化(其实也就是备份)

1、RDB 快照的形式雪茹磁盘,把整个redis数据存储到单一文件中,可以做灾备,但是在宕机的瞬间快照没有保存完数据会丢失
2、AOF 日志文件写入,支持每秒同步、每次修改同步不同步,运行效率比RDB低

总结:RDB(间隔备份文件),AOF(时刻备份文件)

11.redis高并发
redis不能支撑高并发的瓶颈在哪里?

单机;单机的redisQPS不会超过10W+

redis主从架构
redis通过主从实现读写分离支撑高并发(10W+)
redis架构做成主从架构,一主多从,主负责写入,并且把数据听赋值到其他slave节点上,从节点负责读,所有的读请求全部走从节点(这个其实就是可以很灵活地分配利用服务器的性能)

可以水平扩容,继续增加redis slave
redis面试

redis 接口幂 
 


总结:以前也曾看过书,但是没参与企业级开发,redis只停留在认识上;这一两个月时间参与需要上线企业开发的项目,感觉真的学习到很多,,后端大佬跑路,剩下我和另一个技术人员负责后端接口的修改和前后端联调,不断熟悉项目,而且根据需求,求,和两个10多年的程序老兵(都有深厚的后端开发经验,不断学习他们的开发思想,和不断接触新技术,新工具)。经过1年后再看redis,感觉有了更深刻的认识,也是随着自己的开发经验上去而慢慢认识的。后序还会做微服务和高并发~~~,值得期待。后序内容再更~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章