- 博客(43)
- 收藏
- 关注
原创 nginx: [emerg] bind() to 0.0.0.0:18888 failed (98: Unknown error)问题解决办法
周末断网,今天来了之后,nginx出现这个问题,本站基本搜索的都是端口被占用问题,我试着杀掉所有占用端口的进程,解决办法。./nginx -c /home/portal/nginx/conf/nginx.conf(PS:路径换成自己的)2.然后启动(./nginx)nginx(PS:不要./nginx -s reload)3.如果启动失败失败,重新指定配置文件的路径。
2023-10-30 16:04:02
1052
原创 关于knike4j接口文档信息泄露的处理记录
测试发现在接口文档的访问路径被泄露,我查阅参考后,有两种方式,一种是在启动类上加一个注解,另一个是在配置文件里,对knife4j的配置加上production:true(即为生产环境屏蔽),然后重启项目即可,但重点来了,拍案叫绝啊,我好大哥直接在启动类上把@EnableSwagger注解注释了。
2023-10-26 18:14:24
1553
原创 如何解决跨域问题
跨域问题是指在浏览器中发起跨域请求时,由于浏览器的同源策略限制,导致请求被拒绝或无法正常发送和接收数据。同源策略要求两个页面具有相同的协议、域名和端口号,否则就会出现跨域问题。代理服务器:将浏览器的请求发送到同一域名下的代理服务器上,然后由代理服务器转发请求到目标服务器上,再将响应返回给浏览器。标签,并指定请求的URL,将数据作为参数传递到服务器端,服务器端将数据包装为回调函数的调用,并返回给客户端。CORS(跨域资源共享):在服务器端设置响应头部信息,允许特定的域名或全部域名访问该资源。
2023-08-19 14:53:24
234
原创 线程池源码剖析
线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runnable或Callable接口的实例对象;
2023-08-12 15:29:31
86
原创 Synchronized关键字原理
Java内存模型中定义了以下8种操作来完成,主内存与工作内存之间具体的交互协议,即一个变量如何 从主内存拷贝到工作内存、如何从工作内存同步回主内存之类的实现细节,虚拟机实现时必须保证下面 提及的每一种操作都是原子的、不可再分的。一个线程可以多次执行synchronized,重复获取同一把锁。一个线程获得锁后,另一个线程想要获得锁,必须处于阻塞或等待状态,如果第一个线程不释放锁,第二个线程会一直阻塞或等待,不可被中断。
2023-08-11 20:25:49
157
原创 Maven的声明周期
Maven的声明周期(Lifecycle)是指一系列的构建阶段(Phase),它定义了Maven在构建过程中执行的一系列操作。常用的default周期包括:validate(校验项目)、compile(编译源代码)、test(运行测试代码)、package(打包成可发布格式)、install(将打包结果安装到本地仓库)等。clean周期:用于清理项目的构建产物。总之,Maven的声明周期定义了一系列构建阶段,开发者可以根据需要配置和扩展这些阶段,以实现项目的构建和发布。
2023-08-11 11:11:17
158
原创 RocketMQ为什么会主动推送16次
属性来指定消息的最大重试次数。默认情况下,该属性的值是16,即消息最多会被重试16次。超过这个次数后,消息将被标记为消费失败。这个配置的目的是为了在消息消费失败的情况下,进行一定次数的重试,以尽可能确保消息的可靠性传递。但需要注意的是,过多的重试可能会导致消息处理的延迟和资源消耗。因此,具体的消息重试次数应该根据实际业务需求和系统资源进行调整,以平衡可靠性和性能之间的关系。RocketMQ默认情况下不会进行16次的消息重试。实际上,RocketMQ的消息重试次数是可以配置的,而不是固定的16次。
2023-08-09 20:29:38
269
原创 服务治理 Nacos Discovery
服务治理时微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。3.在application.yaml文件中添加Nacos服务的注册地址。1.在pom.xml文件中添加Nacos依赖。将一个服务注册到Nacos。Nacos做为注册中心。2.在主启动类上添加。
2023-08-08 22:53:10
76
原创 微服务的架构
微服务架构中,服务之间同步调用是通过Feign来实现的,那服务间的异步解耦就要通过MQ(消息中间件)来实现了。链路追踪(sleuth):追踪请求日志,加了两个属性,轨迹id和微服务轨迹id,一个请求对应一个轨迹id,相同请求的轨迹id是相同的,同一个请求可能经过多个微服务,每个微服务的id不同,通过轨迹id下的微服务的id可以知道走了那些微服务。请求进入网关(gateway),统一URL地址,由网关统一分发地址(类似前端控制器),并将微服务的公共功能移入网关,如对用户的请求进行拦截过滤等一系列功能。
2023-08-08 22:41:50
76
原创 HashMap面试题总结
按照函数注释,因为bucket数组大小是2的幂,计算下标index = (table.length - 1) & hash,如果不做 hash 处理,相当于散列生效的只有几个低 bit 位,为了减少散列的碰撞,设计者综合考虑了速度、作用、质量之后,使用高16bit和低16bit异或来简单处理减少碰撞,而且JDK8中用了复杂度 O(logn)的树结构来提升碰撞下的性能。如果不存在就插入到链表的最后一个位置上。插入到链表之后,会将链表的长度更新,如果链表长度大于等于8的话,会将该链表更新会红黑树。
2023-08-07 22:53:28
159
原创 gateway网关过滤器执行原理
3.然后网关的上下文会传递到DispatcherHandler,它负责将请求分发给 RoutePredicateHandlerMapping。过滤器的执行分为前置和后置,向下的箭头是前置,向上的箭头是后置,区别在于时间点,也就是分割线,在目标方法之前是前置,在目标方法之后是后置。HandlerMapping:存储的元数据,包括过滤器和目标服务的Controller的元数据(目标方法和名称),相当于一个map。WebHandler:执行map中的元素,若果是过滤器就执行过滤器,如果是方法就执行方法。
2023-08-04 19:11:23
334
原创 自定义路由
怎样把http://localhost:9000/order-servsave转换到http://localhost:9000/order-service/save?3.补充uri的地址,lb协议是使用负载均衡策略(Ribbon)把真实服务的名称附加上来。1.获取域 http://localhost:9000/order-serv。2.地址截断操做 截断几层 1层 以 / 分层 从后往前数。找到路由的配置信息,通过过滤器StripPrefix。4.附上资源地址进行访问。
2023-08-04 18:51:13
91
原创 Gateway网关获取问服务的地址
网关启动的时候会把Nacos中服务的IP地址和端口号下载到自己的本地缓存,这些数据以键值对的形式存储在本地缓存中,key是服务的名称,value是服务的IP地址和端口号,前端发送请求后访问到网关,到网关后,先去本地缓存中查找,通过服务名称查找IP地址和端口号(做负载均衡),来明确要访问的服务,然后再把资源地址附上来进行访问,实际上还是访问真实的IP地址和端口号,资源的路径到对应的服务才访问,网关里只存储IP地址和端口号和元数据。
2023-08-04 17:22:28
1471
原创 对象序列化的含义和意义
3. 跨平台和跨语言支持:对象序列化可以将对象转换为通用的字节序列,使得可以在不同的平台和编程语言之间进行数据交换和通信。这为异构系统的集成提供了便利。1. 持久化存储:通过对象序列化,可以将对象保存到磁盘或数据库中,以便在程序重新启动时可以重新加载和使用这些对象。4. 缓存和性能优化:通过序列化对象并将其存储在缓存中,可以减少从数据库或其他数据源中获取对象的次数,提高系统的性能和响应速度。总之,对象序列化在数据持久化、远程通信和系统集成等方面具有重要的意义,可以方便地在不同的环境中传输和存储对象数据。
2023-08-02 14:11:16
936
原创 HTTP(超文本传输协议)和RPC(远程过程调用)协议之间的区别
RPC通常用于分布式系统和客户端-服务器架构,其中不同机器上的程序需要通信并调用远程系统上的函数。需要注意的是,有不同的RPC框架和实现,每个实现都有自己的特点和规范。4. 接口定义:HTTP没有严格的接口定义,它依赖于URL的结构和HTTP方法(GET、POST、PUT、DELETE等)的语义来定义交互。而RPC通常使用接口定义语言(IDL)来定义可用的过程、它们的参数和返回类型。而RPC是一种允许一台计算机上的程序调用另一台计算机上的子程序或函数的协议,隐藏了底层通信的细节。
2023-08-02 13:59:14
215
原创 Redis 可以作为 Mybatis 的二级缓存么?需要怎么配置
完成这些配置后,MyBatis 将使用 Redis 作为二级缓存来缓存查询结果。请注意,确保你的 Redis 服务器正在运行并且应用程序可以访问到它。Redis 可以作为 MyBatis 的二级缓存。1. 添加 Redis 的依赖项到项目中。可以在项目的构建配置中添加 Redis 客户端库,如 Jedis 或 Lettuce。)中提供 Redis 连接详细信息和其他相关配置。3. 在 MyBatis 的配置文件中将 Redis 配置为缓存实现。4. 此外,还需要在应用程序的配置文件(如。
2023-08-02 13:45:49
94
原创 Redis 缓存穿透
Redis 缓存穿透(Redis Cache Penetration)是指在缓存中无法找到所需数据,导致每次请求都需要访问数据库,从而增加了数据库的负载。3. 数据预加载(Cache Preloading):在系统启动时,将常用的数据预先加载到缓存中,提前减少数据库查询次数。2. 安全问题:攻击者可以通过故意查询不存在的数据来绕过缓存层,直接访问数据库,可能导致数据库压力过大。综上所述,为了避免缓存穿透问题,可以采取多种手段来提高缓存命中率,减少对数据库的访问。
2023-08-02 13:45:33
168
原创 阐述你对于 Redis 穿透和雪崩的一个理解
Redis 雪崩(Redis Cache Avalanche)是指在某个时间点,大量缓存同时失效或过期,导致大量请求直接访问数据库,造成数据库压力剧增。为了避免缓存雪崩,可以采取以下措施:设置合理的缓存过期时间,避免大量缓存同时失效;使用多级缓存架构,如热点数据使用本地缓存,冷数据使用分布式缓存;这种情况通常发生在恶意攻击或者查询不存在的数据时。为了避免缓存穿透,可以采取布隆过滤器(Bloom Filter)等技术来过滤无效的查询,或者缓存空对象(Cache Null Object)来避免频繁查询数据库。
2023-08-02 13:45:11
46
原创 list 和 Redis 里面的 list 有什么区别
是一种特殊的数据类型,也被称为链表。它是一个双向链表,可以在链表的两端进行插入、删除和访问操作。还具有一些其他特性,例如可以通过索引快速访问元素、支持阻塞操作等。它被广泛用于实现消息队列、任务队列等场景。是一种数据结构,用于存储一系列有序的元素。它可以包含重复的元素,并且允许在任意位置插入、删除或访问元素。还提供了一些特殊的操作,例如在指定元素前后插入元素、获取指定范围内的元素等。是一种特殊的数据类型,提供了一些额外的操作和特性。是一种通用的编程概念,而 Redis 中的。此外,Redis 的。
2023-08-02 13:44:43
147
原创 谈谈平衡二叉树和红黑树
平衡二叉树要求左右子树的高度差不超过1,而红黑树通过节点颜色和旋转操作来保持树的平衡。- 红黑树适用于需要高效的插入、删除和查找操作的场景,它的平衡性能较好,并且在实践中被广泛应用于诸如C++ STL中的数据结构,以及数据库和操作系统的实现中。- 红黑树的特点是,从根节点到任意叶子节点的最长路径不会超过最短路径的两倍,保证了树的近似平衡。- 红黑树的节点有两种颜色,红色或黑色,通过调整节点的颜色和旋转操作来保持树的平衡。- 在平衡二叉树中,每个节点的左子树和右子树的高度差不超过1,以保持树的平衡。
2023-08-01 20:38:42
160
原创 B-tree 和 B+tree 的区别
而 B+tree 是在 B-tree 的基础上进行了改进,将所有的键都存储在叶子节点,而非中间节点。2. 应用场景:B-tree 适用于需要频繁进行范围查询的场景,因为它的中间节点中存储了键的范围信息,可以快速定位到目标范围。而 B+tree 更适合用于需要进行顺序访问和范围查询的场景,因为所有的键都存储在叶子节点,并且通过链表连接,可以实现高效的顺序遍历。而 B+tree 也常被用作数据库的索引结构,它的叶子节点形成了一个有序的链表,可以支持范围查询和顺序遍历。
2023-08-01 20:35:37
914
1
原创 Redis操作有哪些是原子性的?
这些操作在 Redis 中是原子性的,即这些操作要么完全执行成功,要么完全不执行,保证了数据的一致性和可靠性。4. LPUSH/RPUSH:将一个或多个值插入到列表的头部或尾部。3. INCR/DECR:对指定 key 的值进行增加或减少操作。10. ZADD:将一个或多个成员元素及其分数值添加到有序集合中。5. LPOP/RPOP:从列表的头部或尾部移除并返回一个元素。11. ZREM:从有序集合中移除一个或多个成员。7. SREM:从集合中移除一个或多个元素。1. SET:设置指定 key 的值。
2023-08-01 19:51:08
3207
1
原创 Redis 中的持久化方式
2. AOF(Append-Only File)持久化:AOF 持久化记录了 Redis 服务器所执行的所有写操作命令,以追加的方式保存到磁盘上的 AOF 文件中。AOF 持久化可以提供更好的数据完整性和持久性,但相对于 RDB 持久化来说,文件体积更大,恢复速度更慢。可以根据实际需求选择适合的持久化方式,也可以同时启用两种方式来提供更好的数据保护和恢复能力。1. RDB(Redis Database)持久化:RDB 是一种快照的持久化方式,它会将 Redis 的数据以二进制格式保存到磁盘上。
2023-08-01 19:38:37
49
1
原创 有没有做 Redis 的集群?有哪几种方式,Redis 的集群最少要有多少个节点?如果其中一个节点挂掉会怎样?如果只有两个主节点 Redis 能不能跑起来?
在 Redis Sentinel 中,Sentinel 进程会自动检测到主节点的故障,并从从节点中选举出新的主节点,确保集群的可用性。在 Redis Cluster 中,集群会自动进行数据迁移和重新分配,使得集群中的其他节点可以接管故障节点的数据,保持集群的正常运行。总结:Redis 提供了多种集群方式,其中 Redis Sentinel 和 Redis Cluster 是常见的方式。这种方式需要一个或多个 Sentinel 进程来监控 Redis 主节点和从节点的状态,并在主节点故障时自动进行故障转移。
2023-08-01 19:35:23
243
1
原创 Redis为什么是单线程的而不是多线程的?从 cpu的角度来看,单线程和多线程有什么性能的区别?为什么单线程也能实现这么高的性能?
我们常说的Redis 是单线程,主要是指 Redis 在网络 IO和键值对读写是采用一个线程来完成的,这也是 Redis 对外提供键值存储服务的核心流程。综上所述,Redis 之所以选择单线程模式,并能够实现高性能,是因为它充分利用了高效的内存访问、非阻塞 I/O 和异步操作等特性,同时避免了多线程模式下的上下文切换、缓存利用率、竞争和同步开销等问题。而单线程模式下,避免了这种开销,能够更高效地利用 CPU 资源。单线程模式下,Redis 能够充分利用 CPU 缓存,减少内存访问的延迟,从而提高性能。
2023-08-01 19:15:02
264
1
原创 Redis 多机部署的架构下,怎么做到数据的共享?(怎么做到 key 读到准确 的 value),要考虑 value 的存储形式,主机的数据量太大了?需不需要做 Redis 的分机处理
在Redis集群中,可以使用一致性哈希算法来实现key到节点的映射,从而保证key读到准确的value。在使用Redis集群时,需要确保所有节点上的value格式相同,否则可能会导致数据同步失败。在使用Redis分片时,需要考虑如何将数据分散到多个节点上,以及如何保证数据的一致性。在Redis多机部署的架构下,可以通过使用Redis集群来实现数据的共享。Redis集群是一个分布式的解决方案,它可以自动将数据分配到多个节点上,并且可以在节点之间自动进行数据同步。
2023-08-01 09:48:10
505
1
原创 为什么 Redis 的读取性能会比数据库的快
虽然单线程模型在处理大量并发请求时可能存在性能瓶颈,但由于Redis的操作主要是在内存中进行,加之其高效的设计和优化,使得单线程模型在绝大多数情况下能够提供足够的性能。需要注意的是,尽管Redis的读取性能很高,但由于其数据存储在内存中,所以受限于可用内存的大小。高效的网络通信:Redis使用自己设计的协议进行网络通信,通过减少通信的数据量和网络延迟来提高性能。内存存储:Redis是一种基于内存的数据存储系统,数据存储在内存中,而数据库通常将数据存储在磁盘上。
2023-08-01 09:19:52
702
1
原创 Redis 的常见的数据结构有哪些
在 Redis 中,哈希类型是指 v(值)本身又是一个键值对(k-v)结构;是Redis最基础的数据结构类型,是二进制安全的,可以存储图片。应用场景:共享session、分布式锁、计数器、限流;应用场景: 用户标签,生成随机数抽奖、社交需求。简介:已排序的字符串集合,同时元素不能重复;或者序列化的对象,值最大存储为 512M;列表(list)类型是用来存储多个有序。集合(set)类型也是用来保存多个。应用场景: 消息队列,文章列表;字符串元素,但是不允许重复元素;
2023-08-01 09:14:18
544
1
原创 为什么使用redis做缓存
高可用性:Redis提供了主从复制和集群功能,可以实现数据的备份和故障恢复。持久化支持:尽管Redis是一个基于内存的数据库,但它提供了持久化的支持,可以将数据保存到磁盘上,以防止数据丢失。这使得Redis可以在应用程序重启后快速恢复数据,并且可以根据需求进行灵活的配置,以平衡性能和数据安全性。内置数据结构:Redis不仅仅是一个简单的键值存储,它还支持丰富的数据结构,如字符串、哈希表、列表、集合和有序集合等。综上所述,Redis作为缓存具有高性能、灵活的数据结构、持久化支持和高可用性等优势,
2023-08-01 08:50:43
997
1
原创 http 的请求方式有哪些
HTTP 请求方式一共有 9 种,分别为 POST 、GET 、HEAD、PUT 、PATCH 、 OPTIONS 、DELETE 、CONNECT 、 TRACE。其中前三种 POST 、GET 、HEAD 是 HTTP 1.0 定义的,后六种 PUT 、PATCH 、 OPTIONS 、DELETE 、CONNECT 、 TRACE 是 HTTP 1.1 定义的。PUT :从客户端向服务器传送的数据取代指定的内容,即向指定的位置上传最新的内容。GET :表示请求指定的页面信息,并返回实体内容。
2023-07-31 09:58:16
408
1
原创 FreeMarker原理
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,模板中没有业务逻辑,外部Java程序通过数据库操作等生成数据传入模板(template)中,然后输出页面。将页面中所需要的样式放入FreeMarker文件中,然后将页面所需要的数据动态绑定,并放入Map中,通过调用FreeMarker模板文件解析类process()方法完成静态页面的生成。扩展:用法 freemarker怎么生成静态页面(FreeMarker生成静态页原理)1.很好地分离了表现层和业务逻辑。
2023-07-31 09:05:53
134
1
原创 Mybatis的ORM原理
总结起来,MyBatis的ORM映射配置通过XML文件或注解来定义数据库表和Java对象之间的映射关系,以及SQL语句与Java方法之间的映射关系。使用XML配置文件时,你需要创建一个映射文件,定义表和对象之间的对应关系。在MyBatis中,ORM映射的配置主要包括两个部分:数据库表和Java对象之间的映射关系配置,以及SQL语句与Java方法之间的映射关系配置。MyBatis是一个开源的持久层框架,它提供了一种将数据库操作与Java对象之间的映射关系进行配置的方式,实现了对象关系映射(ORM)。
2023-07-28 09:15:10
150
1
原创 Mybatis分页插件PageHelper原理
接口,只要实现了该接口,就可以在Mybatis执行SQL前,作一些自定义的操作。分页插件就是在此基础上开发出来的,对于一个需要分页的SQL,插件会拦截并生成两段SQL。Mybatis给开发者提供了一个。
2023-07-27 10:22:06
42
1
转载 阐述你对Spring的IoC和DI的理解
那么DI是如何实现的呢?Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个),使用完之后还要将对象销毁,对象始终会和其他的接口或类耦合起来。
2023-07-27 09:54:37
66
1
原创 Spring的事务隔离级别
在该隔离级别下,其他事务不能修改当前事务已经读取的数据,避免了不可重复读问题。2. READ_UNCOMMITTED(读取未提交数据):最低的隔离级别,允许一个事务读取另一个事务未提交的数据。3. READ_COMMITTED(读取已提交数据):保证一个事务只能读取到已经提交的数据,避免脏读问题。以上就是Spring框架中的事务隔离级别的简要介绍。根据具体的业务需求和并发访问情况,选择合适的隔离级别可以确保数据的一致性和并发操作的正确性。Spring的事务隔离级别是用于控制事务并发访问数据库时的行为。
2023-07-27 09:36:15
5600
1
原创 Ajax原理
服务器接收到请求后,会处理请求并返回相应的数据,然后 JavaScript 可以根据返回的数据来更新页面的内容。由于 Ajax 是异步的,所以在等待服务器响应的同时,页面上的其他部分仍然可以继续加载和交互,提高了用户体验。它的原理是通过使用 JavaScript 在后台与服务器进行通信,实现页面的局部更新,而不需要刷新整个页面。处理响应:一旦接收到响应,JavaScript 可以根据返回的数据来更新页面的内容,例如插入新的 HTML 元素、修改现有元素的内容或样式等。
2023-07-27 09:11:10
99
1
原创 Mybatis的缓存
而二级缓存默认没有开启,需要手动在 setting 全局参数中配置开启二级缓存,其作用域是 mapper 的同一个 namespace,是多个 SqlSession 共享的,在相同 namespace 下,不同的 SqlSession 两次执行相同的 sql 语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个 SqlSession 结束后该 SqlSession 中的 一级缓存也就不存在了。其中一级缓存是默认开启的,它。
2023-07-26 19:23:18
284
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人