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

徐州市网站建设_网站建设公司_阿里云_seo优化

网站建设公司比较,网页开发自学,敬请期待换个说法,汕头网站推广找哪里文章目录 Redis-使用场景1、缓存穿透2、缓存击穿3、缓存雪崩4、双写一致5、Redis持久化6、数据过期策略7、数据淘汰策略 Redis-分布式锁1、redis分布式锁#xff0c;是如何实现的#xff1f;2、redisson实现的分布式锁执行流程3、redisson实现的分布式锁-可重入4、redisson实… 文章目录 Redis-使用场景1、缓存穿透2、缓存击穿3、缓存雪崩4、双写一致5、Redis持久化6、数据过期策略7、数据淘汰策略 Redis-分布式锁1、redis分布式锁是如何实现的2、redisson实现的分布式锁执行流程3、redisson实现的分布式锁-可重入4、redisson实现的分布式锁-主从一致性 Redis-其他面试题1、Redis集群有哪些方案1.1 主从复制1.2 哨兵模式1.2.1、redis集群哨兵模式脑裂 1.3 分片集群结构 2、Redis是单线程的但是为什么还那么快3、能解释一下I/O多路复用模型4、网络模型-Redis是单线程的吗为什么使用单线程5、Redis的单线程模型-Redis单线程和多线程网络模型变更 Redis-使用场景 1、缓存穿透 出现原因 查询一个不存在的数据mysql查询不到数据也不会直接写入缓存就会导致每次请求都查数据库。 缓存空数据 原理缓存空数据查询返回的数据为空仍把这个空结果进行缓存 优点简单 缺点: 消耗内存可能会发生不一致的问题 布隆过滤器 原理在进行缓存预热时同时也会预热过滤器当查询一个不存在的数据时会经过过滤器查询是否存在若不存在则直接返回不会去查询redis也不会去查数据库。 布隆过滤器的过滤流程 原理就是将请求元素进行(3次多次哈希记录哈希值为1的区域下次查询会根据请求元素计算的哈希值位置都为1 来判断是否需要去查询redis。 误判情况 误判率数组越小误判率就越大数组越大误判率就越小但是同时带来了更多的内存消耗。 2、缓存击穿 出现原因 给某一个key设置了过期时间当key过期的时候恰好这时间点对这个key有大量的并发请求过来这些并发的请求可能会瞬间把DB压垮 解决方案一互斥锁 原理就是当线程一进来去redis查询数据时数据过期了这时候线程一就会加上一把互斥锁别的线程进来获得锁失败只能休眠或者重试当线程一进行缓存重建完成后会释放锁别的线程进来也可以查到数据了。 解决方案二逻辑过期 原理就是 ①在设置key的时候设置一个过期时间字段一块存入缓存中不给当前key设置过期时间 ②当查询的时候从redis取出数据后判断时间是否过期 ③如果过期则开通另外一个线程进行数据同步当前线程正常返回数据这个数据不是最新 3、缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机导致大量请求到达数据库带来巨大压力。 大量的缓存key同时失效 给不同的Key的TTL添加随机值 Redis服务宕机 4、双写一致 双写一致性当修改了数据库的数据也要同时更新缓存的数据缓存和数据库的数据要保持一致。 延迟双删 延迟双删如果是写操作我们先把缓存中的数据删除然后更新数据库最后再延时删除缓存中的数据其中这个延时多久不太好确定在延时的过程中可能会出现脏数据并不能保证强一致性所以没有采用它。 参考链接redis的延迟双删策略总结------作者Hellboy_M 分布式锁 又分为共享锁和排他锁: 采用的是redisson实现的读写锁在读的时候添加共享锁可以保证读读不互斥读写互斥。当我们更新数据的时候添加排他锁它是读写读读都互斥这样就能保证在写数据的同时是不会让其他线程读数据的避免了脏数据。这里面需要注意的是读方法和写方法上需要使用同一把锁才行。 异步通知 基于Canal的异步通知 采用的阿里的canal组件实现数据同步不需要更改业务代码部署一个canal服务。canal服务把自己伪装成mysql的一个从节点当mysql数据更新以后canal会读取binlog数据然后在通过canal的客户端获取到数据更新缓存即可。 5、Redis持久化 RDBRedis数据备份文件 把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后从磁盘读取快照文件恢复数据 RDB文件是一种紧凑、可压缩的二进制文件它包含了Redis的键值对数据、过期时间、数据类型等信息 RDB的执行原理 执行流程 主进程会fork一个子进程同时也会将页表拷贝过去类似拷贝这时主子进程的页表会同时指向物理内存共享内存数据子进程进行写新RDB文件操作覆盖掉旧的文件执行RDB持久化操作同时主进程在进行写的操作时会拷贝一份数据再执行写操作原本的数据会设置成只读同时读的时候只会读拷贝后写完的数据副本。RDB文件的加载当Redis服务器启动时它会检查是否存在RDB文件。如果存在Redis会读取RDB文件并将其中的数据加载到内存中进行恢复。 如果是通过BGSAVE命令生成RDB文件那么Redis会在子进程中完成这个过程然后继续处理客户端请求。 如果是通过SAVE命令生成RDB文件那么Redis会阻塞客户端请求直到RDB操作完成才继续处理。 AOF追加文件 Redis处理的每一个写命令都会记录在AOF文件可以看做是命令日志文件 存储的是Redis服务器接收到的写操作命令。它记录了所有的写操作命令包括对不同类型数据的操作。 因为是记录命令AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作但只有最后一次写操作才有意义。通过执行bgrewriteaof命令可以让AOF文件执行重写功能用最少的命令达到相同效果。 AOF的执行原理 写入操作追加到AOF缓冲区当客户端发送写操作到Redis服务器时服务器会将该操作追加到AOF缓冲区中而不是直接写入磁盘文件。AOF缓冲区是一个内存缓冲区用于临时存储待持久化的写操作。AOF缓冲区数据写入AOF文件Redis服务器使用文件事件处理器在合适的时机将AOF缓冲区中的数据写入到AOF文件中。写入操作可以通过多种方式触发如定时、命令计数等。AOF文件重写可选为了避免AOF文件过大Redis支持对AOF文件进行重写。AOF重写是通过生成一份与当前数据集完全一致的新AOF文件来实现的过程中会跳过不必要的写操作。重写过程不会阻塞客户端请求并且生成的新AOF文件比旧文件更小节省磁盘空间。AOF文件加载恢复数据当Redis重启时可以通过加载AOF文件来恢复数据。Redis会读取AOF文件中记录的写操作并按照顺序重新执行这些写操作以还原数据集状态。 RDB与AOF对比 6、数据过期策略 惰性删除 设置该key过期时间后我们不去管它当需要该key时我们在检查其是否过期如果过期我们就删掉它反之返回该key 优点 对CPU友好只会在使用该key时才会进行过期检查对于很多用不到的key不用浪费时间进行过期检查 缺点 对内存不友好如果一个key已经过期但是一直没有使用那么该key就会一直存在内存中内存永远不会释放 定期删除 每隔一段时间我们就对一些key进行检查删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查并删除其中的过期key)。 定期清理有两种模式 SLOW模式是定时任务执行频率默认为10hz每次不超过25ms以通过修改配置文件redis.conf 的hz 选项来调整这个次数 FAST模式执行频率不固定但两次间隔不低于2ms每次耗时不超过1ms 优点可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除也能有效释放过期键占用的内存。 缺点难以确定删除操作执行的时长和频率。 Redis的过期删除策略惰性删除 定期删除两种策略进行配合使用 7、数据淘汰策略 当Redis中的内存不够用时此时在向Redis中添加新的key那么Redis就会按照某一种规则将内存中的数据删除掉这种数据的删除规则被称之为内存的淘汰策略。 Redis支持8种不同策略来选择要删除的key noeviction 不淘汰任何key但是内存满时不允许写入新数据默认就是这种策略。 volatile-ttl 对设置了TTL的key比较key的剩余TTL值TTL越小越先被淘汰 allkeys-random对全体key 随机进行淘汰。 volatile-random对设置了TTL的key 随机进行淘汰。 allkeys-lru 对全体key基于LRU算法进行淘汰 volatile-lru对设置了TTL的key基于LRU算法进行淘汰 allkeys-lfu 对全体key基于LFU算法进行淘汰 volatile-lfu 对设置了TTL的key基于LFU算法进行淘汰 其中 LRULeast Recently Used最近最少使用。用当前时间减去最后一次访问时间这个值越大则淘汰优先级越高。 key1是在3s之前访问的, key2是在9s之前访问的删除的就是key2 LFULeast Frequently Used最少频率使用。会统计每个key的访问频率值越小淘汰优先级越高。 key1最近5s访问了4次, key2最近5s访问了9次 删除的就是key1 数据淘汰策略-使用建议 关于数据淘汰策略其他的面试问题 Redis-分布式锁 1、redis分布式锁是如何实现的 Redis实现分布式锁主要利用Redis的setnx命令。 死锁的情况就是在拿到锁执行业务的时候服务突然宕机导致锁没有被释放 解决办法就是给锁设置过期时间 锁的失效时长怎么控制 但是这两种方式都不是很靠谱实现起来也很复杂可以使用redisson实现的分布式锁 2、redisson实现的分布式锁执行流程 其中枷锁成功后可以保证业务执行完成才会去释放锁业务如果未完成锁的时间到期了看门狗会每隔30秒做一次续约直到业务执行完成释放锁的时候会给看门狗一个信号不需要对锁续时间了。 如果在执行线程一的时候拿到了分布式锁线程二也进来了这个时候线程二想要拿到锁发现拿不到就会进行一个重试机制当然如果重试到一定的次数会停止重试获取锁的操作。 参考链接Redission可重入,锁重试,锁续约,watchDog机制-------作者 alonePointer 锁重试和续约------作者阿千弟 3、redisson实现的分布式锁-可重入 针对同一个线程多次请求获取分布式锁的情况Redisson使用一个计数器来记录当前线程对锁的获取次数。初始时计数器为1每次成功获取锁后将计数器加1每次释放锁后将计数器减1。只有当计数器归零时才会真正释放锁。 参考链接Redission可重入,锁重试,锁续约,watchDog机制-------作者 alonePointer 锁重试和续约------作者阿千弟 4、redisson实现的分布式锁-主从一致性 RedLock(红锁)不能只在一个redis实例上创建锁应该是在多个redis实例上创建锁(n / 2 1)避免在一个redis实例上加锁。 使用redisson提供的红锁来解决但是这样的话性能就太低了如果业务中非要保证数据的强一致性建议采用zookeeper实现的分布式锁。 参考链接Redisson 分布式锁主从一致性问题-----作者刘婉晴 Redis-其他面试题 1、Redis集群有哪些方案 1.1 主从复制 单节点Redis的并发能力是有上限的要进一步提高Redis的并发能力就需要搭建主从集群实现读写分离。 一般redis都是读多写少主节点执行写操作然后同步到从节点从节点只执行读操作。 第一部分主从全量同步一般都是第一次主节点和从节点同步 其中 Replication Id简称replid是数据集的标记id一致则说明是同一数据集。每一个master都有唯一的replidslave则会继承master节点的replid。 offset偏移量随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset说明slave数据落后于master需要更新。 流程 1.从节点请求主节点同步数据replication id、 offset2.主节点判断是否是第一次请求是第一次就与从节点同步版本信息replication id和offset3.主节点执行bgsave生成rdb文件后发送给从节点去执行4.在rdb生成执行期间主节点会以命令的方式记录到缓冲区一个日志文件5.把生成之后的命令日志文件发送给从节点进行同步 主从是否同步取决于主从offset偏移量是否相等 第二部分主从增量同步一般是从节点slave重启或后期数据变化 流程 1.从节点请求主节点同步数据主节点判断不是第一次请求不是第一次就获取从节点的offset值2.主节点从命令日志中获取offset值之后的数据发送给从节点进行数据同步 1.2 哨兵模式 Redis提供了哨兵Sentinel机制来实现主从集群的自动故障恢复。 其中服务状态监控 Sentinel基于心跳机制监测服务状态每隔1秒向集群的每个实例发送ping命令 主观下线如果某sentinel节点发现某实例未在规定时间响应则认为该实例主观下线。 客观下线若超过指定数量quorum的sentinel都认为该实例主观下线则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。 哨兵选主规则: 首先判断主与从节点断开时间长短如超过指定值就排该从节点然后判断从节点的slave-priority值越小优先级越高如果slave-prority一样则判断slave节点的offset值越大优先级越高最后是判断slave节点的运行id大小越小优先级越高。 1.2.1、redis集群哨兵模式脑裂 脑裂Split Brain是指由于网络分区或其他故障导致多个主节点同时存在的情况。这会导致数据不一致和服务不可用的问题。 由于主节点和从节点和sentinel处于不同的网络分区使得sentinel没有能够心跳感知到主节点所以通过选举的方式提升了一个从节点为主这样就存在了两个master就像大脑分裂了一样这样会导致客户端还在老的主节点那里写入数据新节点无法同步数据当网络恢复后sentinel会将老的主节点降为从节点这时再从新master同步数据就会导致数据丢失. 解决我们可以修改redis的配置可以设置最少的从节点数量以及缩短主从数据同步的延迟时间达不到要求就拒绝请求就可以避免大量的数据丢失 1.3 分片集群结构 主从解决高并发读的问题和哨兵可以解决高可用的问题。但是依然有两个问题没有解决 海量数据存储问题高并发写的问题 使用分片集群可以解决上述问题分片集群特征 集群中有多个master每个master保存不同数据每个master都可以有多个slave节点master之间通过ping监测彼此健康状态客户端请求可以访问集群任意节点最终都会被转发到正确节点 分片集群结构-数据读写 Redis 分片集群引入了哈希槽的概念Redis 集群有 16384 个哈希槽每个 key通过 CRC16 校验后对 16384 取模来决定放置哪个槽集群的每个节点负责一部分 hash 槽。 其中Redis分片集群中数据是怎么存储和读取的 Redis 分片集群引入了哈希槽的概念Redis 集群有 16384 个哈希槽将16384个插槽分配到不同的实例主节点读写数据根据key的有效部分计算哈希值对16384取余有效部分如果key前面有大括号大括号的内容就是有效部分如果没有则以key本身做为有效部分余数做为插槽寻找插槽所在的实例 2、Redis是单线程的但是为什么还那么快 Redis是纯内存操作执行速度非常快采用单线程避免不必要的上下文切换可竞争条件多线程还要考虑线程安全问题使用I/O多路复用模型非阻塞IO 3、能解释一下I/O多路复用模型 Redis是纯内存操作执行速度非常快它的性能瓶颈是网络延迟而不是执行速度 I/O多路复用模型主要就是实现了高效的网络请求。 参考链接网络模型 4、网络模型-Redis是单线程的吗为什么使用单线程 Redis到底是单线程还是多线程 如果仅仅聊Redis的核心业务部分命令处理答案是单线程如果是聊整个Redis那么答案就是多线程 在Redis版本迭代过程中在两个重要的时间节点上引入了多线程的支持 Redis v4.0引入多线程异步处理一些耗时较旧的任务例如异步删除命令unlinkRedis v6.0在核心网络模型中引入 多线程进一步提高对于多核CPU的利用率 因此对于Redis的核心网络模型在Redis 6.0之前确实都是单线程。是利用epollLinux系统这样的IO多路复用技术在事件循环中不断处理客户端情况。 为什么Redis要选择单线程 抛开持久化不谈Redis是纯 内存操作执行速度非常快它的性能瓶颈是网络延迟而不是执行速度因此多线程并不会带来巨大的性能提升。多线程会导致过多的上下文切换带来不必要的开销引入多线程会面临线程安全问题必然要引入线程锁这样的安全手段实现复杂度增高而且性能也会大打折扣 5、Redis的单线程模型-Redis单线程和多线程网络模型变更 核心在于 单线程的模型 执行流程包括三种事件 server socket 可读事件建立连接和持续监听客户读写请求 client socket 可读事件 client socket 可写事件 多线程的模型redis 6.0 影响性能的最大的就是IO操作 多线程体现在于 命令处理器解析客户端命令 也就是命令请求处理器在将客户端输入的命令多线程下会有很多的请求都等待着读此时是二进制加入到缓冲区并且解析除redis命令这个过程是多线程的至于执行命令把结果写入client队列之后的事还是单线程。 命令回复处理器写响应结果 也就是通过命令回复处理器开启多线程去客户端缓冲区去拿数据在写出来 需要指出的是虽然 Redis 6.0 引入了多线程模型但 Redis 的关键操作如命令执行、写操作仍然是单线程的这是为了保证数据的一致性和避免竞态条件。多线程主要用于网络 I/O 操作和接收客户端命令而实际的数据读写操作仍然是单线程执行的。因此在 Redis 中多线程并不意味着完全的并行执行仍然保持了单线程的简洁性和高性能。 相关面试回答 gitee-redis 持续更新中…若内容有误欢迎留言 素材来源黑马程序员
http://www.ihoyoo.com/news/87070.html

相关文章:

  • 青冈县网站建设网页设计图片代码怎么写
  • 宁波企业网站排名优化公司建站公司那家好
  • 营销型网站建设论文成都成仁路网站建设
  • 大气扁平网站大型手机网站制作
  • 模仿别人网站侵权网站开发技术发展趋势
  • 酒店宾馆型网站开发网站上的超链接怎么做
  • 富平网站建设临沂网站制作定制
  • dw怎样去除网站做的页面模板做网页用什么软件好
  • 网站的ftp服务器广东高端建设网站
  • 网站开发框架拓扑巴彦淖尔市百家姓网站建设
  • 网站建设与管理用什么软件有哪些内容深圳网站开发专业团队
  • 徐州城乡建设招投标网站大宗商品交易软件哪个好
  • iis网站物理路径文化传媒建设网站
  • 昆明网站搭建网站运营长沙做官方网站
  • 网站教程分享西安博威建设工程有限公司招聘网站
  • 品牌网站建设多少钱服装企业网站策划书
  • 什么叫网站的域名wordpress目录
  • 漳州招商局规划建设局网站在哪个网站上做实验仪器比较好
  • 购物网站排名小说网站怎么做
  • 网站建设与运营市场开拓方案程序_做彩票源码网站开发
  • 纵横网站建立我的世界服务器如何做充钱网站
  • 上海网站建设千元漂亮昆山广告设计公司
  • 重庆seo网站推广费用数据库性质的网站怎么做
  • 新浪网站是什么程序做的wordpress文库插件
  • 花钱做网站不给部署各大电商购物网站转化率报表
  • 网站开发合同 下载网站降权怎么救
  • 建网站难不难广州网站制作联系方式
  • 浙江建筑协会网站百度游戏
  • 陇南做网站网站等级保护必须做吗
  • 个人能免费做网站seo网站诊断