redis你要了解的常见问题

redis的使用场景:


redis你要了解的常见问题_第1张图片
大致redis流程图

问题:redis的部署方式:

单机模式(自己玩的)

哨兵模式(了解常用)

redis - cluster(集群模式)

问题:什么是缓存穿透/缓存击穿/雪崩

缓存穿透:

缓存及DB都没有数据的时候,有用户恶劣一直访问,导致大量的数据落到mysql上。导致崩溃

解决:进行用户校验,当数据库和redis均没有该key值时候,设置一个key-null,给key设置一个短暂的时间

讲一下布隆过滤器

大致流程图如下

redis你要了解的常见问题_第2张图片
网图

布隆过滤器的大致思路是:当一个值加入集合的时候,通过一些hash函数映射到一个数组中的k个点,将这k个点置为1,检索的时候就看这些点是不是1,就知道这个集合中有没有该值如果有一个值对应不上为0,那就表明集合不可能存在该值。

实现代码:

redis你要了解的常见问题_第3张图片
BloomFilter

缓存击穿

缓存中没有该数据的缓存,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,保证数据的最小丢失

请问怎么保持redis缓存和数据库强一致性?有好的解决方案吗?

你可能感兴趣的:(redis你要了解的常见问题)