redis进阶问题

Redis是一种内存数据库,其在6.0之前采用单线程模型,以避免并发问题并利用IO多路复用提高效率。数据读写仍保持单线程,以保证数据一致性。Redis的过期策略包括惰性删除和定时删除。为确保数据安全,Redis提供RDB和AOF两种持久化机制。此外,主从复制和哨兵机制用于实现高可用性和故障恢复。缓存问题如穿透、击穿和雪崩是使用Redis时需要考虑的挑战。
摘要由CSDN通过智能技术生成

问题一: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集体失效

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值