- 博客(120)
- 收藏
- 关注
原创 《Redis 核心技术与实战》课程学习笔记(二)
数据结构:快速的 Redis 有哪些慢操作数据库这么多,为啥 Redis 能有这么突出的表现呢?一方面,因为它是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快。另一方面,因为,键值对是按一定的数据结构来组织的,操作键值对最终就是对数据结构进行增删改查操作,所以高效的数据结构是 Redis 快速处理数据的基础。简单来说,底层数据结构一共有 6 种,分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。键和值用什么结构组织?为了实现从键到值的快速访问,Redi
2023-07-04 22:49:59
433
原创 《Redis 核心技术与实战》课程学习笔记(一)
基本架构:一个键值数据库包含什么?这样学 Redis,才能技高一筹为了保证数据的可靠性,Redis 需要在磁盘上读写 AOF 和 RDB,但在高并发场景里,这就会直接带来两个新问题:一个是写 AOF 和 RDB 会造成 Redis 性能抖动;另一个是 Redis 集群数据同步和实例恢复时,读 RDB 比较慢,限制了同步和恢复速度。其实,一个可行的解决方案就是使用非易失内存 NVM,因为它既能保证高速的读写,又能快速持久化数据。很多技术人都有一个误区,那就是,只关注零散的技术点,没有建立起
2023-07-04 17:10:20
412
原创 《kafka 核心技术与实战》课程学习笔记(十)
Kafka 的 Java 生产者是如何管理 TCP 连接的?为何采用 TCP?Apache Kafka 的所有通信都是基于 TCP 的,而不是基于 HTTP 或其他协议。在开发客户端时,能够利用 TCP 本身提供的一些高级功能,比如多路复用请求以及同时轮询多个连接的能力。除了 TCP 提供的这些高级功能有可能被 Kafka 客户端的开发人员使用之外,目前已知的 HTTP 库在很多编程语言中都略显简陋。Kafka 生产者程序概览Kafka 的 Java 生产者 API 主要的对象就是
2023-06-28 23:04:48
708
原创 《kafka 核心技术与实战》课程学习笔记(九)
客户端都有哪些不常见但是很高级的功能?什么是 Kafka 拦截器?拦截器基本思想就是允许应用程序在不修改逻辑的情况下,动态地实现一组可插拔的事件处理逻辑链。它能够在主业务操作的前后多个时间点上插入对应的“拦截”逻辑。Spring MVC 拦截器的工作原理:Kafka 拦截器借鉴了这样的设计思路:可以在消息处理的前后多个时点动态植入不同的处理逻辑,比如在消息发送前或者在消息被消费后。Kafka 拦截器Kafka 拦截器分为生产者拦截器和消费者拦截器。生产者拦截器允许你在发送消息前以及
2023-06-28 21:42:46
693
原创 《kafka 核心技术与实战》课程学习笔记(七)
生产者压缩算法怎么压缩?压缩(compression)秉承了用时间去换空间的经典 trade-off 思想,具体来说就是用 CPU 时间去换磁盘空间或网络 I/O 传输量,希望以较小的 CPU 开销带来更少的磁盘占用或更少的网络 I/O 传输。目前 Kafka 共有两大类消息格式,社区分别称之为 V1 版本和 V2 版本。不论是哪个版本,Kafka 的消息层次都分为两层:消息集合(message set)以及消息(message)。一个消息集合中包含若干条日志项(record item),而日
2023-06-26 12:26:27
880
原创 《后端存储实战课》课程学习笔记(三)
商品介绍在商品详情页中占得比重是最大的,包含了大量的带格式文字、图片和视频。其中图片和视频自然要存放在对象存储里面;商品介绍的文本,一般都是随着商品详情页一起静态化,保存在 HTML 文件中。商品详情页静态化之后,不仅仅是可以节省服务器资源,还可以利用 CDN 加速,把商品详情页放到离用户最近的 CDN 服务器上,让商品详情页访问更快。至于商品价格、促销信息等这些需要频繁变动的信息,不能静态化到页面中,可以在前端页面使用 AJAX 请求商品系统动态获取。
2023-06-20 15:27:43
1400
原创 《后端存储实战课》课程学习笔记(二)
创建和更新订单时,如何保证数据准确无误?订单系统是整个电商系统中最重要的一个子系统,订单数据也就是电商企业最重要的数据资产。一个合格的订单系统,最基本的要求是什么?数据不能错。首先,你的代码必须是正确没 Bug 的,如果说是因为代码 Bug 导致的数据错误,那谁也救不了你。然后,你要会正确地使用数据库的事务。比如,你在创建订单的时候,同时要在订单表和订单商品表中插入数据,那这些插入数据的 INSERT 必须在一个数据库事务中执行。订单系统的核心功能和数据简单梳理一下一个订单系统必备的
2023-06-20 14:51:40
1353
原创 《后端存储实战课》课程学习笔记(一)
从今天起,换种方式学存储凡是那些特别难解决的、让你付出巨⼤代价的,或者是损失惨重的技术问题,几乎都可以归为存储系统的问题。存储是系统中最核心、最重要、最关键的组成部分,没有之一。你要关注存储的哪些特点?无论是什么样的存储,比如 MySQL、Redis、ElasticSearch 等等,它们都有几个共同的特点。第一个特点是难用。对于应用程序来说,存储无非就是帮我们安全可靠地保存数据,在我需要的时候能快速读出来也就可以了。很遗憾,几乎没有存储系统能满足这么简单的要求。第二个特点是慢
2023-06-19 22:51:09
3919
原创 《剑指 Offer--LeetCode 学习计划》-- 链表
剑指 Offer 06. 从尾到头打印链表(Easy)题目描述输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。限制:0 <= 链表长度 <= 10000。举例说明示例 1:输入:head = [1,3,2]。输出:[2,3,1]。解题思路利用递归:先走至链表末端,回溯时依次将节点值加入列表,这样就可以实现链表值的倒序输出。算法流程:递推阶段:每次传入 head.next,以 head == null(即走过链表尾部节点)为递归终止条件,
2023-06-13 01:27:59
922
原创 《Java 核心技术面试》课程笔记(十三)
谈谈接口和抽象类有什么区别?典型回答接口和抽象类是 Java 面向对象设计的两个基础机制。接口接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。接口,不能实例化;不能包含任何非常量成员,任何 field 都是隐含着 public static final 的意义;同时,没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。抽象类抽象类是不能实例化的类,用 abstract 关键字修饰 class,其目的主要是代码重用。除了不能实例化
2023-06-09 00:09:30
358
原创 《Java 核心技术面试》课程笔记(十二)
Java 有几种文件拷贝方式?哪一种最高效?典型回答Java 有多种比较典型的文件拷贝实现方式,比如:利用java.io 类库,直接为源文件构建一个 FileInputStream 读取,然后再为目标文件构建一个 FileOutputStream,完成写入工作。或者,利用 java.nio 类库提供的 transferTo 或 transferFrom 方法实现。总体上来说,NIO transferTo/From 的方式可能更快,因为它更能利用现代操作系统底层机制,避免不必要拷贝和上下文切换。考
2023-06-08 23:41:03
313
原创 《消息队列高手课》课程学习笔记(八)
在 NIO 中,每个已经建立好的连接用一个 Channel 对象来表示。我们希望能实现,在一个线程里,接收来自多个 Channel 的数据。
2023-06-08 22:55:06
512
原创 《消息队列高手课》课程学习笔记(七)
接下来我们看一下,如何用异步的思想来解决这个问题,实现同样的业务逻辑。异步的实现过程相对于同步来说,稍微有些复杂。
2023-05-30 00:05:51
847
原创 《消息队列高手课》课程笔记(六)
消息积压了该如何处理?优化性能来避免消息积压在使用消息队列的系统中,对于性能的优化,主要体现在生产者和消费者这一收一发两部分的业务逻辑中。对于消息队列本身的性能,不需要太关注。主流消息队列的单个节点,消息收发的性能可以达到每秒钟处理几万至几十万条消息的水平,还可以通过水平扩展 Broker 的实例数成倍地提升处理能力。一般的业务系统需要处理的业务逻辑远比消息队列要复杂,单个节点每秒钟可以处理几百到几千次请求,已经可以算是性能非常好的了。所以,对于消息队列的性能优化,我们更关注的是,在消息的收
2023-05-29 17:33:58
1107
原创 《消息队列高手课》课程笔记(五)
如何处理消费过程中的重复消息?消息重复的情况必然存在在 MQTT 协议中,给出了三种传递消息时能够提供的服务质量标准,这三种服务质量从低到高依次是:At most once: 至多一次。消息在传递时,最多会被送达一次。换个说法就是,没什么消息可靠性保证,允许丢消息。一般都是一些对消息可靠性要求不太高的监控场景使用,比如每分钟上报一次机房温度数据,可以接受数据少量丢失。At least once: 至少一次。消息在传递时,至少会被送达一次。也就是说,不允许丢消息,但是允许有少量重
2023-05-29 17:14:49
1708
1
原创 《消息队列高手课》课程笔记(三)
如何利用事务消息实现分布式事务?什么是分布式事务?消息队列中的“事务”,主要解决的是消息生产者和消息消费者的数据一致性问题。如果我们需要对若干数据进行更新操作,为了保证这些数据的完整性和一致性,我们希望这些更新操作要么都成功,要么都失败。至于更新的数据,不只局限于数据库中的数据,可以是磁盘上的一个文件,也可以是远端的一个服务,或者以其他形式存储的数据。一个严格意义的事务实现,应该具有 4 个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为 ACID 特性。原子性,是指一个事务操作不
2023-05-24 19:06:08
698
原创 《消息队列高手课》课程笔记(二)
消息模型:主题和队列有什么区别?两类消息模型早期的消息队列,就是按照“队列”的数据结构来设计的。生产者(Producer)发消息就是入队操作,消费者(Consumer)收消息就是出队也就是删除操作,服务端存放消息的容器自然就称为“队列”。这就是最初的一种消息模型:队列模型。如果有多个生产者往同一个队列里面发送消息,这个队列中可以消费到的消息,就是这些生产者生产的所有消息的合集。消息的顺序就是这些生产者发送消息的自然顺序。如果有多个消费者接收同一个队列的消息,这些消费者之间实际上是竞争的关
2023-05-24 18:37:00
1087
原创 《消息队列高手课》课程笔记(一)
后端服务从请求消息队列中获取 APP 请求,完成后续秒杀处理过程,然后返回结果。网关在收到请求后,将请求放入请求消息队列;
2023-05-24 15:06:29
1373
原创 《Java 核心技术面试》课程笔记(十一)
Java 提供了哪些 IO 方式?典型回答Java IO 基于不同的 IO 抽象模型和交互方式,可以分为:BIO,传统的 java.io 包,它基于流模型实现。提供了我们最熟知的⼀些 IO 功能,比如 File 抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会⼀直阻塞在那里,它们之间的调用是可靠的线性顺序。java.net 提供的部分网络 API,比如 Socket、ServerSocket、HttpURLConnecti
2023-05-21 18:20:25
526
原创 《Java 核心技术面试》课程笔记(十)
如何保证集合是线程安全的?典型回答Java 提供了不同层⾯的线程安全支持。在传统集合框架内部,除了 Hashtable 等同步容器,还提供了所谓的同步包装器(Synchronized Wrapper),我们可以调用 Collections 工具类提供的包装方法,来获取⼀个同步的包装容器(如 Collections.synchronizedMap),但是它们都是利用非常粗粒度的同步方式,在高并发情况下,性能比较低下。普遍的选择是利用并发包提供的线程安全容器类:各种并发容器,比如 Concurr
2023-05-21 15:49:33
635
原创 《Java 核心技术面试》课程笔记(九)
对比 Hashtable、HashMap、TreeMap 有什么不同?典型回答Hashtable、HashMap、TreeMap 都是最常见的⼀些 Map 实现,是以键值对的形式存储和操作数据的容器类型。Hashtable 是早期 Java 类库提供的⼀个哈希表实现,本身是同步的,不支持 null 键和值,由于同步导致的性能开销,所以已经很少被推荐使用。HashMap 是应用更加广泛的哈希表实现,行为上大致上与 HashTable 一致,主要区别在于 HashMap 不是同步的,支持 null 键
2023-05-19 13:06:11
310
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅