Redis是一款key-vlue键值对的非关系型数据库,是一个开源的内存数据库,它可以作为数据库、缓存、消息中间件、分布式锁等多种用途。它支持多种数据结构,包括字符串string、哈希hasp、列表list、集合set、zset有序集合等,使得它可以灵活地应用于各种场景。
1.Redis在项目中的使用场景?
1.做缓存
2.分布式锁
3.做消息中间件
2.Redis的常见问题及解决方案:
1.什么是缓存穿透?
缓存穿透指的是不存在的数据,在reids中没有查询到,导致请求直接查询MySQL数据库。
解决方案:
1.对不存在的数据,设置为null值,保存在redis中,设置过期时间。
2.使用布隆过滤器,通过它进行数据过滤,需要注意给布隆过滤器设置预热。
2.什么是缓存击穿?
缓存击穿指的是在一个设置了过期时间的热点数据,在过期时间的点上,有大量的请求打过来,导致大量请求直接操作的是数据库,数据库直接被打垮了。
解决方案:
1.加互斥锁,效果是性能差,数据是强一致的。
2.设置逻辑过期时间,效果是高可用,性能好,数据一致低。
3.什么是缓存雪崩?
缓存雪崩指的是在同一时刻有大量的热点数据失效或者redis宕机,导致大量的请求直接操作数据库,导致数据库宕机。
解决方案:
1.给热点数据设置不同的过期时间。
2.设置哨兵模式,集群模式。
3.可以设置nginx和网关限流。
4.设置多级的缓存,一级缓存用Guava和Caffeine。
4.Mysql和Redis如何做到数据一致性的呢?
1.通过加读写锁的方式,保证数据的强一致性,性能比较低。
2.通过MQ的消息异步通知,保证数据的同步,数据最终一致性。
5.redis的持久化方式有哪些?
1.RDB持久化:定期的对redis的整段内存做数据快照。
2.AOF持久化:是记录操作redis的操作命令用日志记录的。
6.redis的数据过期策略有哪些?
1.惰性删除
当需要key的时候,检查这个key是否过期,过期就删除,没有就不管。
2.定期删除
定期的扫描一部分key,检查是否过期,有过期的就删除掉,没有的保留。
reids的过期策略用的是两者的配合使用。
7.redis的数据淘汰策略有哪些?
redis的内存不够用的时候,此时在向redis中添加数据,那么redis就会按照某种规则将内存的数据删除。
1.对全体数据不淘汰策略,不让继续写入(默认)。
2.对全体数据进行随机淘汰。
3.对全体数据,进行lru算法淘汰。
4.对全体数据,进行lfu算法淘汰。
5.对设置了过期时间的数据进行随机淘汰。
6.对设置了过期时间的数据,过期时间越小越先淘汰。
7.对设置了过期时间的数据,进行lru算法进行淘汰。
8.对设置了过期时间的数据,进行lfu算法进行淘汰。
8.redis的分布式锁是如何实现的?
采用的是setnx命令或者redisson。
场景:1.抢优惠券 2.秒杀3.库存超卖
用setnx实现:
用redisson实现:
9.什么是redis主从同步的?
redis的主从同步讲的是redis在主从模式下,主节点写,从节点读,保证主节点与从节点的数据一致。
10.什么是哨兵模式?
redis通过哨兵模式机制来实现主从集群的自动故障恢复。
11.什么是分片集群模式?
12.redis是单线程为什么那么快,原因是什么?
- 完全基于内存,C语言编写的
- 执行命令采用单线程,避免不必要的上下文切换
- 使用多路IO复用模型,非阻塞IO
解释一下IO复用模型是什么?
IO多路复用是指单个线程同时监听多个socket,并在某个socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。目前的IO多路复用都是采用的epoll模式实现,它会在通知用户进程socket就绪的同时,把已经就绪的socket写入到用户空间,不需要挨个遍历socket来判断是否就绪,提升性能。