Java面试——Redis

题目来自于网络收集,自己保存学习,希望也能帮助到你

Redis

  1. 什么是redis
    1. 远程字典服务,是一种基于键值对的NoSQL数据库,redis会将所有的数据存放在内存中(掉电数据会被清空),读取速度非常快。
    2. 特性:基于键值对、读写速度快、数据结构丰富、简单稳定、支持持久化、支持事务(原子性)、主从复制、高可用与分布式。
  2. 为什么说redis的速度特别快呢
    1. Redis中所有的数据都是存储在内存中,CPU对内存的访问速度远大于外存
    2. 基于C语言实现,执行速度更快
    3. 使用多路I/O复用模型,非阻塞IO
    4. 采用单线程架构,避免了不必要的上下文切换和竞争条件,线程安全
  3. 为什么要用redis
    1. 高性能:将用户访问数据存在缓存中,下一次访问的时候直接访问缓存速度快
    2. 高并发:将数据库中的高热点的数据存放于缓存中,这样访问数据的部分请求会访问缓存。
  4. Redis的数据类型有哪些
    1. String:最基础的数据结果,使用场景:缓存、计数器、对象存储缓存、限速
    2. List:简单的字符串列表,使用场景:消息队列、栈、文章列表等
    3. Set:String类型的无序去重集合,使用场景:标签等
    4. Hash:键值对的集合,使用场景:用户信息缓存
    5. Zset:无序的可重复的集合,使用场景:排行榜系统、成绩单、工资表等
  5. Redis能做什么
    1. 缓存、分布式锁、限流、消息队列、活跃用户、排行榜
  6. Redis如何实现异步队列
    1. 使用list类型保存数据信息,rpush生产信息,lpop消费信息,当lpop没有信息的时候可以sleep一段时间然后再检查有没有信息,也可以使用blpop,在没有信息的时候会一直阻塞,直到信息的到来。
    2. Redis也可以通过pub/sub主题订阅模式实现一个生产者,多个消费者。
  7. Redis如何实现延时队列
    1. 使用sortedset,使用时间戳做score,消息内容作为key,调用zadd来生产消息,消费者使用zrangbyscore获取n秒之前的数据做轮询处理
  8. Redis的持久化机制是什么,各自有什么优缺点
    1. RDB机制:redis每隔一段时间会把当前进程数据生成快照保存到硬盘,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照周期
    2. AOF机制:指所有的命令行记录以redis命令请求协议的格式完全持久化存储,保存为aof日志文件,重启时重新执行AOF文件中的命令来恢复文件
  9. RDB机制
    1. 优点:只有一个dump.rdb文件,方便持久化、容灾性好,一个文件可以保存到安全的磁盘方便备份、性能最大化,fork子进程来完成操作,让主进程继续处理命令,所以时IO最大化、相对于数据集大时,比AOF的启动效率更高。
    2. 缺点:安全性能低,如果持久化之间发生故障,数据会丢失、如果数据集较大可能会导致服务器停止服务几百毫秒甚至一秒钟
  10. AOF持久化方式
    1. 优点:数据安全,aof持久化可以配置appendfsync属性、通过append模式写文件,即使中途服务宕机,可以通过redis-check-aof工具解决数据一致性问题、
    2. 缺点:AOF文件比RDB文件大,恢复速率低
  11. Redis的过期键的删除策略
    1. 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除
    2. 惰性过期:只有当访问一个key时,才会判断该key是否过期,过期则清除
    3. 定期过期:每隔一段时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。
  12. Redis的内存淘汰策略有哪些
    1. Redis淘汰策略是指redis的用于内存缓存不足时,怎样处理需要新写入且需要申请额外空间的数据
    2. 淘汰策略:写入报错、LRU、随机移除key、在设置过期时间的key中使用LRU、在设置过期时间的key中随机移除、移除最早过期的数据
  13. 如何批量找出已知前缀开头的key
    1. 使用keys指令可以扫出指定模式的key列表。
  14. Redis事务控制
    1. 事务的本质时一组命令集合,一次执行多个指令。其执行与MYSQL事务类似,要么全部执行要么都不执行。
    2. Redis事务支持隔离性不保证原子性
  15. 通过事务实现上锁
    1. 监视、加锁(watch)
    2. 取消监视、释放锁(unwatch)
  16. Redis集群方案
    1. 主从复制:主数据库读写,副数据库只读
    2. 全量复制
    3. 部分复制
  17. Redis哨兵模式
    1. 是redis集群一个非常重要的组件
    2. 作用是:
    3. 群监控:负责监控master和slave进行是否正常工作
    4. 消息通知:如果某一个redis实例有故障则哨兵负责发送消息作为报警给管理员
    5. 故障转移:如果master node挂掉了,会自动转移到slave node上
    6. 配置中心:如果故障发生转移,通知client客户端新的master地址
  18. Redis实现分布式锁
    1. 实现方式:setNX、Radisson,redlock
    2. SetNX:指定的key不存在时,才能操作成功,为key设置指定的值
    3. Redisson:原理:使用redis hash结构存储锁信息;其通过Lua脚本实现加锁的原子性操作,确保在分布式环境中多个客户端竞争锁时不会出现竞态条件、提供WatchDog机制,解决客户端崩溃锁无法释放的问题、释放锁也是通过 Lua脚本实现
    4. 设置锁:给所有服务节点设置相同的key,返回为0,则获取锁失败
    5. 删除锁:判断线程唯一标志,再删除
  19. Redis缓存三大问题
    1. 缓存穿透:查询的数据在数据库和缓存中都不存在,但是用户依然有大量的请求访问该数据,导致每次请求都会到数据库,造成数据库宕机
      1. 解决方案:对不存在的数据设置空缓存、
      2. 设置布隆过滤器
    2. 缓存击穿:redis中的一个热点key过期,此时大量的请求过来,导致请求直接打到数据库上,造成数据库宕机
      1. 解决方案:设置互斥锁、
      2. 设置热点key永不过期、
      3. 设置定时更新
    3. 缓存雪崩:redis中的缓存大面积同时过期或者时redis宕机,导致大量的请求直接打到数据库,造成数据库宕机
      1. 对数据设置过期时间+随机数,避免大量热点key同时失效
      2. 设置服务熔断或者请求限流机制
      3. 搭建redis高可靠集群,提高数据库容灾能力
  20. 如何保证缓存与数据库双写时的数据一致性
    1. 先删除缓存,再更新数据库:需要读请求和写请求串行化,但是会严重影响系统吞吐量
    2. 先更新数据库再删除缓存:
    3. 先删除缓存再更新数据库然后异步延迟一段时间再去删除一次缓存

你可能感兴趣的:(java,面试,redis)