东莞市专注网站建设平台,建设项目自主验收网站,网络营销服务管理,深圳网站建设 制作元缓存中间件Redis常考知识点 1 什么是RDB和AOF2 Redis的过期键的删除策略3 简述Redis事务实现4 Redis 主从复制的核⼼原理5 Redis有哪些数据结构#xff1f;分别有哪些典型的应⽤场景#xff1f;6 Redis分布式锁底层是如何实现的#xff1f;7 Redis主从复制的核⼼原理8 Redis… 缓存中间件Redis常考知识点 1 什么是RDB和AOF2 Redis的过期键的删除策略3 简述Redis事务实现4 Redis 主从复制的核⼼原理5 Redis有哪些数据结构分别有哪些典型的应⽤场景6 Redis分布式锁底层是如何实现的7 Redis主从复制的核⼼原理8 Redis集群策略9 缓存穿透、缓存击穿、缓存雪崩分别是什么10 Redis和Mysql如何保证数据⼀致11 Redis的持久化机制12 Redis单线程为什么这么快 前言 如果需要在linux环境中搭建一个redis服务参考 Linux环境下搭建使用缓存中间件Redis 如果需要掌握redis的常考知识点参考 缓存中间件Redis必知必会
1 什么是RDB和AOF
RDBRedis DataBase在指定的时间间隔内将内存中的数据集快照写⼊磁盘实际操作过程是fork⼀个⼦进程先将数据集写⼊临时⽂件写⼊成功后再替换之前的⽂件⽤⼆进制压缩存储。 优点 整个Redis数据库将只包含⼀个⽂件 dump.rdb⽅便持久化。容灾性好⽅便备份。性能最⼤化fork ⼦进程来完成写操作让主进程继续处理命令所以是 IO 最⼤化。使⽤单独⼦ 进程来进⾏持久化主进程不会进⾏任何 IO 操作保证了 redis 的⾼性能相对于数据集⼤时⽐ AOF 的启动效率更⾼。 缺点 数据安全性低。RDB 是间隔⼀段时间进⾏持久化如果持久化之间 redis 发⽣故障会发⽣数据丢 失。所以这种⽅式更适合数据要求不严谨的时候)由于RDB是通过fork⼦进程来协助完成数据持久化⼯作的因此如果当数据集较⼤时可能会导致整个服务器停⽌服务⼏百毫秒甚⾄是1秒钟。 AOFAppend Only File以⽇志的形式记录服务器所处理的每⼀个写、删除操作查询操作不会记录以⽂本的⽅式记录可以打开⽂件看到详细的操作记录 优点 数据安全Redis中提供了3中同步策略即每秒同步、每修改同步和不同步。事实上每秒同步也 是异步完成的其效率也是⾮常⾼的所差的是⼀旦系统出现宕机现象那么这⼀秒钟之内修改的数据将会丢失。⽽每修改同步我们可以将其视为同步持久化即每次发⽣的数据变化都会被⽴即 记录到磁盘中。。通过 append 模式写⽂件即使中途服务器宕机也不会破坏已经存在的内容可以通过 redischeck-aof ⼯具解决数据⼀致性问题。AOF 机制的 rewrite 模式。定期对AOF⽂件进⾏重写以达到压缩的⽬的 缺点 AOF ⽂件⽐ RDB ⽂件⼤且恢复速度慢。数据集⼤的时候⽐ rdb 启动效率低。运⾏效率没有RDB⾼ AOF⽂件⽐RDB更新频率⾼优先使⽤AOF还原数据AOF⽐RDB更安全也更⼤RDB性能⽐AOF好如果两个都配了优先加载AOF
2 Redis的过期键的删除策略
Redis是key-value数据库我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了Redis如何处理。 惰性过期只有当访问⼀个key时才会判断该key是否已过期过期则清除。该策略可以最⼤化地节省CPU资源却对内存⾮常不友好。极端情况可能出现⼤量的过期key没有再次被访问从⽽不 会被清除占⽤⼤量内存。 定期过期每隔⼀定的时间会扫描⼀定数量的数据库的expires字典中⼀定数量的key并清除其中已过期的key。该策略是⼀个折中⽅案。通过调整定时扫描的时间间隔和每次扫描的限定耗时可以在不同情况下使得CPU和内存资源达到最优的平衡效果。 (expires字典会保存所有设置了过期时间的key的过期时间数据其中key是指向键空间中的某个键的指针value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有 键。) Redis中同时使⽤了惰性过期和定期过期两种过期策略。
3 简述Redis事务实现 1、事务开始 MULTI命令的执⾏标识着⼀个事务的开始。MULTI命令会将客户端状态的 flags 属性中打开 REDIS_MULTI标识来完成的。 2、命令⼊队 当⼀个客户端切换到事务状态之后服务器会根据这个客户端发送来的命令来执⾏不同的操作。如果客户端发送的命令为MULTI、EXEC、WATCH、DISCARD中的⼀个⽴即执⾏这个命令否则将命令放⼊⼀个事务队列⾥⾯然后向客户端返回QUEUED 回复 如果客户端发送的命令为 EXEC、DISCARD、WATCH、MULTI 四个命令的其中⼀个那么服务 器⽴即执⾏这个命令。如果客户端发送的是四个命令以外的其他命令那么服务器并不⽴即执⾏这个命令。⾸先检查此命令的格式是否正确如果不正确服务器会在客户端状态redisClient的flags 属性关闭 REDIS_MULTI 标识并且返回错误信息给客户端。如果正确将这个命令放⼊⼀个事务队列⾥⾯然后向客户端返回QUEUED 回复 事务队列是按照FIFO的⽅式保存⼊队的命令 3、事务执⾏ 客户端发送 EXEC 命令服务器执⾏ EXEC 命令逻辑。 如果客户端状态的 flags 属性不包含 REDIS_MULTI 标识或者包含 REDIS_DIRTY_CAS 或者 REDIS_DIRTY_EXEC 标识那么就直接取消事务的执⾏。否则客户端处于事务状态flags 有 REDIS_MULTI 标识服务器会遍历客户端的事务队列然后执⾏事务队列中的所有命令最后将返回结果全部返回给客户端 redis不⽀持事务回滚机制但是它会检查每⼀个事务中的命令是否错误。 Redis 事务不⽀持检查那些程序员⾃⼰逻辑错误。例如对 String 类型的数据库键执⾏对 HashMap 类型 的操作 WATCH命令是⼀个乐观锁可以为 Redis 事务提供 check-and-set CAS⾏为。可以监控⼀个或多个键⼀旦其中有⼀个键被修改或删除之后的事务就不会执⾏监控⼀直持续到EXEC 命令。MULTI命令⽤于开启⼀个事务它总是返回OK。MULTI执⾏之后客户端可以继续向服务器发送任意多条命令这些命令不会⽴即被执⾏⽽是被放到⼀个队列中当 EXEC命令被调⽤时所有队列 中的命令才会被执⾏。EXEC执⾏所有事务块内的命令。返回事务块内所有命令的返回值按命令执⾏的先后顺序排列。 当操作被打断时返回空值 nil 。通过调⽤DISCARD客户端可以清空事务队列并放弃执⾏事务 并且客户端会从事务状态中退出。UNWATCH命令可以取消watch对所有key的监控。 4 Redis 主从复制的核⼼原理
通过执⾏slaveof命令或设置slaveof选项让⼀个服务器去复制另⼀个服务器的数据。主数据库可以进⾏读写操作当写操作导致数据变化时会⾃动将数据同步给从数据库。⽽从数据库⼀般是只读的并接受主数据库同步过来的数据。⼀个主数据库可以拥有多个从数据库⽽⼀个从数据库只能拥有⼀个主数据库。 全量复制
主节点通过bgsave命令fork⼦进程进⾏RDB持久化该过程是⾮常消耗CPU、内存(⻚表复制)、硬盘IO的主节点通过⽹络将RDB⽂件发送给从节点对主从节点的带宽都会带来很⼤的消耗从节点清空⽼数据、载⼊新RDB⽂件的过程是阻塞的⽆法响应客户端的命令如果从节点执⾏bgrewriteaof也会带来额外的消耗
部分复制
复制偏移量执⾏复制的双⽅主从节点分别会维护⼀个复制偏移量offset复制积压缓冲区主节点内部维护了⼀个固定⻓度的、先进先出(FIFO)队列 作为复制积压缓冲区 当主从节点offset的差距过⼤超过缓冲区⻓度时将⽆法执⾏部分复制只能执⾏全量复制。服务器运⾏ID(runid)每个Redis节点都有其运⾏ID运⾏ID由节点在启动时⾃动⽣成主节点会将⾃⼰的运⾏ID发送给从节点从节点会将主节点的运⾏ID存起来。 从节点Redis断开重连的时候就是根据运⾏ID来判断同步的进度 如果从节点保存的runid与主节点现在的runid相同说明主从节点之前同步过主节点会继续尝试使⽤部分复制(到底能不能部分复制还要看offset和复制积压缓冲区的情况)如果从节点保存的runid与主节点现在的runid不同说明从节点在断线前同步的Redis节点并不是当前的主节点只能进⾏全量复制。
5 Redis有哪些数据结构分别有哪些典型的应⽤场景
字符串可以⽤来做最简单的数据可以缓存某个简单的字符串也可以缓存某个json格式的字符串Redis分布式锁的实现就利⽤了这种数据结构还包括可以实现计数器、Session共享、分布式ID哈希表可以⽤来存储⼀些key-value对更适合⽤来存储对象列表Redis的列表通过命令的组合既可以当做栈也可以当做队列来使⽤可以⽤来缓存类似微信公众号、微博等消息流数据集合和列表类似也可以存储多个元素但是不能重复集合可以进⾏交集、并集、差集操作从⽽可以实现类似我和某⼈共同关注的⼈、朋友圈点赞等功能有序集合集合是⽆序的有序集合可以设置顺序可以⽤来实现排⾏榜功能
6 Redis分布式锁底层是如何实现的
⾸先利⽤setnx来保证如果key不存在才能获取到锁如果key存在则获取不到锁然后还要利⽤lua脚本来保证多个redis操作的原⼦性同时还要考虑到锁过期所以需要额外的⼀个看⻔狗定时任务来监听锁是否需要续约同时还要考虑到redis节点挂掉后的情况所以需要采⽤红锁的⽅式来同时向N/21个节点申请锁都申请到了才证明获取锁成功这样就算其中某个redis节点挂掉了锁也不能被其他客户端获取到
7 Redis主从复制的核⼼原理
Redis的主从复制是提⾼Redis的可靠性的有效措施主从复制的流程如下
集群启动时主从库间会先建⽴连接为全量复制做准备主库将所有数据同步给从库。从库收到数据后在本地完成数据加载这个过程依赖于内存快照RDB在主库将数据同步给从库的过程中主库不会阻塞仍然可以正常接收请求。否则redis的服务就被中断了。但是这些请求中的写操作并没有记录到刚刚⽣成的RDB⽂件中。为了保证主从库的数据⼀致性主库会在内存中⽤专⻔的replication buffer记录RDB⽂件⽣成收到的所有写操作。最后也就是第三个阶段主库会把第⼆阶段执⾏过程中新收到的写命令再发送给从库。具体的操作是当主库完成RDB⽂件发送后就会把此时replocation buffer中修改操作发送给从库从库再执⾏这些操作。这样⼀来主从库就实现同步了后续主库和从库都可以处理客户端读操作写操作只能交给主库处理主库接收到写操作后还会将写操作发送给从库实现增量同步
8 Redis集群策略
Redis提供了三种集群策略
主从模式这种模式⽐较简单主库可以读写并且会和从库进⾏数据同步这种模式下客户端直接连主库或某个从库但是但主库或从库宕机后客户端需要⼿动修改IP另外这种模式也⽐较难进⾏扩容整个集群所能存储的数据受到某台机器的内存容量所以不可能⽀持特⼤数据量哨兵模式这种模式在主从的基础上新增了哨兵节点但主库节点宕机后哨兵会发现主库节点宕机然后在从库中选择⼀个库作为进的主库另外哨兵也可以做集群从⽽可以保证但某⼀个哨兵节点宕机后还有其他哨兵节点可以继续⼯作这种模式可以⽐较好的保证Redis集群的⾼可⽤但是仍然不能很好的解决Redis的容量上限问题。Cluster模式Cluster模式是⽤得⽐较多的模式它⽀持多主多从这种模式会按照key进⾏槽位的分配可以使得不同的key分散到不同的主节点上利⽤这种模式可以使得整个集群⽀持更⼤的数据Redis分布式锁底层是如何实现的Redis主从复制的核⼼原理Redis集群策略容量同时每个主节点可以拥有⾃⼰的多个从节点如果该主节点宕机会从它的从节点中选举⼀个新的主节点。 对于这三种模式如果Redis要存的数据量⼤可以选择哨兵模式如果Redis要存的数据量⼤并且需要持续的扩容那么选择Cluster模式。
9 缓存穿透、缓存击穿、缓存雪崩分别是什么
缓存中存放的⼤多都是热点数据⽬的就是防⽌请求可以直接从缓存中获取到数据⽽不⽤访问Mysql。
缓存雪崩如果缓存中某⼀时刻⼤批热点数据同时过期那么就可能导致⼤量请求直接访问Mysql了解决办法就是在过期时间上增加⼀点随机值另外如果搭建⼀个⾼可⽤的Redis集群也是防⽌缓存雪崩的有效⼿段缓存击穿和缓存雪崩类似缓存雪崩是⼤批热点数据失效⽽缓存击穿是指某⼀个热点key突然失效也导致了⼤量请求直接访问Mysql数据库这就是缓存击穿解决⽅案就是考虑这个热点key不设过期时间缓存穿透假如某⼀时刻访问redis的⼤量key都在redis中不存在⽐如⿊客故意伪造⼀些乱七⼋糟的key那么也会给数据造成压⼒这就是缓存穿透解决⽅案是使⽤布隆过滤器它的作⽤就是如果它认为⼀个key不存在那么这个key就肯定不存在所以可以在缓存之前加⼀层布隆过滤器来拦截不存在的key
10 Redis和Mysql如何保证数据⼀致
先更新Mysql再更新Redis如果更新Redis失败可能仍然不⼀致先删除Redis缓存数据再更新Mysql再次查询的时候在将数据添加到缓存中这种⽅案能解决⽅案的问题但是在⾼并发下性能较低⽽且仍然会出现数据不⼀致的问题⽐如线程1删除了Redis缓存数据正在更新Mysql此时另外⼀个查询再查询那么就会把Mysql中⽼数据⼜查到Redis中延时双删步骤是先删除Redis缓存数据再更新Mysql延迟⼏百毫秒再删除Redis缓存数据这样就算在更新Mysql时有其他线程读了Mysql把⽼数据读到了Redis中那么也会被删除掉从⽽把数据保持⼀致
11 Redis的持久化机制
RDBRedis DataBase 将某⼀个时刻的内存快照Snapshot以⼆进制的⽅式写⼊磁盘。 ⼿动触发
save命令使 Redis 处于阻塞状态直到 RDB 持久化完成才会响应其他客户端发来的命令所以在⽣产环境⼀定要慎⽤bgsave命令fork出⼀个⼦进程执⾏持久化主进程只在fork过程中有短暂的阻塞⼦进程创建之后主进程就可以响应客户端请求了
⾃动触发
save m n 在 m 秒内如果有 n 个键发⽣改变则⾃动触发持久化通过bgsave执⾏如果设置多个、只要满⾜其⼀就会触发配置⽂件有默认配置(可以注释掉)flushall⽤于清空redis所有的数据库flushdb清空当前redis所在库数据(默认是0号数据库)会清空RDB⽂件同时也会⽣成dump.rdb、内容为空
主从同步全量同步时会⾃动触发bgsave命令⽣成rdb发送给从节点 优点 整个Redis数据库将只包含⼀个⽂件 dump.rdb⽅便持久化。容灾性好⽅便备份。性能最⼤化fork ⼦进程来完成写操作让主进程继续处理命令所以是 IO 最⼤化。使⽤单独⼦进程来进⾏持久化主进程不会进⾏任何 IO 操作保证了 redis 的⾼性能相对于数据集⼤时⽐ AOF的启动效率更⾼。 缺点 数据安全性低。RDB 是间隔⼀段时间进⾏持久化如果持久化之间 redis 发⽣故障会发⽣数据丢失。所以这种⽅式更适合数据要求不严谨的时候)由于RDB是通过fork⼦进程来协助完成数据持久化⼯作的因此如果当数据集较⼤时可能会导致整个服务器停⽌服务⼏百毫秒甚⾄是1秒钟。会占⽤cpu AOFAppend Only File 以⽇志的形式记录服务器所处理的每⼀个写、删除操作查询操作不会记录以⽂本的⽅式记录可以打开⽂件看到详细的操作记录调操作系统命令进程刷盘
所有的写命令会追加到 AOF 缓冲中。AOF 缓冲区根据对应的策略向硬盘进⾏同步操作。随着 AOF ⽂件越来越⼤需要定期对 AOF ⽂件进⾏重写达到压缩的⽬的。当 Redis 重启时可以加载 AOF ⽂件进⾏数据恢复。同步策略 每秒同步异步完成效率⾮常⾼⼀旦系统出现宕机现象那么这⼀秒钟之内修改的数据将会丢失每修改同步同步持久化每次发⽣的数据变化都会被⽴即记录到磁盘中最多丢⼀条 不同步由操作系统控制可能丢失较多数据 优点 数据安全通过 append 模式写⽂件即使中途服务器宕机也不会破坏已经存在的内容可以通过 redischeck-aof ⼯具解决数据⼀致性问题。AOF 机制的 rewrite 模式。定期对AOF⽂件进⾏重写以达到压缩的⽬的 缺点 AOF ⽂件⽐ RDB ⽂件⼤且恢复速度慢。数据集⼤的时候⽐ rdb 启动效率低。运⾏效率没有RDB⾼ 对⽐ 1. AOF⽂件⽐RDB更新频率⾼优先使⽤AOF还原数据。AOF⽐RDB更安全也更⼤ 2. RDB性能⽐AOF好 3. 如果两个都配了优先加载AOF
12 Redis单线程为什么这么快
Redis基于Reactor模式开发了⽹络事件处理器、⽂件事件处理器fileeventhandler。它是单线程的 所以 Redis才叫做单线程的模型它采⽤IO多路复⽤机制来同时监听多个Socket根据Socket上的事件类型来选择对应的事件处理器来处理这个事件。可以实现⾼性能的⽹络通信模型⼜可以跟内部其他单线程的模块进⾏对接保证了 Redis内部的线程模型的简单性。 ⽂件事件处理器的结构包含4个部分多个Socket、IO多路复⽤程序、⽂件事件分派器以及事件处理器命令请求处理器、命令回复处理器、连接应答处理器等。 多个 Socket 可能并发的产⽣不同的事件IO多路复⽤程序会监听多个 Socket会将 Socket 放⼊⼀个队列中排队每次从队列中有序、同步取出⼀个 Socket 给事件分派器事件分派器把 Socket 给对应的事件处理器。 然后⼀个 Socket 的事件处理完之后IO多路复⽤程序才会将队列中的下⼀个 Socket 给事件分派器。⽂件事件分派器会根据每个 Socket 当前产⽣的事件来选择对应的事件处理器来处理。
Redis启动初始化时将连接应答处理器跟AE_READABLE事件关联。若⼀个客户端发起连接会产⽣⼀个AE_READABLE事件然后由连接应答处理器负责和客户端建⽴ 连接创建客户端对应的socket同时将这个socket的AE_READABLE事件和命令请求处理器关联使 得客户端可以向主服务器发送命令请求。当客户端向Redis发请求时不管读还是写请求客户端socket都会产⽣⼀个AE_READABLE事件触发命令请求处理器。处理器读取客户端的命令内容 然后传给相关程序执⾏。当Redis服务器准备好给客户端的响应数据后会将socket的AE_WRITABLE事件和命令回复处理器关联当客户端准备好读取响应数据时会在socket产⽣⼀个AE_WRITABLE事件由对应命令回复处 理器处理即将准备好的响应数据写⼊socket供客户端读取。命令回复处理器全部写完到 socket 后就会删除该socket的AE_WRITABLE事件和命令回复处理器的映射。
单线程快的原因 1. 纯内存操作 2. 核⼼是基于⾮阻塞的IO多路复⽤机制 3. 单线程反⽽避免了多线程的频繁上下⽂切换带来的性能问题