06 2023 档案
摘要:问题描述 使用KafkaTemplate作为生产者发送消息时为了不影响主流业务会采用异步发送的方式,如下 public void producerSendFuture(String topic, String data) { logger.info("kafka异步发送topic:" + topic
阅读全文
摘要:垂直切分 将不同业务模块所使用的表切分到不同的数据库(主机)之上,这样的切能够称之为数据的垂直(纵向)切分 在架构设计中,各个功能模块相互之间的交互点越统一越少,系统的耦合度就越低,系统各个模块的维护性以及扩展性也就越好,实现数据的垂直切分也就越简单 垂直切分的长处 ◆ 数据库的拆分简单明了,拆分规
阅读全文
摘要:一、MySQL数据库层怎么保证不丢数据 InnoDB支持事务,事务提交需要写redo、undo。采用日志先行的策略,将数据的变更在内存中完成,并且将事务记录成redo,顺序的写入redo日志中,即表示该事务已经完成,就可以返回给客户已提交的信息。但是实际上被更改的数据还在内存中,并没有刷新到磁盘,当
阅读全文
摘要:几种方案 1、先更新数据库,再更新缓存 该方案会导致不一致的情况: (1)线程A更新了数据库 (2)线程B更新了数据库 (3)线程B更新了缓存 (4)线程A更新了缓存 B却比A更早更新了缓存,这就导致了脏数据,不可行 2、先删缓存,再更新数据库 该方案会导致不一致的情况: (1)请求A进行写操作,先
阅读全文
摘要:什么是延迟加载 延迟加载的条件:resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。 延迟加载的好处: 先从单表查询、需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表
阅读全文
摘要:MySQL缓存机制即缓存sql 文本及缓存结果,用Key-Value形式保存再服务器内存中,如果运行相同的sql,服务器直接从缓存中去获取结果,不需要再去解析、优化、执行sql,可以大大提高查询的性能 参数设置 (1) have_query_cache表示是否支持查询缓存,YES表示支持 (2) q
阅读全文
摘要:索引下推 在不使用ICP(索引条件下推优化,MySQL5.6添加的,用于优化数据查询)的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎通过索引检索到数据,然后返回给MySQL服务器,服务器然后判断数据是否符合条件 。 在使用ICP的情况下,如果存在某些被索引的列的判断条件时
阅读全文
摘要:悲观锁 悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁。当数据
阅读全文
摘要:事物的隔离级别 1.Read Uncommitted 读未提交,存在脏读,不可重复读看,幻读等问题 2.Read Committed 读已提交,存在不可重复读看,幻读等问题 3.Repeatable Read 可重复读,存在幻读 4.Serializable 串行,脏读,不可重复读看,幻读均可避免
阅读全文
摘要:二叉查找树 二叉查找树也称为有序二叉查找树,左子树的值均小于根节点,则右子树的值均大于于根节点的值 局限性 对于某些情况,二叉查找树会退化成一个有n个节点的线性链,导致查找效率极差 二叉平衡树 带有平衡条件的二叉查找树,平衡条件必须满足(所有节点的左右子树高度差不超过1 弥补了二叉查找树极端情况下查
阅读全文
摘要:1) 事务支持 MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交 2) 存储结构 MyISAM:每个MyIS
阅读全文
摘要:(以kafka为例) 生产者 在 Kafka0.11 版本和 Pulsar 中都支持“producer idempotency”的特性,翻译过来就是生产过程的幂等性,这种特性保证消息虽然可能在生产端产生重复,但是最终在消息队列存储时只会存储一份 它的做法时给每一个生产者一个唯一的 ID,并且为生产的
阅读全文
摘要:为什么消息会丢失?(三个消息可能丢失的地方) 1、消息在写到消息队列的过程中丢失 业务服务器和消息队列服务器可能会出现网络抖动,当出现了网络抖动,消息就会丢失。 1)消息生产者把消息发送给MQ,如果接收成功,MQ会返回一个ack消息给生产者 2)如果消息接收不成功,MQ会返回一个nack消息给生产者
阅读全文
摘要:消息错乱场景 rabbitMQ 一个 queue,多个 consumer,生产者向 RabbitMQ 里发送了三条数据,顺序依次是 data1/data2/data3,压入的是 RabbitMQ 的一个内存队列。结果消费者2先执行完操作data2,然后是 data1/data3 kafka 一个 t
阅读全文
摘要:传统队列的顺序性 传统队列在服务器上保存有序的记录,如果多个消费者消费队列中的数据, 服务器将按照存储顺序输出记录。虽然服务器按顺序输出记录,但是记录被异步传递给消费者, 因此记录可能会无序的到达不同的消费者。这意味着在并行消耗的情况下, 记录的顺序是丢失的。因此消息系统通常使用“唯一消费者”的概念
阅读全文
摘要:kafka的主从同步 Kafka允许topic的分区拥有若干副本,所以当一个节点down掉时数据依然是可用的 创建副本的单位是topic的分区,每个分区都有一个leader和零或多个followers,所有的读写操作都由leader处理 一般分区的数量都比broker的数量多的多,各分区的leade
阅读全文
摘要:Kafka的Producer、Broker和Consumer之间采用的是一套自行设计的基于TCP层的协议 由于UDP协议是一种不可靠的传输协议,所以Kafka系统采用TCP协议作为服务间的通信协议 通信 通信模型 Reactor线程模型 Java NIO中的selector模型。最简单的Reacto
阅读全文
摘要:一般来说我们谈论推拉模式都是指comsumer和broker之间的交互 Producer 与 Broker 之间都是推的方式,即 Producer 将消息推送给 Broker RabbitMQ推拉都支持,官方推荐推模式 RocketMQ推拉都支持(本质上推也是拉) kafka只有拉模式 推模式 消息
阅读全文
摘要:RocketMQ 阿里开源,阿里参照kafka设计的,Java实现 能够保证严格的消息顺序 提供针对消息的过滤功能 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力 RabbitMQ Erlang实现,非常重量级,更适合于企业级的开发。同时实现了Broker架构
阅读全文
摘要:具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一 组成 Broker:消息服务器,作为server提供消息核心服务 Producer:消息生产者,业务的发起方,负责生产消息传broker Consumer:消息消费者,业务的处理方,负责从broker获取消息
阅读全文
摘要:现象: 业务卡件,报错:模型输入项获取发生异常 原因: 现在模型接入是支持页面配置的,定时会将数据库的模型参数加载到缓存中,代码运行时模型参数都是直接从缓存中获取的 下午新增模型时,业务人员配错了模型参数 DI->MODEL1,model_key->mdoel1,model_type->130, 此
阅读全文
摘要:一、背景 客经使用rocketMq批量推送数据到pcr执行次贷策略引擎和互斥决策引擎,pcr将决策结果推送到前置路由。 二、问题现象描述 在客经推数据时,pcr-updateBorrowState消息积压越来越多,从日志上看,pcr不拉取消息,重启服务器后可以消费消息,过一会又消费变慢,不断重启才让
阅读全文
摘要:Redis使用的是I/O多路复用 首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这
阅读全文
摘要:select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的。而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间 select 调用后select函数会阻塞,直到有描述符就绪(有数据 可读、可写
阅读全文
摘要:I/O过程 对于一次IO访问(这回以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的缓冲区,最后交给进程。所以说,当一个read操作发生时,它会经历两个阶段: 1. 等待数据准备 (Waiting for the data to be ready
阅读全文
摘要:直接I/O和缓存I/O 直接I/O 缓存 I/O 又被称作标准 I/O,数据会先被拷贝进程缓冲区,在拷贝到操作系统内核的缓冲区中,然后才会写到存储设备中
阅读全文
摘要:用户空间和内核空间 操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间 进程上下文切换 从一个进程的运行转到另一个进
阅读全文
摘要:如何保证 Redis 中的数据都是热点数据 提供一种简单实现缓存失效的思路: LRU(最近少用的淘汰) 即redis的缓存每命中一次,就给命中的缓存增加一定ttl(过期时间)(根据具体情况来设定, 比如10分钟). 一段时间后, 热数据的ttl都会较大, 不会自动失效, 而冷数据基本上过了设定的tt
阅读全文
摘要:多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了。或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了 首先使用分布式锁,确保同一时间,只能有一个系统实例在操作某个key 然后修改key的值时,要先判断这值的时间戳是否比缓存里的值的时间戳更靠后,
阅读全文
摘要:缓存穿透 缓存穿透是指查询一个缓存和数据库中都不存在的数据,客户端不断发起请求,导致数据库压力过大 解决方法 1、采用布隆过滤器,将所有可能存在的数据,哈希到一个很大的 bitmap 中, 一个一定不存在的数据会被 bitmap 拦截调,从而避免了对数据库的查询压力。 2、如果查询的数据为空,直接将
阅读全文
摘要:横向扩容,保证哈希一致性 一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形) 下一步将各个服务器使用Hash进行一个哈希,具体可以选择服务器的ip或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置 接下来使用
阅读全文
摘要:读操作:主库、从库都可以接收; 写操作:首先到主库执行,然后,主库将写操作同步给从库。 主从第一次同步 第一阶段,主从库间建立连接、协商同步的过程,主要是为全量复制做准备。从库和主库建立起连接,主库确认回复后,就可以开始同步了。具体来说,从库给主库发送 psync 命令,psync 命令包含了主库的
阅读全文
摘要:哨兵其实是一个运行在特殊模式下的 Redis 进程,所以它也是一个节点。从“哨兵”这个名字也可以看得出来,它相当于是“观察者节点”,观察的对象是主从节点 哨兵节点主要负责三件事情:监控、选主、通知 监控 哨兵会每隔 1 秒给所有主从节点发送 PING 命令,当主从节点收到 PING 命令后,会发送一
阅读全文
摘要:删除策略 定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键的过期时间来临时,立即执行对键的删除操作 定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除
阅读全文
摘要:单机单节点模式使用 AOF 和 RDB 结合的方式 RDB 做镜像全量持久化,AOF 做增量持久化。因为 RDB 会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要 AOF 来配合使用。 Redis 集群模式 1、master 节点持久化 2、Redis断点续传:主从复制过程中,如果
阅读全文
摘要:Redis缓冲区有两个应用场景: 在客户端和服务器端之间进行通信时,用来暂存客户端发送的命令数据,或者是服务器端返回给客户端的数据结果; 主从节点间进行数据同步时,用来暂存主节点接收的写命令和数据 客户端缓冲区 是为了解决客户端和服务端请求和处理速度不匹配问题的,它又分为输入和输出缓冲区。 输入缓冲
阅读全文
摘要:从性能上来说,内存占用过高会引起Reids响应变慢 从高可用上来说,内存过大可能会会引起部分数据丢失,故障恢复变慢 Redis内存消耗主要在于其主进程消耗和子进程消耗。而主进程消耗又主要包括自身内存、对象内存、缓冲区内存、内存碎片五个方面 1、自身内存 指Redis进程自身所占用的内存,这部分内存通
阅读全文
摘要:AOF 日志,每次追加,文件量大,能设置每秒/没次,那么异常情况下丢失的数据少,文件过大时会重写,即采用最简短的命令描述数据库 RDB 快照式,快照是一次全量备份,异常情况下丢失的数据量较大 RDB文件的创建可以手动触发,也可以自动触发 服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入工作完
阅读全文
摘要:字符串对象(String) 字符串对象底层是简单动态字符串SDS 使用场景: 1、作为缓存 缓存一些热点数据。一般在读取数据的时候会先从Redis中读取,如果Redis中没有,再从数据库中读取,从而降低后端的压力。(需要注意缓存穿透、雪崩以及缓存更新等问题......) 2、计数器\限速器\分布式系
阅读全文
摘要:简单动态字符串SDS 杜绝缓冲区溢出(SDS会先扩展再修改) 减少字符串操作中的内存重分配次数(预分配和惰性清除) 二进制安全(二进制处理,使用len属性而非空格来判断字符串是否结束) 链表 指针相连,空间不连续,天然支持扩容,插入删除操作高效(时间复杂度为O(1)),但缺点是随机访问低效(时间复杂
阅读全文
摘要:速度快,因为数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是 O(1) 支持丰富数据类型,支持 string,list,set,sorted set,hash 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 丰富的特性:
阅读全文