当前位置: 首页 > news >正文

扁平风格网站模板网站备案升级

扁平风格网站模板,网站备案升级,广东省住房和城乡建设部网站,湖南云网站建设【Java八股文】07-Redis面试篇 Redis面试篇认识redis为什么用 Redis 作为 MySQL 的缓存#xff1f; 数据结构讲一下Redis底层的数据结构ZSet底层是由什么实现的 线程模型Redis 是单线程吗#xff1f;Redis怎么进行I/O多路复用的#xff1f;Redis 采用单线程为什么还这么快 数据结构讲一下Redis底层的数据结构ZSet底层是由什么实现的 线程模型Redis 是单线程吗Redis怎么进行I/O多路复用的Redis 采用单线程为什么还这么快 事务Redis锁有哪几种实现方式如何实现redis 原子性Redis中incr命令保证原子性的原理是什么redis分布式锁的时钟问题 持久化及日志Redis有哪些持久化方式分别的优缺点是什么 缓存淘汰及过期删除过期删除策略和内存淘汰策略有什么区别Redis 持久化时对过期键会如何处理的 Redis集群Redis 如何实现服务高可用在全量同步的时候增量同步消息产生怎么保证数据的一致性集群脑裂导致数据丢失怎么办redis集群下执行Lua注意什么redis集群下执行Lua如何保证多个key落到同个redis节点分布式锁了吗怎么用的 缓存设计如何避免缓存雪崩、缓存击穿、缓存穿透布隆过滤器原理介绍一下常见的缓存更新策略数据库和缓存如何保证一致性 Redis实战Redis 如何实现延迟队列Redis 的大 key 如何处理Redis 的热 key 如何处理如何设计秒杀场景处理高并发以及超卖现象Redis 分布式锁的原理Redis 管道有什么用Redis 事务支持回滚吗怎么保证本地缓存和redis缓存一致 Redis面试篇 认识redis Redis 是一个高性能的内存数据库它支持多种数据结构在底层实现中通过多种精心设计的数据结构来实现其高效的操作。 为什么用 Redis 作为 MySQL 的缓存 redis特点 高性能数据存储在内存里读取和写入都非常快比硬盘上的 MySQL 快很多。响应速度在毫秒级别。高并发Redis 能同时处理大量请求支持高并发场景避免了多线程的性能瓶颈。 为什么用 Redis 缓存 MySQL 减轻 MySQL 压力频繁查询的数据放在 Redis 中减少 MySQL 的负担。提升读取速度热点数据可以直接从 Redis 获取不用每次都查询数据库。防止缓存问题Redis 有很多机制可以避免缓存穿透、击穿等问题确保数据稳定。 数据结构 讲一下Redis底层的数据结构 字符串String缓存对象、常规计数、分布式锁、共享 session 信息等。 底层是一个简单的 动态字符串SDS。支持动态增长可以容纳任意类型的数据字符串、整数、浮点数、二进制数据等。 哈希Hash存储对象类型数据如用户信息、商品属性等。 底层是 哈希表用来存储键值对。 列表List队列、消息队列、任务调度等。 底层是 双向链表 集合Set去重、标签系统、好友关系等。有序集合ZSet排行榜、延迟队列、定时任务等。 ZSet底层是由什么实现的 Zset 类型的底层数据结构是由跳表实现的 跳表SkipList是一种用来保持有序元素的数据结构它通过多个层次的链表加速查找操作。简单来说跳表是一个由多个链表构成的结构每一层链表都比上一层少一些元素允许通过跳跃的方式快速查找。 多层结构通过多层链表跳表减少了查找时需要遍历的节点数量尤其是当数据量很大时可以大大提高查找效率。随机化跳表的随机化机制保证了插入和查找的时间复杂度平均为 O(log N)即使数据量很大查询效率仍然非常高。 线程模型 Redis 是单线程吗 Redis 单线程指的是「接收客户端请求-解析请求 -进行数据读写等操作-发送数据给客户端」这个过程是由一个线程主线程来完成的这也是我们常说 Redis 是单线程的原因。 但是Redis 程序并不是单线程的Redis 在启动的时候为「关闭文件、AOF 刷盘、释放内存」这些任务创建单独的线程来处理。是因为这些任务的操作都是很耗时的很容易发生阻塞这样就无法处理后续的请求了。 并且在后续发展中网络I/O也会限制Redis的性能为了提高网络 I/O 的并行度Redis 6.0 对于网络 I/O 采用多线程来处理。 因此在Redis6.0后Redis 在启动的时候默认情况下会额外创建 6 个线程这里的线程数不包括主线程 Redis-server Redis的主线程主要负责执行命令。bio_close_file、bio_aof_fsync、bio_lazy_free三个后台线程分别异步处理关闭文件任务、AOF刷盘任务、释放内存任务io_thd_1、io_thd_2、io_thd_3三个 I/O 线程io-threads 默认是 4 所以会启动 34-1个 I/O 多线程用来分担 Redis 网络 I/O 的压力。 Redis怎么进行I/O多路复用的 Redis 采用了 事件驱动模型即使用一个单线程处理所有客户端连接的请求。这个线程会 循环监听 事件并响应相应的请求。 Redis 初始化的时候会做下面这几件事情 首先调用 epoll_create() 创建一个 epoll 对象和调用 socket() 创建一个服务端 socket然后调用 bind() 绑定端口和调用 listen() 监听该 socket然后将调用 epoll_ctl() 将 listen socket加入到 epoll同时注册「连接事件」处理函数。 初始化完后主线程就进入到一个事件循环函数主要会做以下事情 调用 epoll_wait() 阻塞等待事件。处理连接事件接受新连接并将其加入到 epoll 中监听该连接的读写事件。处理数据读写如果有客户端的数据到达读取并解析请求然后返回响应数据。 读取数据当客户端发送请求时Redis 会使用非阻塞方式读取数据。如果没有数据recv() 会立即返回。写入数据当 Redis 要返回响应时它会使用非阻塞方式写数据。如果连接不可写send() 会立即返回。 继续阻塞等待处理完当前的请求后继续等待新的事件发生。 Redis 采用单线程为什么还这么快 Redis 的大部分操作都在内存中完成并且采用了高效的数据结构redis的瓶颈一般是内存或者网络带宽所以可以采用单线程。单线程省去了多线程之间来回切换的性能开销。Redis采用I/O多路复用机制处理大量的客户端 Socket 请求。内核会一直监听这些 Socket 上的连接请求或数据请求。一旦有请求到达就会交给 Redis 线程处理。 事务 Redis锁有哪几种实现方式 基于 SETNX 实现分布式锁 通常称为分布式锁。这种方式是基于 Redis 的原子操作来确保一个客户端可以在 Redis 中创建一个独占的锁。SET if Not Exists即只有在指定的键 不存在 时才会设置该键的值。若键已经存在则 SETNX 不会做任何操作。 基于 SET 命令实现的带有超时的分布式锁 Redis 5.0 版本引入了 SET 命令的 NX 和 EX 参数可以用来在一个命令中同时实现 设置键值、设置锁 和 设置超时 的功能。 SET命令的NX参数与SETNX类似EX是指超时时间 基于 Redisson 的分布式锁。底层依然使用set的。基于 Lua 脚本实现的分布式锁 如何实现redis 原子性 redis 执行一条命令的时候是具备原子性的因为 redis 执行命令的时候是单线程来处理的不存在多线程安全的问题。 如果要保证 2 条命令的原子性的话如何实现 可以考虑用 lua 脚本 将多个操作写到一个 Lua 脚本中Redis 会把整个 Lua 脚本作为一个整体执行在执行的过程中不会被其他命令打断从而保证了 Lua 脚本中操作的原子性。 redis 事务 如果 redis 事务正常执行使用 MULTI 和 EXEC 配合使用就可以保证多个操作都完成。如果 redis 事务发生错误了就没办法保证原子性了。事务中执行失败的操作不会回滚因为redis没有回滚机制。 Redis中incr命令保证原子性的原理是什么 Redis 是一个单线程的系统所有操作包括 INCR都是通过单线程执行的。这意味着当 Redis 处理一个客户端的请求时它不会同时处理其他客户端的请求。这就天然保证了在执行 INCR 命令时不会被其他命令打断从而实现原子性。Redis 使用事件循环机制来处理客户端的请求。每一个客户端的请求都会被放入一个队列中Redis 按照队列中的顺序逐一处理请求。 redis分布式锁的时钟问题 在 Redis 分布式锁的场景中时钟问题通常指的是Redis 服务器和客户端的时钟不同步尤其是在锁的有效期TTL设置上。 原因 客户端时钟漂移客户端和 Redis 服务器之间的时钟可能存在差异。如果客户端使用的时钟比 Redis 服务器快或者慢可能导致锁的过期时间错误。 Redis 服务器时钟漂移如果 Redis 服务器的时钟出现漂移可能会导致 Redis 锁过期时间的计算错误导致锁失效或者提前释放。 网络延迟在某些情况下客户端和 Redis 之间的网络延迟可能会导致客户端计算的 TTL 时间与实际过期时间不一致。 解决方法 使用 Redisson 库使用 SETNX 命令 持久化及日志 Redis有哪些持久化方式分别的优缺点是什么 RDB快照存储 RDB 持久化是 Redis 默认的持久化机制它会定期将 Redis 内存中的数据 快照 保存到磁盘上的一个 .rdb 文件中。 原理Redis 会根据配置的规则例如每隔多少时间或者多少次写操作定期生成 RDB 快照。生成快照时Redis 会 fork 出一个子进程将内存中的数据存储到磁盘文件中。优点 性能高由于 RDB 是基于快照的持久化方式它通常不会影响 Redis 的正常读写性能。适用于大规模部署由于 RDB 文件是一个二进制的快照它非常适合用于数据备份和恢复。较少磁盘 I/O 操作RDB 的数据写入磁盘是周期性发生的不像 AOF 会每次写操作都执行 I/O。 缺点 数据丢失RDB 的持久化是周期性的因此在上次持久化之后到 Redis 崩溃期间的数据会丢失。持久化时间较长当 Redis 数据集很大时生成 RDB 快照的过程可能会导致较长的阻塞时间。 适用场景对数据丢失有一定容忍的场景比如缓存系统。 AOF追加日志文件 AOF 持久化方式通过将每个写操作都记录到一个日志文件中来实现持久化。每次客户端执行写操作时Redis 会把操作记录在 AOF 文件中。 原理AOF 文件是一个日志文件其中记录了所有的写操作。Redis 会把写操作追加到文件的末尾。AOF 文件在每次写操作后会被写入磁盘可以根据配置的 fsync 策略来控制何时同步到磁盘。优点 数据持久性更强AOF 记录的是所有的写操作因此可以在崩溃后恢复到上次写操作的状态更细粒度的控制通过 fsync 配置AOF 可以实现多种持久化方式包括“每次写操作后同步”最强一致性以及“每秒同步一次”等。 缺点 写入性能差每次写操作都会产生磁盘 I/O。AOF 文件较大随着时间的推移AOF 文件会不断增大。 适用场景对数据持久化要求较高的领域如金融应用等。 RDB 和 AOF 结合使用 优点结合了 RDB 的快速恢复和 AOF 的高持久性。在恢复时Redis 会先加载 RDB 文件然后应用 AOF 中的操作。缺点Redis 会额外占用磁盘空间且可能会影响性能。 缓存淘汰及过期删除 过期删除策略和内存淘汰策略有什么区别 内存淘汰策略是在内存满了的时候redis 会触发内存淘汰策略淘汰一些不必要的内存资源。 常用淘汰策略淘汰最近最少使用的数据LRU和随机选择。当 Redis 内存达到 maxmemory 限制时就会触发内存淘汰机制根据配置的策略删除一些数据。 过期键删除策略是将已过期的键值对进行删除Redis 采用的删除策略是惰性删除定期删除。 Redis 会定期扫描所有设置了过期时间的键默认每 100 毫秒扫描一次。在扫描过程中它会检查每个键是否过期如果过期则删除该键。Redis 在访问一个键时会检查该键是否过期。如果过期就删除它。这种方式被称为惰性删除。也就是说Redis 只会删除那些被访问过的过期键。 Redis 持久化时对过期键会如何处理的 Redis 持久化文件有两种格式RDBRedis Database和 AOFAppend Only File RDB模式 在生成 RDB 文件时过期的键不会被保存。加载 RDB 文件时主服务器不会加载过期键从服务器会加载所有键但同步时会清除过期的键。 AOF模式 在写入 AOF 文件时过期的键会保存当过期键删除时但会有 DEL 命令删除它们。AOF 重写时过期的键不会被保存到新文件中。 Redis集群 Redis 如何实现服务高可用 Redis 通过 主从复制 实现读写分离和基本的数据冗余通过 哨兵机制 实现自动故障转移而通过 集群模式 实现更高规模的分布式数据存储与高可用性。结合这些机制Redis 能确保服务在节点或主服务器故障时保持可用。 主从复制Replication 原理Redis 可以配置多个从服务器Slave来复制主服务器Master的数据。 高可用性从服务器实时同步主服务器的数据当主服务器出现故障时可以将一个从服务器提升为主服务器保证服务继续提供。 主从同步 完全同步情况初次同步、从服务器请求全量同步、主从差异过大增量同步情况当主从偏移量位于环形缓冲区内则是增量同步。 哨兵机制Sentinel 原理Redis Sentinel 是一种监控和故障转移机制用于监控 Redis 实例的健康状态并在主服务器宕机时自动进行故障转移 高可用性当 Sentinel 发现主服务器宕机时它会自动选择一个从服务器提升为主服务器并通知其他 Redis 实例进行更新。 集群模式Cluster 原理Redis 集群允许采用哈希槽Hash Slot将数据分布到多个节点上每个节点负责存储数据的某一部分通过分片。Redis 集群具有自动分片和数据冗余功能。 高可用性集群模式支持每个数据分片有多个副本主从复制当某个节点发生故障时集群会自动将该分片的副本提升为主节点。 在全量同步的时候增量同步消息产生怎么保证数据的一致性 集群脑裂导致数据丢失怎么办 群脑裂Split Brain是指在分布式系统中多个节点出现网络分区或失去联系导致系统分为多个不相互通信的“脑”这些“脑”可能独立地做出决策造成数据不一致或丢失。 使用 Redis Sentinel监控主节点的健康自动进行故障转移确保主节点宕机时能自动选举新的主节点。 设置 cluster-require-full-coverage 为 yes这样在脑裂发生时集群会停止接受写请求避免数据不一致。 增加副本数量每个分片配置多个副本即使发生脑裂仍有副本可用来恢复数据。 定期备份RDB 和 AOF发生脑裂导致的数据丢失时可以从备份中恢复。 redis集群下执行Lua注意什么redis集群下执行Lua如何保证多个key落到同个redis节点 在redis集群下执行redis命令会根据key求哈希确定具体的槽位slot然后将命令路由到负责该槽位的 Redis 节点上。 在redis集群下执行Lua需要保证Lua脚本中的所有key必须落到同个redis节点。 解决方法 执行Lua脚本的所有key中使用大括号‘{}’且保证大括号中的内容相同此时会根据大括号中的内容求哈希因为内容相同所以求得的哈希数据相同所以就落在了同一个Redis节点。 分布式锁了吗怎么用的 支付服务中用到分布式锁防止因为网络抖动或者重复提交同一个业务订单生成多个支付交易订单用到了分布式锁锁的粒度就是业务订单每个业务订单号就是一个锁。在数据同步那里也用到分布式锁一个同步队列要求只有一个线程处理数据使用分布锁控制锁的粒度就和队列对应一个队列一个锁。 在从队列中取数据时先获取锁获取锁成功从同步队列取出数据数据处理完成释放锁。 因为队列中的数据量不确定任务处理时间不确定使用redisson的看门狗机制默认锁的时间是30s当到20s时自动续期. 一定要注意获取锁要放在try中在finally 中要释放锁。 缓存设计 如何避免缓存雪崩、缓存击穿、缓存穿透 缓存雪崩是指大量缓存同时失效导致大量请求直接访问数据库造成数据库压力过大可能会引发系统宕机。 避免办法 设置缓存过期时间的随机性提前预热缓存使用多级缓存 缓存击穿是指某个热点数据的缓存失效而同时有大量请求访问该数据导致请求直接打到数据库上从而造成数据库负担过重。 避免办法 加锁机制当缓存失效时使用分布式锁如 Redis 锁保证只有一个请求会去加载数据并更新缓存其他请求等待加载完成后直接返回缓存数据。针对热点数据异步进行更新缓存 缓存穿透是指请求的数据既不在缓存中也不在数据库中通常是恶意请求或无效数据导致请求直接打到数据库上造成数据库的无谓负担。 避免办法 缓存不存在的查询结果当查询的数据为空例如数据库查询结果为 null 或空集合也将该结果缓存一段时间避免后续相同请求每次都查询数据库。使用 Bloom Filter在查询缓存前先通过 Bloom Filter 判断请求的数据是否存在于数据库中。如果不存在直接返回空数据或者错误避免查询数据库。限制无效请求在接口层做合理的验证和过滤避免无效请求例如恶意攻击、过期数据直接访问缓存和数据库。 布隆过滤器原理介绍一下 布隆过滤器Bloom Filter是一种空间效率极高的概率型数据结构主要用于测试一个元素是否属于一个集合。它的核心特点是能够快速判断某个元素是否存在于集合中但有一定的误判率假阳性即可能会错误地报告某个元素存在但不会漏掉实际存在的元素。 布隆过滤器由「初始值都为 0 的位图数组」和「 N 个哈希函数」两部分组成。当我们在写入数据库数据时在布隆过滤器里做个标记这样下次查询数据是否在数据库时只需要查询布隆过滤器如果查询到数据没有被标记说明不在数据库中。 添加元素通过多个哈希函数计算数组的位置把对应的位设为 1。查询元素用相同的哈希函数计算位置如果所有位置都是 1说明元素“可能”存在如果有位置是 0说明元素一定不存在。 常见的缓存更新策略 Cache Aside旁路缓存策略 读写策略 写策略先更新数据库再删除缓存读策略先读缓存再读数据库 适用场景Cache Aside 策略适合读多写少的场景不适合写多的场景 缺点存在缓存穿透的问题 Read/Write Through读穿 / 写穿策略 读写策略 读穿Read Through与旁路缓存一样写穿Write Through如果缓存有就缓存和数据库一块更新如果缓存没有直接更新数据。 Write Back写回策略 写回策略是与写穿策略相反的写操作仅仅写入缓存不立即写入数据库。然后后台会有一个定时任务将缓存中的数据批量写入数据库。适用场景适合大规模写操作且可以容忍一定延迟的数据更新场景缺点会有一致性和数据缺失的风险。 数据库和缓存如何保证一致性 保证缓存一致性需要根据具体的需求来定 对数据实时性有一定要求 对数据实时性有一定要求即数据库数据更新需要近实时查询到最新的数据针对这种情况可采用延迟双删、CanalMQ异步同步的方式。 对数据实时性要求不高 使用定时任务的方式定时更新缓存或者直接用redis查也行。 对数据实时性要求非常高 此类场景不适合用缓存直接使用数据库即可 Redis实战 Redis 如何实现延迟队列 Redis 可以通过Zset来实现延迟队列。这个方法利用了有序集合的 按分数排序 特性来实现任务的延迟执行。 当一个任务需要延迟执行时我们将它插入到 Sorted Set 中分数 设置为未来的时间戳成员 设置为任务标识。消费者端进行监听如果当前时间匹配到延迟队列的毫秒值就立刻消费。 ttl死信交换机怎么实现延迟队列 TTL (Time-To-Live)指定消息在队列中存活的最大时间。当消息的 TTL 超过设置的时间后消息就会被自动删除或转发到一个 死信交换机DLX。 生产者将消息发送到 delay_queue。消息在 delay_queue 存活一段时间TTL 到期后。消息转发到 死信交换机 (DLX)再进入 延迟队列 (delayed_queue)。消费者从 delayed_queue 获取到的消息就是经过延迟处理的。 Redis 的大 key 如何处理 大 key 并不是指 key 的值很大而是 key 对应的 value 很大。 对大Key进行拆分。例如将含有数万成员的一个HASH Key拆分为多个HASH Key并确保每个Key的成员数量在合理范围。对大Key进行清理。将不适用Redis能力的数据存至其它存储并在Redis中删除此类数据。注意要使用异步删除。监控Redis的内存水位。对过期数据进行定期清。 Redis 的热 key 如何处理 在Redis集群架构中对热Key进行复制。 使用读写分离架构。 如何设计秒杀场景处理高并发以及超卖现象 用分布式锁、Redis等技术都可以防止超卖Redisson 和 Lua 可以配合使用来增强 Redis 操作的性能和原子性。 使用Redis分布式锁Redisson解决超卖问题控制多个Jvm进程去争抢同一个锁将并发操作库存改为同步执行。使用Redis原子操作解决超卖问题Redis命令具有原子性将库存放在Redis中使用decr命令去扣减库存。增加使用incr。 Redis 分布式锁的原理 现实使用Redisson实现分布式锁。使用多线程从同步队列查询并处理数据时同一个队列只允许一个线程去处理这里我们用到了分布式锁锁的粒度是每个同步队列。 加锁客户端通过 Redis 的 SET 命令加锁要求锁的键不存在时才能设置并且设置一个过期时间。释放锁客户端通过 DEL lock_key 删除锁但为了避免误删其他客户端的锁通常需要先确认锁的值是否和自己加锁时存的值一样确保自己是持有锁的客户端。锁超时如果客户端持有锁的时间超过了设置的过期时间锁会自动释放避免死锁问题。 Redis 管道有什么用 Redis 管道Pipeline是将多个命令打包一起发送到 Redis避免每个命令都等待响应从而减少网络延迟提高性能。这样可以一次性执行多个命令而不用每次等待一个命令的结果适合批量操作。 Redis 事务支持回滚吗 不支持要么全部成功要么全部失败即使是lua脚本也只是回到运行脚本之前的情况。 如果 redis 事务正常执行使用 MULTI 和 EXEC 配合使用就可以保证多个操作都完成。如果 redis 事务发生错误了就没办法保证原子性了。事务中执行失败的操作不会回滚因为redis没有回滚机制。 怎么保证本地缓存和redis缓存一致 为了保证本地缓存和 Redis 缓存一致可以采取以下几种策略 双写一致性 更新数据时同时更新 Redis 和本地缓存确保两者一致。 缓存失效 设置相同的 过期时间TTL让缓存过期后重新加载确保数据不会长时间不一致。 更新 Redis删除本地缓存 更新 Redis 后删除本地缓存下次读取时从 Redis 获取并更新本地缓存。 异步更新 使用异步方式更新缓存避免同步带来的性能问题确保缓存能在后台更新。
http://www.sczhlp.com/news/156506/

相关文章:

  • 从用户角度网站应该具备的条件eclipse开发网站用vue做前端
  • 读人形机器人28智慧城市2
  • 浅析 AC 自动机
  • 2025百度官网认证作用代理商推荐,北京益百科技通过官网认证,助力企业优化搜索排名,提升用户体验,降低营销成本
  • 企业如何做好网站的seo优化重庆网站服务建设
  • 网站上点击图片局部放大如何做专业佛山网站建设
  • 地产公司网站建设计划书做个网站多少钱一个月
  • 漳州企业网站建设公司淘宝客如何做淘宝客网站
  • 做进化树的网站购买保险的网站
  • 青岛会议网站制作公司网页版面设计包括什么内容
  • 北京网站备案速度网站建设发展
  • 营销型企业网站有哪些类型seo公司官网
  • 手机网站的建设wordpress获取评论
  • 海淘直邮购物网站汉川seo推广
  • 快速html5网页设计的网站宿迁北京网站建设
  • 制作一个网站平台吗网站设计费用志
  • 阿里云域名注册万网网站seo优化费用
  • 做网站 图片是文本html网站搭建
  • 包装制品东莞网站建设wordpress 4.9.1 主题
  • 网站开发图片编辑网站开发李沛杰
  • jsp做网站的书贵阳做网络平台的公司
  • 网站栏目及内容个人网站如何建
  • 学网站开发上海网络推广需要多少钱
  • 网站建设和网站优化哪个更重要网站上的付费文章怎么做
  • 天津网站建设哪里好网站设计论文html
  • 市网站建设专业建设验收网站
  • 门户网站建设的作用及意义一般通过会社员
  • 学做网站论坛vip视频学院网站开发网站定位
  • 阿里云个人网站备案做淘客静态网站开发基础
  • 邯郸网站建设纵横网站建设合同违约金细节