问题一:Redis是单线程模型还是多线程模型?
Redis6.0之前,属于彻彻底底的单线程,Redis监听客户端连接,读写数据操作都是由一个单线程来完成,Redis6.0之后,引入了多线程,将客户端网络请求由一些线程来负责,但是数据读写操作仍然是单线程,单线程操作不会出现并发安全问题.
问题二:Redis为什么设计为单线程模型,速度也很快?
(1)Redis基于内存操作的
(2)底层是哈希表结构,时间复杂度O1
(3)io多路复用和非阻塞io
(4)单线程避免了线程间的切换
问题三:Redis key过期了为什么没有被释放?
在使用redis时,经常使用set命令,set除了设置key-value外,还可以设置过期时间,如果修改key的值,但只是单纯的使用set命令,而没有加上设置过期时间的参数,那这个key的过期时间将会被擦除,将会变为永远不过期
问题四:Redis一般对过期key的处理策略?
redis对过期key一般使用惰性删除和定时删除两种策略
(1)惰性删除:到期之后,不立即删除,在下次使用此key时,判断是否到期,到期后就删除
(2)定时删除:将过期的key记录下来,定期的对过期的key进行删除
问题5:redis key设置过期时间为什么被redis主动删除了?
当redis已用内存超过maxmemory,会触发内存清理策略
问题6:Redis持久化
因为redis数据,平时储存在内存中,一旦机器故障可能数据就会丢失,所以redis提供数据持久化机制,把内存中的数据,根据一定规则,写到硬盘中的文件中
RDB机制:
定期的将数据快照保存在一个dump.rdb文件中,数据快照就是内存中有许多的key-value保存到dump.rdb文件中,rdb方式就是redis默认的持久化方式,不需要配置开启,默认是支持的,里面有触发rdb保存快照的条件,在redis客户端模式中,使用shutdown save 关闭redis服务时,保存快照,重新启动redis服务时,把dump.rdb文件中的内容还原回来
AOF机制:
AOF是以记录日志的方式来记录所有写操作的命令,他是默认为不开启的
问题7:Redis事务
mulit 开启事务
命令1,命令2....
exec 执行事务
redis事务是将多条命令放入到一个队列中,保证多条命令,在同一条事务中执行,不受其他客户端的影响,他不保证原子性,即使命令执行错误,也不影响其他命令的执行
问题8:主从复制
大型项目(互联网电商),为了保证系统稳定,有一台服务作为主机,有多台服务作为从机,主机负责写数据,将数据同步到多台从机,从机负责读操作,从而实现读写分离
即使期间,有一台服务器出现问题,其他redis服务也可以正常工作,当有问题的服务故障排除后,可以继续在集群中工作,即使是主机故障,也可以从多台从机中,选出一台服务作为主机
必将存在代码冗余,服务冗余
负载均衡(有多台服务,有很多请求到达后,可以根据一些机制,来让请求到达不同的服务器)
实现高可用
问题9:哨兵机制
哨兵机制,哨兵是一个独立的任务,独立执行,定期的向集群中的redis发送消息,如果收不到消息,就表明redis服务由问题,通过一套选举机制,在多台从机中选出一台作为主机,当主机故障恢复后,临时主机又变为从机
问题10:key过期策略
在设置key时,key为key设置一个有效时间,当时间到达,redis有一套机制,可以用来删除过期的key
(1)立即删除
在设置key时,创建一个回调函数,当key的时间到了后,立即执行回调函数删除key
不浪费内存空间,到期就会删除
但是,如果大量的key同时到期,导致cpu荷载高
(2)惰性删除
到期之后,不立即删除,在下次使用此key时,判断是否到期,到期后就删除
会浪费内存空间
(3)定时删除
将过期的key记录下来,定期的对过期的key进行删除
问题11:缓存穿透,缓存击穿,缓存雪崩
一开始使用redis时,redis可以用来缓存数据,已达到对mysql的压力的缓解,不是用了redis就没有问题了,在极端的情况下也会出现问题
(1)缓存穿透
有一个数据,在数据库中本身就不存在,redis中也就没有每次查询的请求,依然还是会到达mysql,最终压垮mysql
(2)缓存击穿(互斥锁)
数据库中有数据,在某个时间节点上,某个热点key到期了,此时刚好有大量的请求到达,如果这时没有任何限制,同时查询redis,redis没有请求到达mysql,导致mysql被压垮
(3)缓存雪崩(设置随机过期时间,设置不过期)
大量的key过期,或者缓存出现故障,导致大量的key集体失效