- 博客(58)
- 收藏
- 关注
原创 解决计算百分比,累积总和不为100%的问题
public class PercentUtils { /** * 计算元素占比 * * @param elementList 元素集合 * @param idx 元素索引 * @param precision 精度 * @return */ public static String getPercentValue(List<Long> elementList, int idx, int
2022-01-12 10:16:48 3816 1
原创 Redis在秒杀场景中的具体应用
秒杀场景包含了多个环节,可以分成秒杀前、秒杀中和秒杀后三个阶段,每个阶段的请求处理需求并不相同,Redis 并不能支撑秒杀场景的每一个环节。秒杀场景的两个特征:第一个特征是瞬时并发访问量非常高。一般数据库每秒只能支撑千级别的并发请求,而 Redis 的并发处理能力(每秒处理请求数)能达到万级别,甚至更高。所以,当有大量并发请求涌入秒杀系统时,我们就需要使用 Redis 先拦截大部分请求,避免大量请求直接发送给数据库,把数据库压垮。第二个特征是读多写少,而且读操作是简单的查询操作在秒杀场景下
2021-07-02 09:57:52 1284
原创 如何解决Redis主从集群中的脑裂问题
数据丢失问题的两种情况在主从集群中发生数据丢失,最常见的原因就是主库的数据还没有同步到从库,结果主库发生了故障,等从库升级为主库后,未同步的数据就丢失了。如果是这种情况的数据丢失,我们可以通过比对主从库上的复制进度差值来进行判断,也就是计算 master_repl_offset 和 slave_repl_offset 的差值。如果从库上的 slave_repl_offset 小于原主库的 master_repl_offset,那么,我们就可以认定数据丢失是由数据同步未完成导致的。通过排查客户
2021-06-22 13:40:55 1450
原创 Redis主从数据不一致及读取过期数据问题的解决方案
主从数据不一致问题因为主从库间的命令复制是异步进行的,所以有可能客户端从从库中读取到的值和主库中的最新值并不一致。具体来说,在主从库命令传播阶段,主库收到新的写命令后,会发送给从库。但是,主库并不会等到从库实际执行完命令后,再把结果返回给客户端,而是主库自己在本地执行完命令后,就会向客户端返回结果了。如果从库还没有执行主库同步过来的命令,主从库间的数据就不一致了。从库滞后执行同步命令主要有两种情况:一方面,主从库间的网络可能会有传输延迟,所以从库不能及时地收到主库发送的命令,从库上执行同步命令的
2021-06-10 15:50:38 2322 2
原创 Redis事务机制是否能保证ACID属性?
Redis中事务的执行过程包含三个步骤,Redis 提供了 MULTI、EXEC 两个命令来完成这三个步骤:第一步,客户端要使用一个命令显式地表示一个事务的开启。在 Redis 中,这个命令就是 MULTI。第二步,客户端把事务中本身要执行的具体操作(例如增删改数据)发送给服务器端。这些操作就是 Redis 本身提供的数据读写命令,例如 GET、SET 等。不过,这些命令虽然被客户端发送到了服务器端,但 Redis 实例只是把这些命令暂存到一个命令队列中,并不会立即执行。第三步,客户端向服
2021-06-07 14:06:48 307
原创 Redis如何无锁应对并发访问及如何实现分布式锁
Redis无锁应对并发访问原子操作是一种提供无锁并发访问控制的方法。原子操作是指执行过程保持原子性的操作,而且原子操作执行时并不需要再加锁,实现了无锁操作。并发访问控制对应的操作主要是数据修改操作。当客户端需要修改数据时,基本流程分成两步:客户端先把数据读取到本地,在本地进行修改;客户端修改完数据后,再写回 Redis。我们把这个流程叫做“读取 - 修改 - 写回”操作(Read-Modify-Write,简称为 RMW 操作)。当有多个客户端对同一份数据执行 RMW 操作的话,我们就
2021-06-04 14:19:21 806
原创 如何解决Redis作为缓存的雪崩、击穿、穿透难题
缓存雪崩缓存雪崩是指大量的应用请求无法在 Redis 缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。缓存雪崩一般是由两个原因导致的:第一个原因是:缓存中有大量数据同时过期,导致大量请求无法得到处理。解决方案:首先,我们可以避免给大量的数据设置相同的过期时间。如果业务层的确要求有些数据同时失效,你可以在用 EXPIRE 命令给每个数据设置过期时间时,给这些数据的过期时间增加一个较小的随机数。这样既避免了大量数据同时过期,同时也保证了这些数据基本在相近的时间失效,
2021-05-31 14:10:30 635
原创 Redis如何保证缓存和数据库的数据一致性
缓存只读模式下,在更新数据库和删除缓存值的过程中,无论这两个操作的执行顺序谁先谁后,只要有一个操作失败了,就会导致客户端读取到旧值。如何解决数据不一致问题对于读写缓存来说,要想保证缓存和数据库中的数据一致,就要采用同步直写策略。不过,需要注意的是,如果采用这种策略,就需要同时更新缓存和数据库。所以,我们要在业务应用中使用事务机制,来保证缓存和数据库的更新具有原子性,也就是说,两者要不一起更新,要不都不更新,返回错误信息,进行重试。只读缓存模式下,还有一种方式:重试机制。具体来说,可以把要删除的缓存
2021-05-27 16:52:21 1143
原创 Redis缓存数据的淘汰机制
缓存的容量设置多大合适数据访问都是有局部性的,也就是我们通常所说的“八二原理”,80% 的请求实际只访问了 20% 的数据。一般来说,会建议把缓存容量设置为总数据量的 15% 到 30%,兼顾访问性能和内存空间开销。对于 Redis 来说,一旦确定了缓存最大容量,比如 4GB,你就可以使用下面这个命令来设定缓存的大小了:CONFIG SET maxmemory 4gbRedis 缓存有哪些淘汰策略Redis 4.0 之前一共实现了 6 种内存淘汰策略,在 4.0 之后,又增加了 2 种策略。
2021-05-26 14:38:36 886
原创 Redis为什么适合做缓存?--Redis作为缓存的工作机制
Redis为什么适合做缓存?Redis 基于内存提供了高性能的数据存取功能。缓存中的数据量也是有限的,存储的数据超过缓存容量之后,缓存中的数据需要按一定规则淘汰出去,Redis 本身是支持按一定规则淘汰数据的,这也是 Redis 适合用作缓存的一个重要原因。Redis 缓存处理请求的两种情况把 Redis 用作缓存时,我们会把 Redis 部署在数据库的前端,业务应用在访问数据时,会先查询 Redis 中是否保存了相应的数据。此时,根据数据是否存在缓存中,会有两种情况。缓存命中:Redis 中有
2021-05-25 16:14:25 3383 1
原创 Redis的缓冲区溢出问题及应对方案
缓冲区的功能其实很简单,主要就是用一块内存空间来暂时存放命令数据,以免出现因为数据和命令的处理速度慢于发送速度而导致的数据丢失和性能问题。但因为缓冲区的内存空间有限,如果往里面写入数据的速度持续地大于从里面读取数据的速度,就会导致缓冲区需要越来越多的内存来暂存数据。当缓冲区占用的内存超出了设定的上限阈值时,就会出现缓冲区溢出。客户端输入和输出缓冲区为了避免客户端和服务器端的请求发送和处理速度不匹配,服务器端给每个连接的客户端都设置了一个输入缓冲区和输出缓冲区,我们称之为客户端输入缓冲区和输出缓冲区。
2021-05-24 10:15:52 3005 1
原创 为什么Redis删除数据后内存占用率还是很高?
当数据删除后,Redis 释放的内存空间会由内存分配器管理,并不会立即返回给操作系统。所以,操作系统仍然会记录着给 Redis 分配了大量内存。这往往会伴随一个潜在的风险点:Redis 释放的内存空间可能并不是连续的,那么,这些不连续的内存空间很有可能处于一种闲置的状态。这就会导致一个问题:虽然有空闲空间,Redis 却无法用来保存数据,不仅会减少 Redis 能够实际保存的数据量,还会降低 Redis 运行机器的成本回报率。什么是内存碎片?通常情况下,内存空间闲置,往往是因为操作系统发生了较为严重的
2021-05-21 16:24:22 253
原创 如何判断Redis性能是否变慢以及如何应对
如何判断Redis是不是变慢了?一个最直接的方法,就是查看 Redis 的响应延迟。第二个方法,也就是基于当前环境下的 Redis 基线性能做判断。所谓的基线性能呢,也就是一个系统在低压力、无干扰下的基本性能,这个性能只由当前的软硬件配置决定。从 2.8.7 版本开始,redis-cli 命令提供了–intrinsic-latency 选项,可以用来监测和统计测试期间内的最大延迟,这个延迟可以作为 Redis 的基线性能。其中,测试时长可以用–intrinsic-latency 选项的参数来指定。如
2021-05-20 15:38:04 477
原创 Redis实例有哪些阻塞点--快速排查Redis阻塞问题
和客户端交互时的阻塞点网络 IO 有时候会比较慢,但是 Redis 使用了 IO 多路复用机制,避免了主线程一直处在等待网络连接或请求到来的状态,所以,网络 IO 不是导致 Redis 阻塞的因素。键值对的增删改查操作是 Redis 和客户端交互的主要部分,也是 Redis 主线程执行的主要任务。所以,复杂度高的增删改查操作肯定会阻塞 Redis。这里有一个最基本的标准,就是看操作的复杂度是否为 O(N)。Redis 中涉及集合的操作复杂度通常为 O(N),我们要在使用时重视起来。例如集合元素全量查询
2021-05-19 13:43:09 429
原创 Redis如何实现消息队列的需求
消息队列存取消息的过程:在分布式系统中,当两个组件要基于消息队列进行通信时,一个组件会把要处理的数据以消息的形式传递给消息队列,然后,这个组件就可以继续执行其他操作了;远端的另一个组件从消息队列中把消息读取出来,再在本地进行处理。消息队列在存取消息时,必须要满足三个需求,分别是消息保序、处理重复的消息和保证消息可靠性。基于 List 的消息队列解决方案具体来说,生产者可以使用 LPUSH 命令把要发送的消息依次写入 List,而消费者则可以使用 RPOP 命令,从 List 的另一端按照消息的写入顺序
2021-05-18 17:10:26 193 1
原创 Redis如何保存时间序列数据
时间序列数据的写入特点是要能快速写入,而查询的特点有三个:点查询,根据一个时间戳,查询相应时间的数据;范围查询,查询起始和截止时间戳范围内的数据;聚合计算,针对起始和截止时间戳范围内的所有数据进行计算,例如求最大 / 最小值,求均值等。关于快速写入的要求,Redis 的高性能写特性足以应对了;而针对多样化的查询需求,Redis 提供了两种方案。第一种方案是,组合使用 Redis 内置的 Hash 和 Sorted Set 类型,把数据同时保存在 Hash 集合和 Sorted Set 集合
2021-05-18 13:41:16 1004 1
原创 Redis集合类型数据的统计模式
Redis集合类型常见的四种统计模式,包括聚合统计、排序统计、二值状态统计和基数统计。聚合统计所谓的聚合统计,就是指统计多个集合元素的聚合结果,包括:统计多个集合的共有元素(交集统计);把两个集合相比,统计其中一个集合独有的元素(差集统计);统计多个集合的所有元素(并集统计)。当你需要对多个集合进行聚合计算时,Set 类型会是一个非常不错的选择。不过,这里有一个潜在的风险:Set 的差集、并集和交集的计算复杂度较高,在数据量较大的情况下,如果直接执行这些计算,会导致 Redis 实例阻塞。所以我们可
2021-05-17 17:46:06 847
原创 Redis如何选择节省内存开销的数据类型
为什么 String 类型内存开销大?String 类型并不是适用于所有场合的,它有一个明显的短板,就是它保存数据时所消耗的内存空间较多。所以当数据量过大时使用String 类型保存数据并不是好的选择。其实,除了记录实际数据,String 类型还需要额外的内存空间记录数据长度、空间使用等信息,这些信息也叫作元数据。当实际保存的数据较小时,元数据的空间开销就显得比较大了。因为 Redis 的数据类型有很多,而且,不同数据类型都有些相同的元数据要记录(比如最后一次访问的时间、被引用的次数等),所以,Red
2021-04-01 14:55:01 618
原创 Redis如何使用切片集群保存大规模数据
切片集群,也叫分片集群,就是指启动多个 Redis 实例组成一个集群,然后按照一定的规则,把收到的数据划分成多份,每一份用一个实例来保存。为了保存大量数据,我们可以使用大内存云主机和切片集群两种方法。实际上,这两种方法分别对应着 Redis 应对数据量增多的两种方案:纵向扩展(scale up)和横向扩展(scale out)。纵向扩展:升级单个 Redis 实例的资源配置,包括增加内存容量、增加磁盘容量、使用更高配置的 CPU。横向扩展:横向增加当前 Redis 实例的个数。纵向扩展的好处是,
2021-03-29 20:19:09 297
原创 Redis主库挂了后如何不间断服务---哨兵机制
Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下主库故障的问题。哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、选主(选择主库)和通知。监控是指哨兵进程在运行时,周期性地给所有的主从库发送 PING 命令,检测它们是否仍然在线运行,如果主库没有在规定时间内响应哨兵的 PING 命令,哨兵就会判定主库下线,然后开始自动切换主库的流程。哨兵机制通常会采用多实例组成的集群模式进行部署,
2021-03-26 13:54:32 426 1
原创 Redis的主从库是如何保持数据一致的
Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。为什么要采用读写分离的方式呢?如果不管是主库还是从库,都能接收客户端的写操作,要保持这个数据在三个实例上一致,就要涉及到加锁、实例间协商是否完成修改等一系列操作,但这会带来巨额的开销,影响Redis的性能表现。而主从库模式一旦采用了读写分离,所有数据的修改只会在主库上进行,不用协调三个实例。主库有了最新的数据后,会同步给从库,这样,主从库的数据就是一致的。主从库间如何进行第一次同步当我们启动多个 Redis 实例的
2021-03-25 14:52:13 868
原创 Redis如何避免数据丢失和如何实现数据快速恢复(持久化机制)
目前,Redis 的持久化主要有两大机制,即 AOF(Append Only File)日志和 RDB 快照。AOF日志说到日志,我们比较熟悉的是数据库的写前日志(Write Ahead Log, WAL),也就是说,在实际写数据前,先把修改的数据记到日志文件中,以便故障时进行恢复。不过,AOF 日志正好相反,它是写后日志,“写后”的意思是 Redis 是先执行命令,把数据写入内存,然后才记录日志。AOF日志的好处传统数据库的日志,例如 redo log(重做日志),记录的是修改后的数据,而 AOF
2021-03-24 09:55:20 637
原创 从底层数据结构及多路复用机制了解Redis为什么这么快
Redis为什么速度快?Redis接收到一个键值对操作后,能以微秒级别的速度找到数据,并快速完成操作。数据库这么多,为啥 Redis 能有这么突出的表现呢?一方面,这是因为它是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快。另一方面,这要归功于它的数据结构。这是因为,键值对是按一定的数据结构来组织的,操作键值对最终就是对数据结构进行增删改查操作,所以高效的数据结构是 Redis 快速处理数据的基础。Redis的数据结构?Redis 键值对中值的数据类型,也就是数据的保存形式,一共有五种:
2021-03-23 14:56:26 189
原创 MySQL---为什么有时候表数据删除了,表文件大小没有变化?
我们删除一条记录,InnoDB引擎只会把这个记录标记为删除,磁盘文件的大小并不会缩小。直到插入符合记录范围的数据,会复用被删除记录的位置。如果我们删掉了一个数据页上的所有记录,整个数据页就可以被复用了。进一步地,如果我们用delete命令把整个表的数据删除呢?结果就是,所有的数据页都会被标记为可复用。但是磁盘上,文件不会变小。你现在知道了,delete命令其实只是把记录的位置,或者数据页标记为了“可复用”,但磁盘文件的大小是不会变的。也就是说,通过delete命令是不能回收表空间的。这些可以复用,而没有
2021-03-18 15:50:03 459
原创 一文了解为什么有时候SQL语句的执行会突然变慢
InnoDB在处理更新语句的时候,只做了写日志这一个磁盘操作。这个日志叫作redo log(重做日志),在更新内存写完redo log后,就返回给客户端,本次更新成功。而总要找时间把磁盘数据更新一下的,把内存里的数据写入磁盘的过程,术语就是flush。在这个flush操作执行之前,内存中的数据,其实跟磁盘数据页里面的记录是不一致的。当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。平时执行很快的更新操作,其实
2021-03-16 10:26:12 293
原创 MySQL的全局锁、表锁和行锁
全局锁全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都select出来存成文本。如果我们使用的是InnoDB存储引擎,我们只需要把隔离级别设置为可重复读,导数据之前启
2021-03-15 11:09:18 251
原创 一篇文章快速了解事务及长事务的风险
什么是事务技术?事务技术:在实际的业务开发中,有些业务操作要多次访问数据库。一个业务要发送多条SQL语句给数据库执行。需要将多次访问数据库的操作视为一个整体来执行,要么所有的SQL语句全部执行成功。如果其中有一条SQL语句失败,就进行事务的回滚,所有的SQL语句全部执行失败,我们得使用数据库提供的事务技术帮我们达成这样的目的。事务(ACID)的四大特性原子性(Atomicity)事务是一个不可分割的单位,事务中的操作要么都发生,要么都不发生。一致性(Consistency)事务前后数据的完整性
2021-03-12 13:45:45 1320
原创 InnoDB和MyISAM存储引擎分别是如何进行实际存储的以及它们的区别
InnoDBInnoDB是使用页为基本单位来管理存储空间的,默认的页大小为16KB。对于InnoDB存储引擎来说,每个索引都对应着一棵B+树,该B+树的每个节点都是一个数据页,数据页之间不必要是物理连续的,因为数据页之间有双向链表来维护着这些页的顺序。InnoDB的聚簇索引的叶子节点存储了完整的用户记录,也就是所谓的索引即数据,数据即索引。为了更好的管理这些页,InnoDB提出了一个表空间或者文件空间(英文名:table space或者file space)的概念,这个表空间是一个抽象的概念,它
2021-03-11 14:02:50 359
原创 建立MySQL索引的原则及如何使用索引
使用MySQL索引都有什么原则?选择唯一性索引唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。为经常需要排序、分组和联合操作的字段建立索引经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。为常作为查询条件的字段建立索引如果某个字
2021-03-10 15:04:51 193 1
原创 自增主键对索引维护带来的影响
B+树维护过程中的页分裂B+树为了维护索引有序性,在插入新记录的时候需要做必要的维护。如果新记录本应所在的数据页已经满了,根据B+树的算法,这时候需要申请一个新的数据页,且为了符合下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值的要求,所以在插入记录的时候需要伴随着一次记录移动。这个过程表明了在对页中的记录进行增删改操作的过程中,我们必须通过一些诸如记录移动的操作来始终保证这个状态一直成立:下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值。这个过程我们也可以称为页分裂。
2021-03-09 16:37:46 398 1
原创 快速理解MySQL的回表、覆盖索引、最左匹配原则以及索引下推
对索引不了解的可以先去看下我的这篇文章:从根本去理解MySQL的索引原理和数据结构回表使用二级索引进行查询,在二级索引树上找到记录后,根据主键回到主键索引树搜索的过程,称为回表。覆盖索引使用二级索引进行查询时,由于查询结果所需要的数据只在主键索引上有,所以不得不回表。那么,我们可以通过覆盖索引,避免回表过程。也就是说,我们所需的查询结果,都存在于二级索引叶子节点中,在查询列表里只包含索引列,我们称为覆盖索引。由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手
2021-03-08 10:20:19 481 1
原创 MySQL聚簇索引和二级索引的区别
主键索引的叶子节点存的是整行数据。在InnoDB里,主键索引也被称为聚簇索引(clustered index)。非主键索引的叶子节点内容是主键的值。在InnoDB里,非主键索引也被称为二级索引(secondary index)。也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。聚簇索引聚簇索引有两个特点:使用记录主键值的大小进行记录和页的排序,这包括三个方面的含义:页内的记录是按照主键的大小顺序排成一个单向链表。各个存放用户记录的页也是根据页中用
2021-03-05 15:04:20 723 1
原创 什么是redo log(重做日志)、undo log(回滚日志)和binlog(归档日志)?
redo log在MySQL里有这样一个问题,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。MysQL使用WAL技术解决了这个问题,WAL的全称是Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的
2021-03-04 17:11:46 1327 2
原创 从根本去理解MySQL的索引原理和数据结构
MySQL服务器上负责对表中数据的读取和写入工作的部分是存储引擎,InnoDB是MySQL默认的存储引擎,也是我们最常用到的存储引擎。InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的,所以需要把磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内存中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢,和内存读写差了几个数量级,所以当我们想从表中获取某些记录时,InnoDB存储引擎需要一条一条的把记录从磁盘上读出
2021-03-01 14:05:04 77
原创 快速了解SpringMVC的概念及如何使用
1. 什么是MVC模式MVC :是一种用于设计创建web应用表现层的模式。使用它可以将业务逻辑,数据,页面显示代码分离出来。Model(模式):数据模型,代表一个存取数据的对象View(视图):用于展示数据(html,jsp)Controller(控制器):用于程序业务逻辑处理 1、封装请求:model 2、调用service 3、响应跳转视图2. MVC模式和三层架构的关系MVC把三层架构中的表现层再度进行了分化,分成了控制器、视图、模型。三层架构的目的是解耦,MVC的目的是实现w
2020-11-09 17:51:27 255 2
原创 Spring框架---IOC&AOP&事务管理重点概念理解
Spring Spring是一个于2003年兴起的轻量级的IOC和AOP容器框架,以 IOC(控制反转) 和 AOP(面向切面编程)为核心,目的是用于简化企业应用程序的开发。它的优势主要体现于方便解耦、支持AOP思想编程、支持声明式事务,可以集成各种优秀的框架,这也是它如此受欢迎的主要原因。IOC 说到Spring框架,就不得不说它的两大核心之一IOC,IOC不是什么技术,而是一种设计思想。它的目的是指导我们设计出更加松耦合的程序。 IOC就是控制反转,控制反转就是指对象的控制权的转移,
2020-09-28 16:42:13 264
原创 MyBatis入门--MyBatis的理解及使用的分析
1. 框架的概述和作用把重复的代码工作抽取出来,让程序员把精力专注在核心的业务代码实现上。框架可以理解为半成品软件,框架做好以后,接下来在它基础上进行开发。有了它之后,我们就会简化开发代码,缩短开发周期,节省开发成本。2. 三层架构的理解持久层:主要完成与数据库相关的操作,即对数据库的增删改查。因为数据库访问的对象一般称为Data Access Object(简称DAO),所以有人把持久层叫做DAO层。业务层:主要根据功能需求完成业务逻辑的定义和实现。因为它主要是为上层提供服务的,所以有人把业
2020-09-17 10:23:39 184
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人