redis的使用场景:
问题:redis的部署方式:
单机模式(自己玩的)
哨兵模式(了解常用)
redis - cluster(集群模式)
问题:什么是缓存穿透/缓存击穿/雪崩
缓存穿透:
缓存及DB都没有数据的时候,有用户恶劣一直访问,导致大量的数据落到mysql上。导致崩溃
解决:进行用户校验,当数据库和redis均没有该key值时候,设置一个key-null,给key设置一个短暂的时间
讲一下布隆过滤器:
大致流程图如下
布隆过滤器的大致思路是:当一个值加入集合的时候,通过一些hash函数映射到一个数组中的k个点,将这k个点置为1,检索的时候就看这些点是不是1,就知道这个集合中有没有该值如果有一个值对应不上为0,那就表明集合不可能存在该值。
实现代码:
缓存击穿
缓存中没有该数据的缓存,db中存在,一般出现情况为key值的缓存时间到期,此时用户对该值进行了大量访问,请求直接落到db上,导致db被打死
解决:1.将key值设置成用不过期。2.采用锁得方法,单机syn,分布式setnx,先将值从db读出来存到redis中
雪崩:
缓存中大量的key值到期,引起db压力大被打死(与缓存击穿一起记)
解决方法:1.不讲所有的key值在同一时刻过期(将key的过期时间设置为随机)
2.分布式布置时,将热点数据存到不同的redis上
问题:redis的淘汰策略(对于定期的清理)
说到redis的值会过期,就要说一下他的淘汰策略
1.不删除策略
2.优先删除最近最少使用的key
3.对设置了expires时间的key优先删除最近最少使用
4.随机删除key
5.只限于设置了expires时间的key值,随机删除部分key
6.只限于设置了expires,优先删除剩余时间最短的key值
问题:redis的过期策略
首先说一下有哪些过期策略
大致分为3中:定时删除/惰性删除/定期删除
定时:在设置了key的expires时间后,到点即删除,这样可以尽快释放key值,但是cpu很宝贵没时间管你,我还得校验你到没到期,所以占用了大量的cpu的时间
惰性:key到点了(expires)不进行删除,而是用的时候我去检查一下key到期了没有,因为有些key我是用的次数很少没比较总是去校验,所以这中很符合我性格,但是有个问题是你不去处理那样会有大量的数据存在内存中,久了会有内存泄露的问题
定期:定一个时间点,我去收拾以下家(redis),这样就比较合理了,但是这样就是上面两种的折中处理方法,在收拾内存上我没有定时收拾的快,在cpu利用上,我也没有惰性用的少
redis:采用的策略:定期删除 + 惰性删除
过期的key对adb和aof都不会有影响
rdb:从内存持久到rdb,会检查key是否过期,过期不存;从文件>内存 同样检查key是否过期,过期不导入到数据库
aof: 当key过期没被删除,是会存在aof中,但是取出来的时候会校验是否过期,过期了久不存到内存数据库了,还有种场景是key过期了我正才删除,此时aof会加一条del的命令将这个key给删除掉
问题:什么是脑裂
master在网络有问题的场景下,与sential断链了,但是还是接收的client的写请求,此时sentinel认为master断了重新选举master,当这个master网络环境恢复出现了两个master的场景,此时原来的master会被设置为slave数据清空,重更新新的matser的数据
这个时候会有几个问题:就是sentinel认为我我挂了,但是我master(老的)还在接收client的请求,等我好了你让我数据清空,那这些数据怎么办(data很重要)
redis采用的原则是:sentinel与master短链超过10s,master不接受任何client的请求,此时不会出现丢失,
选举master时:1.slave_priority 小的优先级高(最高100)2.slave 的offset多的优先成为master,3.在offset一致下,runid小的优先成为master,保证数据的最小丢失