测试开发面试题---Redis

Redis是一个基于键值对的内存数据库,因为是纯内存操作,Redis的性能十分优秀。同时,Redis支持如字符串、哈希、集合等多种数据结构;通过RDB和AOG持久化机制来确保数据不丢失;通过主从复制、哨兵模式和Redis集群避免单点部署从而实现Redis的高可用性。当前,Redis已经被用于计数器、排行榜、消息队列和缓存中。

Redis为什么这么快

  • 在内存上进行操作,减少了磁盘IO的次数
  • Redis是单线程的,它的网络IO和数据读写都是一个线程完成的,避免了锁竞争开销和上下文切换
  • 采用非阻塞IO模型,通过epoll进行客户端的链接,处理成千上万个并发连接
  • Redis的大部分操作都是原子性的,执行过程中不会被中断

缺点

  • 将数据完全存储在内存中,容量收到物理内存的影响,不能处理较大数据
  • 在持久化时,RDB可能会导致数据短暂的丢失,AOF则性能较差
  • 不能处理较为复杂的数据和任务(单线程)

Redis持久化机制

Redis提供了两种持久化机制,分别是RDB和AOF

  • RDB(快照持久化),Redis默认的持久化机制,它周期性将数据写入磁盘中。它保存的是二进制文件,文件较小,恢复速度快。但因为它是按照时间进行刷新,因此在Redis崩溃时可能会丢失最近一次的数据。
  • AOF(基于日志的持久化),它将所有的写操作都追加到文件末尾,通过设置不同的策略配置写入频率,保证了数据不丢失。因为保存的直接是数据,因此它的可读性较高。但同时它的文件较大,恢复速度慢,每次将写入操作加到日志中时需要进行磁盘IO,这会影响Redis性能,因此需要定期进行压缩。

Redis允许同时使用RDB和AOF文件,当同时使用RDB和AOF时,Redis会优先加载AOF文件,因为AOF记录了所有的写操作包含数据较完整。如果没有AOF则使用RDB文件,这种策略可以在提高系统可靠性同时拥有最灵活的恢复选项,即AOF受损或者过大时,只使用AOF可以快速恢复大部分数据,缺点是同时使用RDB和AOF会导致资源的消耗更大。

Redis的过期删除策略

  • 定时删除:在设置键值对的时候设置过期时间,一旦到达时间点,Redis会自动收回
  • 定期删除:周期性检查键值对是否过期,如果过期就删除
  • 懒惰删除:每次在使用键值对的时候进行判断是否过期,如果过期就删除

Redis是将定期删除和懒惰删除相结合的,它会周期性抽取一些键值对进行检查,如果过期就删除。但是这样会导致一些已经过期的键值对无法被删除,因此Redis采用懒惰删除方法,即在使用时候再次进行判断。

缓存击穿、缓存穿透和缓存雪崩

缓存击穿

热点数据过期,大量的请求在访问热点数据时无法在缓存中找到,只能去数据库中查找,导致数据库压力大。解决方法:1)对热点数据设置永不过期或者长时间过期;2)定期进行主动刷新,将已经过期的数据在使用前加载到缓存中;3)使用互斥锁技术,确保只有一个线程访问数据库。

缓存穿透

访问一个根本不存在的值导致缓存失效。解决方法:1)对于访问到不存在的值为其设置为null;2)使用过滤器预测数据是否存在;3)在应用层对于设置的参数进行判断,过滤掉明显不存在的值。

缓存雪崩

大量的数据因为一些原因同时失效,导致请求全部落在数据库上。解决方法:1)为数据设置不同的过期时间(采用固定时间+随机因子);2)定期进行主动刷新,避免大量数据的过期。

高并发场景下,Redis的处理策略

  • 数据分区:通过哈希槽实现数据的分布式存储,将数据分布到多个Redis上面,分散请求压力,提高并发处理能力。
  • 读写分离+主从复制:使用主节点作为数据写操作,多个从节点作为数据读操作,提高读的吞吐量。
  • 管道:使用管道一次性发送多个数据,减少数据往返延迟
  • 合理设置缓存策略:合理设置键的过期时间,避免发生缓存失效问题

Redis如何实现分布式锁

分布式锁是指跨进程和跨机器节点的互斥锁,它可以保证多个机器节点对共享资源访问排他性。Redis实现分布式锁是基于它的原子操作实现的,客户端首先设置set命令设置一个唯一标识的键值对,然后使用NX(键不存在时可以设置成功)和EX(设置键的过期时间),如果设置成功则说明获得了锁,释放锁时先使用GET命令查看自己是否持有锁,如果持有则使用DEL进行删除。

MySQL和Redis的双写一致性

MySQL与Redis的双写一致性是指使用MySQL作为主数据库,使用Redis作为缓存架构时,保证它们的一致性。

  • 延迟双删,先删除缓存在更新数据库、停顿一段时间在删除缓存
  • 使用MySQL的binlog订阅将数据同步到Redis中,他能保证数据的最终一致性
  • 将读操作与写操作分开,在MySql中进行写操作,在Redis中进行读操作,如果无法读出则查找MySQL并将查找内容同步到Redis中

如何实现Redis的高可用性

高可用性包括确保数据不丢失和Redis服务不中断,Redis通过RDB和AOF持久化机制来避免数据的丢失,通过多点部署来确保Redis服务不中断。Redis通过主从复制、哨兵模式和Redis集群实现多点部署。

  • 主从复制:部署多个服务器有主库和从库,其中主库用于写操作、从库用于读操作。如果主库挂了,升级从库作为新的主库。
  • 哨兵模式:由一个或者多个哨兵组成的哨兵系统,哨兵可以通过向主节点发送ping命令来检查当前被检查节点是否挂机,如果挂机则选择一个从节点作为新的主节点。同时,为了避免如果只有一个哨兵出现问题,设置了多个哨兵进行监督,同时哨兵之间也会相互检查。
  • Redis集群:无论是主从复制还是哨兵模式,它们每个节点上存储的数据都是一样的,这不利于扩容,Redis集群通过哈希槽实现了数据的分布式存储,每个Redis节点上存储着不同的内容,这可以保存大量的数据。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值