- 博客(42)
- 收藏
- 关注
原创 redis单线程还快的原因
其中,快照方式通过将内存中的数据定期写入磁盘,而AOF日志则记录每次写操作,使得Redis能够在系统宕机后快速地恢复数据。虽然Redis是单线程模型,但通过以上优化和设计,它仍然能够实现出色的性能表现,在大多数应用场景下都能够满足高并发、低延迟的要求。它使用了高性能的事件处理器,如epoll(Linux系统)、kqueue(BSD系统)等,以非阻塞的方式处理多个并发连接,从而提高了系统的吞吐量和响应速度。Redis的设计非常简洁,功能清晰明了,避免了复杂的逻辑和不必要的开销。
2024-02-09 14:17:14
1514
原创 mysql索引的概念以及数据结构
与B-Tree不同,B+Tree只在叶子节点存储数据,内部节点只存储键值和指向下一级节点的指针,这提高了数据检索的效率。避免频繁更新的字段上建立索引: 索引的维护需要额外的成本,如果在经常更新的字段上建立索引,可能会导致性能下降。选择合适的索引: 根据查询的需求和数据分布选择合适的索引类型,避免创建过多或不必要的索引。联合索引优化: 考虑创建联合索引以覆盖多个查询条件,但要注意索引的顺序对查询性能的影响。注意索引列的选择: 应该优先选择查询频率高、选择性好的列进行索引,以获得更好的查询性能。
2024-02-09 14:09:23
678
原创 redis的数据淘汰测略
需要注意的是,不同的淘汰策略适用于不同的场景和需求。同时还可以通过设置 maxmemory 参数来限制 Redis 使用的最大内存,当内存超出限制时,根据淘汰策略进行数据删除。对于不同的业务场景,可能需要进行一定的测试和调优,以找到最适合的数据淘汰策略。:从已设置过期时间的键中挑选最近最少使用的数据进行淘汰。:从已设置过期时间的键中挑选最不经常使用的数据进行淘汰。:从已设置过期时间的键中挑选即将过期的数据进行淘汰。:从已设置过期时间的键中随机选择数据进行淘汰。:从所有键中挑选最不经常使用的数据进行淘汰。
2024-02-03 16:29:04
548
原创 冒泡排序(Bubble Sort)、快速排序(Quick Sort)和归并排序(Merge Sort)
冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,依次比较相邻两个元素,如果它们的顺序错误就交换它们。快速排序是一种基于分治思想的高效排序算法,它选取一个元素作为基准值,将数组分为小于基准值和大于基准值的两个子数组,然后对这两个子数组进行递归排序,最终得到有序数组。归并排序也是一种基于分治思想的排序算法,它将数组划分为较小的子数组,然后对子数组进行递归排序,最终通过合并操作得到有序数组。归并排序的时间复杂度为 O(nlogn),但需要额外的空间来存储合并过程中的数组。
2024-02-03 16:13:10
766
原创 HashMap的结构和put流程
然而,在极端情况下,所有的键值对都被存储在同一个桶中,形成了一个链表或红黑树,此时的操作时间复杂度可能退化为O(N),其中N是键值对的数量。在进行插入、查找或删除操作时,HashMap会根据键的哈希值快速定位到对应的桶,然后通过键的引用或equals方法在桶中查找或操作相应的键值对。,根据要插入的键(key)计算其哈希值(通过key的hashCode方法),然后通过哈希值和HashMap的内部数组长度进行取模运算,得到该键值对应的存储位置(桶)的索引。如果数量较多,会将链表转换为红黑树,以提高查找效率。
2024-01-27 18:31:31
375
原创 线程创建的四种方式
在上述例子中,通过Executors.newFixedThreadPool(2)创建了一个固定大小为2的线程池,然后提交了5个任务给线程池执行。在上述例子中,创建了一个实现了Runnable接口的类MyRunnable,并实现了run()方法。在Java中,有4种主要的方式来创建线程:通过继承Thread类和通过实现Runnable接口,实现Callable接口,线程池。通过实现Runnable接口,需要实现run()方法,然后将实现了Runnable接口的类的实例传递给Thread类的构造函数。
2024-01-27 18:24:54
395
原创 MySql索引
*聚簇索引(Clustered Index):**聚簇索引按照索引的键值对表中的实际数据进行排序,并以此作为物理存储顺序。**非聚簇索引(Non-clustered Index):**非聚簇索引是独立于实际数据的一种索引结构,它包含索引的键值和指向实际数据的指针。除了上述常见的索引类型之外,MySQL还支持其他类型的索引,如前缀索引、组合索引等。因此,在设计数据库时,应该根据具体的业务需求和数据量大小,合理地选择使用索引,并对索引进行优化。通过存储索引的键值和指向实际数据行的指针来加速数据的查找和检索。
2024-01-19 15:13:12
398
原创 mvcc机制
它通过在数据库中维护多个版本的数据来实现,允许不同的事务同时读取和修改同一表的数据,而不会产生冲突。每个事务在执行时都能看到一个一致的数据库状态,这个状态是在事务开始时确定的。在整个事务执行期间,事务都只能看到这个快照中的数据,而不受其他事务的影响。当一个事务执行读操作时,它会使用事务开始时创建的快照,而不受其他并发事务的修改影响。当事务提交时,它所做的修改会变为当前数据库状态的一部分,而其他事务将能够看到这些修改。在MVCC中,事务B读取的是事务A开始前的数据快照,而不受事务A的修改的影响。
2024-01-19 14:45:11
412
原创 数据库常用锁
描述: 排他锁是一种独占锁,一个事务获得排他锁后,其他事务无法再获取相同数据的任何类型的锁,包括共享锁和排他锁。示例: 一个事务可能在某个数据行上持有共享锁,但是有意向在之后对该行进行排他操作,它会获取意向排他锁,告诉其他事务有可能会在该行上设置排他锁。示例: 当一个事务对某行数据进行读取时,它会获取共享锁,其他事务也可以获得相同数据的共享锁,但是不允许有任何事务获取排他锁(独占锁)。示例: 当一个事务对某行数据进行写入(更新或删除)时,它会获取排他锁,阻止其他事务获取相同数据的任何类型的锁。
2023-12-11 19:05:04
401
1
原创 CPU密集型和IO密集型对 CPU内核之间的关系
但是,由于CPU密集型任务主要依赖于处理器的计算能力,因此在多个CPU内核之间的性能提升并不是线性的,也就是说,随着CPU内核数量的增加,任务的执行效率会逐渐降低。在这种情况下,多个CPU内核之间的关系并不是单纯的竞争关系,而是一种协作关系,通过充分利用CPU资源来提高系统的性能和效率。是指需要大量计算能力的任务,例如图像处理、科学模拟等,通常会占用CPU的大部分时间,而IO密集型任务则是指需要进行大量IO操作的任务,例如文件读写、网络通信等,这些任务的执行过程中通常会涉及到IO操作等待的时间。
2023-12-07 19:35:17
386
原创 ELK的日志解决方案
例如,可以使用 Filebeat 作为输入源,将指定文件内的日志数据发送给 Logstash,然后使用 Grok 进行日志格式解析和字段提取,最后将处理后的日志数据发送到 Elasticsearch 中。启动 Elasticsearch、Logstash 和 Kibana 后,可以通过浏览器访问 Kibana 的 Web 界面,例如:http://localhost:5601。是一个开源的数据收集引擎,用于将不同来源的数据转换成统一的格式并发送到 Elasticsearch 中。
2023-12-06 20:35:29
1390
原创 线程池7大参数,4大拒绝策略详解
在这个示例中,我们创建了一个线程池,核心线程数为5,最大线程数为10,空闲线程存活时间为60秒,任务队列容量为100,使用默认的线程工厂和CallerRunsPolicy拒绝策略。当线程池中的线程数量超过核心线程数时,并且任务队列已满时,线程池会创建新的线程来处理任务,直到达到最大线程数。:当线程池中的线程数量超过核心线程数时,多余的空闲线程的存活时间。超过这个时间,空闲线程将被回收,直到线程数量等于核心线程数为止。可以自定义线程工厂,以便在创建线程时进行一些特殊处理,比如指定线程名字、设置线程优先级等。
2023-12-05 19:21:38
442
原创 详解 linux常用命令 ps top |grep df tail/head/cat
top 命令用于实时显示系统中各个进程的资源占用情况,而 grep 命令用于过滤文本。ps 命令用于显示当前运行进程的快照。它提供了查看系统中正在运行的进程的信息的途径。
2023-12-02 17:58:42
652
原创 docker常用命令
docker inspect :查看容器的详细信息,包括 IP 地址、网络配置等。docker logs --tail :只显示容器日志的最后几行。docker logs -f :实时跟踪容器的日志输出。docker logs :查看容器的日志。
2023-12-02 17:37:20
858
原创 synchronized 关键字
面试时经常拿synchronized关键字和volatile关键字的特性进行对比,synchronized关键字可以保证并发编程的三大特性:原子性、可见性、有序性,而volatile关键字只能保证可见性和有序性,不能保证原子性,也称为是轻量级的synchronized。独占锁或者排他锁:synchronized关键字实现的是独占锁,即该锁只能被一个线程所持有,其他线程均被阻塞。非公平锁:synchronized关键字实现的是非公平锁,即线程获取锁的顺序并不一定是按照线程阻塞的顺序。
2023-11-30 19:41:09
811
原创 过滤器(Filter)、拦截器(Interceptor)和AOP(面向切面编程)之间的差异
主要用于Servlet规范中,对请求和响应进行预处理和后处理。主要用于Spring框架中,对Controller处理过程进行增强。是一种编程范式,通过切面将横切关注点模块化,可以用于处理事务、日志等横切关注点。在实际应用中,过滤器、拦截器和AOP可以协同使用,根据需求选择合适的方式来增强应用的功能。过滤器范围最大,拦截器次之,aop最小aop操作最细致,拦截器次之,过滤器最小。
2023-11-29 19:44:38
588
原创 代理的三种方式:静态代理、动态代理和CGLIB
代理类需要手动编写: 开发者需要创建一个代理类,该代理类通常实现与目标类相同的接口。代码维护较繁琐: 如果有多个类需要代理,每个类都需要编写相应的代理类,导致代码冗余。编译时确定: 代理类在编译时期就已经确定,因此在运行时不会再动态生成新的类。运行时生成代理类: 代理类在运行时动态生成,无需手动编写代理类。基于继承的代理: CGLIB代理通过生成目标类的子类来实现代理。基于接口的代理: JDK动态代理要求目标类实现接口。无需接口: 目标类可以是没有实现任何接口的普通类。
2023-11-28 19:54:25
419
原创 springmvc工作流程
这个流程的设计使得开发者能够灵活地组织代码,实现清晰的业务逻辑和视图分离,从而提高Web应用的可维护性和可扩展性。View Resolver:DispatcherServlet使用视图解析器解析Controller返回的视图名,得到具体的视图对象。View:得到视图对象后,DispatcherServlet调用视图的渲染方法,生成最终的HTML或其他格式的响应。控制器方法处理业务逻辑,可以通过注解(如@RequestMapping)指定处理的URL以及请求的方法类型。处理器执行(Controller)
2023-11-27 20:32:35
373
原创 Rpc和http的区别
当谈到远程通信时,人们经常会遇到两个广泛使用的概念:RPC(Remote Procedure Call,远程过程调用)和HTTP(Hypertext Transfer Protocol,超文本传输协议)。它们在远程通信中扮演着不同的角色,并且有着一些显著的区别。下面将详细讨论它们之间的差异。RPC(Remote Procedure Call)和 HTTP(Hypertext Transfer Protocol)的区别。
2023-11-25 18:10:01
451
原创 设计模式之建造者模式(Builder Pattern)
建造者模式是一种对象创建型模式,它通过一步一步地构建复杂对象,使得同样的构建过程可以创建不同的表示。该模式的主要目的是将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是其中之一,它主要用于创建一系列复杂对象的构建过程,使得构建过程和最终的表示分离。指导者(Director):负责构建使用建造者接口的对象,通常包含一个构建方法,通过调用建造者的方法按特定顺序构建产品。更好的控制构建过程:通过指导者控制构建过程,可以灵活地选择构建顺序或部件组合方式。需要更好地控制构建过程。
2023-11-23 20:37:11
352
原创 HTTP vs WebSocket: 协议比较
HTTP(Hypertext Transfer Protocol)和WebSocket是两种网络通信协议,它们在实时通信、性能和应用场景等方面有着显著的区别。在本文中,我们将深入比较它们的特性。
2023-11-22 20:12:12
305
原创 ConcurrentHashMap和HashMap的区别
在Java编程中,和HashMap是两个常被比较的集合类。它们之间存在一些关键的区别,主要涉及到线程安全性、性能、迭代器一致性等方面。
2023-11-21 20:38:04
105
1
原创 网络的七层,tcp与udp之间的区别。
计算机网络体系结构通常按照 OSI(开放系统互联)模型划分为七个层次,每个层次都有特定的功能和责任,而 TCP(传输控制协议)和 UDP(用户数据报协议)则分别属于其中的传输层。处理数据包的路由和转发,将数据从源主机传输到目标主机,克服不同网络拓扑和寻址方案的差异。在这一层,TCP和UDP是两种常见的传输协议。负责数据格式转换、数据加密和压缩,确保不同设备和系统之间的数据交换不受影响。管理用户会话,确保数据的正确传输,包括建立、维护和终止通信会话。在网络的传输层,有两个主要的协议:TCP和UDP。
2023-11-20 19:33:00
78
1
原创 生产者消费者消费者模型
在这个示例中,我们创建了一个共享的缓冲区(使用LinkedList实现的Queue),设置了最大缓冲区大小为5。生产者和消费者之间通过共享缓冲区进行通信和同步。通过共享缓冲区来实现异步传输,生产者和消费者之间的交互被解耦,从而提高了系统的性能和可伸缩性。生产者-消费者模型的主要思想是将生产者和消费者之间的交互解耦,并通过共享缓冲区来实现异步传输。具体地,生产者向共享缓冲区中添加数据,而消费者从共享缓冲区中取出数据并进行处理。然而,实现生产者-消费者模型时需要注意锁的使用和同步问题,以避免潜在的并发问题。
2023-10-30 19:21:04
43
1
原创 数据库分表分库的原则
数据库分表分库通常采用水平分割的方式,将数据行按照某种规则划分到不同的表和/或不同的数据库中。每个月创建一个新的订单表,以减少单个表的数据量,从而提高查询和写入的效率。将用户信息存储在一个独立的数据库中,并实施更高级别的安全措施,如数据加密、访问控制,有助于增强数据的安全性。这符合数据安全性原则。当考虑数据库分表分库的原则时,关键是根据具体的业务需求和系统特点进行设计,以提高系统性能、可扩展性和安全性。数据库分表分库是一种常见的数据库设计和管理策略,旨在提高数据库性能、可伸缩性和数据管理的效率。
2023-10-28 17:19:54
125
1
原创 Threadlocal对象的使用
然后,在每个线程中,可以通过get()方法获取当前线程的变量副本,并通过set()方法设置当前线程的变量值。是一个线程局部变量的工具类,为每个线程提供了一个独立的变量副本,使得每个线程都可以独立地操作自己的变量,而不会干扰其他线程的数据。在Web应用程序中,可以使用ThreadLocal将当前用户的身份信息传递给后续的方法调用,而不需要在每个方法参数中显式传递。: 在多线程环境下,使用ThreadLocal管理数据库连接,确保每个线程都有自己的连接对象,避免线程间的干扰和竞争。
2023-10-25 19:41:01
31
1
原创 volatile关键字
在这种情况下,我们可以使用volatile关键字来保证可见性,但由于写操作不依赖于当前值,所以即使多个线程同时对变量进行写操作,也不会出现竞态条件或数据不一致的问题。在写操作不依赖于当前值的情况下,即使多个线程同时对变量进行写操作,也不会出现竞态条件或数据不一致的问题。这种情况下,即使多个线程同时对变量进行写操作,也不会出现竞态条件或数据不一致的问题。当一个线程对volatile变量进行写操作时,JVM会立即将该变量的值刷新到主内存中,其他线程读取该变量时会直接从主内存中获取最新的值,保证了变量的可见性。
2023-10-24 19:35:41
26
原创 CAS(Compare and Swap)
CAS操作只关注共享变量的当前值,如果在CAS操作执行之前和之后,共享变量的值经历了从A到B再到A的变化,CAS操作可能会误以为没有其他线程修改过变量。CAS操作通常用于实现同步和锁定机制,以确保线程安全。假设有一个共享的计数器,多个线程需要增加这个计数器的值,但我们要确保每次增加操作都是原子的,以避免竞态条件。这个示例演示了CAS的一个常见用法,用于确保多线程环境下的安全操作,而无需使用显式锁定,提高了性能和并发度。原子操作:CAS操作本身是原子的,因此可以用来实现其他原子操作,如计数器的递增和递减。
2023-10-24 19:24:10
36
原创 搭建nexus私服部署项目
在资料库中,“Snapshot” 通常指的是开发中或未经过完整测试的构件版本。通常,快照版本没有固定的版本号,而是使用一个带有时间戳或唯一标识符的字符串来标识。:在代码仓库和资料库中,“Release” 表示一个稳定的、经过测试且适用于生产环境的版本。在软件开发中,发布版往往会分配一个特定的版本号,以便用户和开发者可以准确地识别并使用它。发布版是经过严格测试和验证的,可供用户部署和使用的稳定版本。" 指的是只读模式,即应用程序或系统处于一种状态,其中任何用户或进程都无法对其进行修改或写入操作。
2023-10-23 19:44:43
151
原创 RBAC-基于角色权限的模型
在实际应用中,可以根据具体的需求,通过插入数据进行角色、权限和用户的创建和关联,从而构建RBAC模型来管理系统的访问控制。例如,可以创建管理员角色,并将特定的权限分配给该角色,然后将管理员角色分配给相应的用户。通过将角色和权限进行组合,并将角色分配给用户,可以实现对系统资源的灵活访问控制。权限(Permission):权限是指某个操作或访问某个资源的能力。RBAC模型定义了三个主要的实体:角色、权限和用户。用户(User):用户是系统的实际操作者。角色(Role):角色是一组相同权限的集合。
2023-10-22 23:43:59
57
1
原创 redis的基本数据类型
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。是一个string类型的field和value的映射表,hash特别适合用于存储对象。只有在 key 不存在时设置 key 的值。为哈希表 key 中的指定字段的整数值加上增量 increment。将哈希表 key 中的字段 field 的值设为 value。返回 key 所储存的字符串值的长度。设置指定 key 的值 set fruit apple。移除有序集合中给定的分数区间的所有成员。
2023-10-19 20:43:52
39
原创 spring缓存注解
*@CacheEvict:**标注在方法上,表示该方法用于从缓存中清除一个或多个条目,可以设置缓存的名称、key和清除模式等相关属性。**@Cacheable:**标注在方法上,表示该方法的结果将会被缓存,下次调用时如果参数相同就可以直接返回缓存中的值,而不需要执行该方法。**@CachePut:**标注在方法上,表示该方法的结果将会被缓存,不同的是,每次调用该方法都会执行方法体,并将结果缓存起来,更新缓存中的值。当该方法被调用时,缓存管理器会根据value属性指定的名称查找相应的缓存并执行清除操作。
2023-10-18 19:48:44
39
1
原创 springmvc的工作流程
2DispatcherServlet 接收请求:在 Spring MVC 中,所有的请求都会先经过一个称为 DispatcherServlet 的中央控制器。4Controller 处理请求:一旦确定了请求对应的处理器,DispatcherServlet 就会将请求转发给它。1客户端发送请求:当客户端(例如浏览器)发起一个 HTTP 请求时,它会通过 URL 地址和请求方法(GET、POST 等)来向服务器发送请求。7渲染视图:视图对象会负责呈现模型数据,生成最终的响应内容。
2023-10-17 19:48:44
195
原创 mysql数据库引擎-Inodb,MyISAM
InnoDB:支持事务处理和外键约束,被广泛应用于Web应用程序中的数据存储。innoDB为mysql表提供了acid事务支持,系统崩溃修复能力和多版本并发控制的行级锁,该引擎提供了行级锁和外键约束,所以InnoDB是事务型数据库首选的引擎。在数据库中,引擎负责管理数据的组织、存储结构、索引等方面的工作,提供高效、可靠的数据操作和查询功能。聚簇索引和非聚簇索引的优点和缺点不同,因此在具体的应用场景中需要根据需要选择。因此,在需要进行复杂事务处理的应用场景中(如金融系统),通常推荐使用InnoDB引擎。
2023-10-16 19:16:52
34
1
原创 配置maven私服-nexus
选择maven2(hosted)在本地仓库上传的文件夹(maven-repository)下创建一个shell脚本,命名 localrepository.sh创建脚本touch编辑脚本vim/bin/bashdo;;;;;;esacdone。
2023-10-12 20:53:29
184
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人