自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(89)
  • 收藏
  • 关注

原创 Sentinel(四):Sentinel热点规则

范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和。参数索引对应 @SentinelResource 标注的资源方法的参数列表中参数的位置,从0开始。1)value:代表资源名称,必需项,因为需要通过resource name找到对应的规则,若 统计时长内,指定位置的参数的请求的QPS达到配置的 “单机阈值”,则触发限流。当指定位置的参数等于指定的参数值的请求,在统计时间内的qps达到 参数例外项中。参数例外项的限流规则的优先级要高于基本的热点规则,若某个参数配置了“参数例外项”,

2025-06-25 15:15:26 457

原创 Sentinel(三):Sentinel熔断降级

进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误),当请求触发熔断后,在熔断时间段内所有的请求都没拒绝,过了熔断时长,请求可以再。在统计时长内,异常请求数超过配置的“异常数”,后续在熔断时长内的请求会被直接拒绝。当统计时长内,异常请求占比超过阈值后,后续在熔断时长内的请求会被直接拒绝,数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内新的。若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT ,

2025-06-24 17:03:51 573

原创 Sentinel(二):Sentinel流量控制

II)Wam Up:根据codeFactor(冷加载因子,默认3)的值,从“阈值/codeFacotor” 开始,2)给请求资源 “testA” 添加流控规则,testA 关联 testB,并配置testB的QPS为1。给请求testA配置流控,阈值类型选择 “QPS”,单机阈值配置为 1,流控模式选择“直接”,然后在浏览器或PostMan 中快速访问 “/testA”,当达到限流上限后的请求直接返回异常,III)排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效。

2025-06-24 10:59:02 689

原创 Sentinel(一):Sentinel 介绍和安装

目一般直接引入spring-cloud-starter-alibaba-sentinel,该依赖中包含了 Sentinel 核心库,在工作中,如果需要集成 Sentinel ,需要深入 Sentinel 的核心库;Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、对比与其他的产品而言,如:Hystrix,Sentinel 不需要我们自己手动搭建监控平台,而且它有。(FallBack),而不是长时间的等待或者抛出调用方法无法出的异常,这样就保证了。

2025-06-19 16:51:44 848

原创 Nacos基础使用(二):nacos作为配置中心

spring.cloud.nacos.config.file-extension” 来配置。(nacos-config-client)”、 “spring.profiles.active(dev)” 、“file-extension” 可以推导。空间 public;2)在新加的命名空间 “DEV”中新增配置文件 “nacos-config-client-dev.yaml”,并设置分组。nacos配置项 “spring.cloud.nacos.config.prefix” 来配置。

2025-06-18 15:30:56 976

原创 Nacos基础使用(一):nacos介绍和nacos作为服务注册中心

1)在mysql 中创建nacos的数据库,数据库名称推荐是“nacos-config”(我这里是nacos);修改完成后,重启nacos后,就可以发现nacos把用户配置数据存储到了数据库nacos下的。然后进入到Nacos安装目录下的conf目录中,在刚创建的数据库中(如:nacos)运行。就会有一个derby,当有多个Nacos节点的时候,就会出现一致性问题,所以Nacos支持了外部。Nacos 是 服务注册中心与配置中心的组合,nacos即能作为服务注册中心使用,也能作为。

2025-06-17 15:43:52 824

原创 负载均衡器:Ribbon和LoadBalance

更加直观说就是ribbon就是简化上边方法createOrder中的这段代码的小组件,不过他比我们的代码要强大一些,他给他们提供了丰富。策略,@RibbonClient和@RibbonClients 需要标注在 @Configuration 配置类上。有bug,不支持使用;@RibbonClient 可以用来为某个服务指定Ribbon的负载均衡策略(如:shop-stock),跟Ribbon 一样,LoadBalancer也提供了注解 @LoadBalancerClient 和。

2025-06-14 19:23:04 1187

原创 Dubbo学习(一):Dubbo介绍

Provicer 暴露的对外提供服务的接口并不是在 Provicer 项目中定义的,该服务接口。是单独定义在一个项目中,Provicer 中对外的服务需要实现该接口,然后由Consumer。1)定义正常的service服务,该服务正常使用spring提供的@Service 注解,或spring提供的。Registry 是服务注册中心(提供服务注册与发现),放置所有Provider对外提供的信息。consumer 是远程服务的调用者,在 consumer 中通过api中定义的服务接口来执行远程调用。

2025-06-06 16:46:31 647

原创 Shiro(八):JWT介绍

Signature 是将通过将编码后的header、编码后的payload、一个密钥和header中指定的。JWT(JSON Web Token,JSON Web令牌)是一种开放标准(RFC 7519),用于在网络应。Refresh Token 向服务端请求新的JWT,即:短期JWT令牌 + 长期刷新JWT。例如,服务器可以生成具有声明 “以管理员身份登录”(一般在 claims 中声明) 的令牌,并将。JWT令牌未被篡改;在实际工作中,一般给JWT设置较短的过期时间,当客户端jwt令牌过期后,执行。

2025-05-09 16:14:57 537

原创 Docker(三):DockerFile

2)Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,启动容器时指定的运行命令,如:docker run -d 镜像名 运行命令。I)如果用户启动容器时指定了运行命令,ENTRYPOINT不会被运行命令覆盖,而 CMD。src:可以是一个本地文件或压缩文件,也可以是一个url,如果src是一个url,那么ADD 就。1)Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。

2025-05-05 10:54:09 2108 1

原创 Shiro学习(七):总结Shiro 与Redis 整合过程中的2个问题及解决方案

参考开源项目shiro-redis,新定义一个ShiroSession 并继承 SimpleSession,在 ShiroSession。通过Debug 发现,Shiro默认创建的Session是 SimpleSession,且每次访问Session。Session 时,先从ThrealLocal 中读取,若 ThreadLocal 中的Session 不存在或已经过期,则。中定义一个标志位 isChange,只有 lastAccessTime 之外的属性发生改变时,isChange被设置。

2025-04-28 16:55:41 780

原创 Docker(二):docker常用命令

2.2、在指定目录下(如 /root/docker)创建目录 mysql/mysql、mysql/conf、mysql/log,分别用于。存放Docker中mysql7容器的运行数据、配置文件、日志;1)执行命令:docker exec -it mysql5.7 bash 进入容器mysql5.7中。如:以上边容器 mysql5.7 为例来进入容器中的mysql bash,并设置 mysql 权限,使之可以远。docker exec 进入容器并在容器中打开新的终端,可以在容器的终端中执行命令,并将。

2025-04-27 18:47:35 1197 5

原创 Docker安装与介绍(一)

该命令可能会报错误:Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.命令:wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo。

2025-04-19 19:05:48 987

原创 Shiro学习(六):Shiro整合CAS实现单点登录

(2)因为我们导入的包不是 spring-boot-shiro shiro整合springboot 的包,所以需要自己手。CAS Server的5.x版本更改为使用gradle构建,平时更多的是使用Maven,这里采用CAS的4.x。CAS下载完成后使用IDEA打开CAS Server,并修改一些配置信息,将CAS Server进行打包,Pac4jRealm已经实现了具体的认证流程,我们不需要重写认证;CAS Client是一个项目中的具体业务服务,并且在需要认证或授权时,找到CAS Server即。

2025-04-06 18:24:30 1223

原创 Shiro学习(五):Shiro对权限的缓存

shiro 默认提供的jvm缓存是 MemoryConstrainedCacheManager,它是把权限角色信息缓存到。RedisCache需要实现 org.apache.shiro.cache 包下的接口 Cache,Shiro 中虽然默认提供了基于JVM内存的缓存机制,但是默认是没开启,权限角色信息并不会。Shiro 中执行权限角色校验时,默认也是优先从缓存中查询用户权限信息,若缓存中查询不到。由前边的学习中了解,用户的角色权限一般存储在数据库中,每次进行权限校验时都要从。

2025-04-04 11:51:15 723

原创 Shiro学习(四):Shiro对Session的处理和缓存

装配的 SessionManager;的Session,并默认将Session保存到类 HttpServletSession 中的 HttpSession 属性中;由上边可以知道,默认情况下Shiro是将Session 保存到了Web 容器的HttpSession 中,但通过。在Shiro 与Web(如:SSM、springboot)环境中,Shiro 认证成功后默认使用的是Web容器。的逻辑,即:先从HttpRequest 域 中获取Session,若获取不到再从Redis 中查询Session;

2025-04-03 16:01:53 1032

原创 Shiro学习(三):shiro整合springboot

由 配置类 ShiroWebFilterConfiguration 初始化 ShiroFilterFactoryBean 时可以发现,过滤器。,所以需要我们手动装载 SecurityManager 去覆盖Springboot 自动装载的 SecurityManager。另外在 shiro-spring-boot-web-starter 包下的文件 spring.factores 中的配置类。只会注入 Shiro 自身默认提供的Relam,这里需要把自定义的Realm注入到 SecurityManager。

2025-04-02 17:25:00 967

原创 Shiro学习(二):Web中整合Shiro

DelegatingFilterProxy 是 Spring Framework 提供的一个特殊的 Filter 实现类,用于将 Filter 的。目标 Filter Bean 名称,指定要委托的 Spring 容器中的 Filter Bean 的名称,如果不设。DelegatingFilterProxy 默认使用Filter 名称作为目标Bean 的名称,如Shiro与Web 整合时,可以使用Shiro自带的Relam,若自定义Relam,请参考上一篇中的CustRelam,这里不。

2025-03-30 12:28:25 1091

原创 Shiro学习(一):Shiro介绍和基本使用

Shiro 的设计目标是简化企业级应用程序的安全性开发过程,同时保持代码的简洁和易于维护。1)IniRealm:基于 .ini文件的配置,从Shiro.ini读取用户 认证/授权 和 角色数据。Realm,安全数据源, 是连接Shiro 与 安全数据的桥梁(如:JDBC数据库数据、LADP、SimpleAccountRealm是Shiro 提供的一个最基本的 Realm 内存实现,适用于快速原型开发。SecurityManager 是Shrio 的核心,管理所有的安全操作,协调所有安全组件,

2025-03-25 16:39:55 956

原创 任务调度之Quartz(二):Quartz体系结构

2)triggerFired():Trigger 被触发,Job 上的 execute() 方法将要被执行时,Scheduler。5)triggerComplete():Trigger 被触发并且完成了 Job 的执行时,Scheduler 调用这个。如:在分钟字段中使用 0/15,则表示为 0,15,30 和 45 秒,而 5/15 在分钟字段。1W,如果 1 号是星期六,结果匹配的是 3 号星期一,而非上个月最后的那。如 :6#3 表示当月的第三个星期五(6 表示星期五,#3 表示当前的第三个),而。

2025-01-07 23:15:14 789

原创 BitMap(位图)学习

因为 1byte = 8bit,而bitmap是用下标 index 的bit值表示 value=index 的值是否存在(0-值不。若bit[idx]=0,则说明值为idx的值不在数组中,在bitmap中 bit[1]、bit[4]、bit[5]、存在,1-值存在),所以对于字节数组 byte[] b,b[0] 记录的是 [0,7] 的数据,b[1] 记录的是。bitmap(位图):使用一个bit位来表示指定数据值是否存在;由于bit的值只能是0或1,所以 0表示value的值不存在,1表示存在;

2025-01-05 18:50:02 692

原创 java实现一个kmp算法

Kmp 算法是由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,改进字符串匹配的算法;Kmp 算法的核心是利用匹配失败的信息,尽量减少模式串与主串的匹配次数,以达到。Kmp 算法的时间复杂度是O(m+n),m=模式串的长度,n=主字符串的长度。1、什么是KMP算法。

2025-01-01 19:26:11 277

原创 基于DFA算法实现敏感词过滤

即将敏感词存储在Map 中,每个敏感词的第一个字是外层Map的key,而Map 的value也是Map。1)如果匹配key的isEnd是1,说明和敏感词对应上了,下次就跳到敏感词的后面继续。类型的,我们称之为内层Map,其存储敏感词的下一个字和标识符(用于标识到前一个字时敏。匹配外层key,敏感词树中,一个外层循环key表示一个敏感词。态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是。拿到后,先基于最外层的key进行匹配,如果匹配上了,继续向内部的key匹配,

2024-12-02 17:42:21 500

原创 任务调度之Quartz(一):Quartz基本使用

与Scheduler有关的事件包括:增加一个job/trigger,删除一个job/trigger,scheduler。在Quartz 中Job并不能直接执行,需要把Job包装成JobDetail 后,才能被执行;Quatz 是一个特性丰富的,开源的任务调度库,它几乎可以嵌入所有的 Java 程序,从。的任务,这些任务可以用来执行任何程序可以做的事情。Quartz 可以用来创建成百上千的简单的或者复杂。是 Quartz 的默认配置文件,若在自己的项目中创建了同名的配置文件,即在自己的项目。

2024-12-01 19:11:18 2314

原创 Java实现一个雪花算法

- 第二位:占41个bit位,存储毫秒级别的时间戳。雪花算法有一个特点,首先他是64bit位的正整数,整体结构是有序的,这样数据存储在。-- 第五位:占12个bit位,存储一个序列,自增的值。雪花算法是分布式微服务下生成全局唯一的ID,并且可以做到去中心化的常用算法。-- 第一位:占1个bit位,就是0,代表是一个正整数。-- 第三位:占5个bit位,存储机器id。-- 第四位:占5个bit位,存储服务id。整体结构雪花算法是固定,但是也可以做一些细粒度的调整。雪花算法工具类,用于生成全局唯一的id。

2024-11-26 17:22:38 526

原创 设计模式之责任链模式(Chain Of Responsibility)

4)职责链模式常被用在框架开发中,用来实现框架的过滤器、拦截器功能,让框架的使用者在不修改源码的情况下,添加新的过滤拦截功能。3)客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不。1)抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和。处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。并且每个类只需要处理自己该处理的工作,不能处理的传递给下一个对象。5)责任分担,每个类只需要处理自己该处理的工作,不能处理的传递给下一个对象完成,

2024-11-10 22:06:14 2404 2

原创 设计模式之策略模式(Strategy)

2)具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法。如果要使得程序符合开闭原。则,则需要调整ReceiptHandleStrategyFactory中处理策略的获取方式,通过反射的方式,获。3)环境或上下文(Context)类:是使用算法的角色, 持有一个策略类的引用,最终。经过上面的改造,我们已经消除了if-else的结构,每当新来了一种回执,只需要添加新的回执。策略模式最大的作用在于分离使用算法的逻辑和算法自身实现的逻辑,这样就意味着当。

2024-11-10 22:06:01 1025

原创 设计模式之模版方法模式(Template)

抽象父类:负责给出一个算法的轮廓和骨架。2)如果用户登录成功,则根据用户的借款的类型不同,使用不同的利息计算方式进。抽象父类:定义一个算法所包含的所有步骤,并提供一些通用的方法逻辑。2)模板方法可以实现一种反向的控制结构,通过子类覆盖父类的钩子方法,来决定某一个。3)在模板方法模式中可以通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法。1)在父类中形式化的定义一个算法,而由它的子类来实现细节处理,在子类实现详细的。2)父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向。

2024-11-06 22:24:20 1125

原创 线程池原理(四):工作线程的运行和线程池的关闭

通过Worker 的构造方法可以发现,是通过 ThreadFactory.newThread() 方法来创建线程的,创建线程的,所以上边 t.start() 启动线程后真正执行的就是Worker 中重写Runnable的run()通过对前边的addWorker 的解析可以发现,在addWorker方法的最后,Worker添加成功。带着这个疑问我们打开Worker 类的构造方法,看下Worker 中线程的创建过程,该方法功能是关闭线程池之前启动执行之前提交的任务,但不会再接收新的任务;

2024-11-03 21:18:28 911

原创 线程池原理(三):ThreadPoolExecutor核心方法之execute()方法

即执行),否则maximumPoolSize。最大线程数maximumPoolSize,则创建新的线程来处理任务,执行这一步骤需要获取。线程(在这种情况下,我们总是启动一个),或当队列是满的(在这种情况下,我们必。2)如果当前运行的线程数等于或大于核心线程数corePoolSize,则将当前提交的任务放入。1)如果当前运行的线程少于核心线程数corePoolSize,则创建新的线程来执行当前提交。execute() 方法是线程池 ThreadPoolExecutor 中最核心的方法,由前边的。

2024-10-29 22:14:08 1240

原创 线程池原理(二):ThreadPoolExecutor设计原理

RejectedExecutionHandler 表示线程池中的拒绝策略,当线程池和工作队列满了后,通过。在 ThreadPoolExecutor 够造方法中,最重要的是核心线程数的确定,通常核心线程数需要。量),则创建一个新的工作线程来执行任务;来创建线程池,因为 Executors 创的线程池,线程池的很多核心参数都是默认的,不利于后期。3)线程池判断线程池中的线程是否都处于工作状态,若没有,则创建一个新的工作线程。1)线程池判断核心线程是否都在执行任务,若不是(即核心线程数没达到配置的数。

2024-10-27 20:58:15 976

原创 线程池原理(一):线程池体系结构

了解下 Executor、ExecutorService、AbstractExecutorService 的实现,下面就分别看下。ExecutorService 接口继承了 Executor,ExecutorService主要定义了线程池的一些基本操作;在平时开发中 ExecutorService 也指代一个线程池,ExecutorService的每个实现子类都表示。AbstractExecutorService 是接口 ExecutorService 的抽象实现类,主要实现了。二、Executor。

2024-10-20 17:12:04 370

原创 设计模式之观察者模式(Observer)

一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个。者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送。对象的引用,它存储具体观察者的有关状态,这些状态需要与具体目标保。4)ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到。3)Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到。都不是主链路的功能,需要单独抽取出来,这样才能保证在后面的开发过程中保证代码。当用户单击鼠标时,订阅鼠标单击事件的函数将被调用,。

2024-10-19 11:19:25 1648

原创 设计模式之设计模式分类

创建型模式提供创建对象的机制,主要解决对象的创建问题,封装复杂的创建过程,解耦。行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者。采用组合或聚合在对象间分配行为。“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。对象的创建代码和使用代码,能够提升已有代码的灵活性和复用性。2)工厂模式(工厂方法模式和抽象工厂模式)4)原型模式(不常用)5)门面(外观)模式。

2024-10-19 09:51:06 449

原创 设计模式之享元模式(Flyweight)

可以看到 `Integer` 默认先创建并缓存 `-128 ~ 127` 之间数的 `Integer`可以看到 `Integer` 默认先创建并缓存 `-128 ~ 127` 之间数的 `Integer` 对象,当调用。对象,当调用 `valueOf` 时如果参数在 `-128 ~ 127` 之间则计算下标并从缓存中返回,一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则。2)在 Java 中,享元模式一个常用的场景就是,使用数据类的包装类对象的 valueOf() 方法。

2024-10-16 22:07:21 1197

原创 设计模式之组合模式(Composite)

子节点,实现了在抽象根节点中定义的行为。在抽象根节点中定义了访问。2)树枝节点(Composite):定义树枝节点的行为,存储子节点,组合树枝节点和。在组合模式中叶子节点没有子节点,它实现了在抽象根节点中定义的行为。及管理它的子构件的方法,如增加子节点、删除子节点、获取子节点等。透明组合模式中,抽象根节点角色中声明了所有用于管理成员对象的方法,比如在示。透明组合模式的缺点是不够安全,因为叶子对象和容器对象在本质上是有区别的,叶。在安全组合模式中,在抽象构件角色中没有声明任何用于管理成员对象的方法,而是。

2024-10-13 11:07:15 1129

原创 设计模式之外观模式(Facade)

比如,线程池 ThreadPool 就是一个门面模式,它为系统提供了统一的线程对象的创建、在正常情况下,它将所。比如,在秒杀、库存、钱包等场景中,我们需要共享有状态的数据时(如商品库存、如上图所示,外观类Facade充当了系统中的"服务员",它为多个业务类的调用提供了一个。当我们的电商系统中需要一些新功能时,比如,人脸识别,我们可以不需要自行研发,账户里的钱),在不改变原有系统的前提下,通过一个中间的共享层(如将秒杀活动的。比如,当我们开发了一整套的电商系统后(包括订单、商品、支付、会员等系统),

2024-10-07 20:43:12 1259

原创 设计模式之适配器模式(Adapter)

适配器模式(adapter pattern )的原始定义是:将类的接口转换为客户期望的另一个接口,2)适配者(Adaptee)类:适配者即被适配的角色,它是被访问和适配的现存组件库。是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,装饰者模式在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的。类适配器类一般是继承 “适配者类(适配者的具体实现)” 并实现目标接口,而对象适配器。

2024-10-07 11:39:05 1981

原创 设计模式之装饰器模式(Decorator)

4)具体装饰(ConcreteDecorator)角色 : 它是抽象装饰类的子类,负责向构件添加。1)抽象构件(Component)角色 :它是具体构件和抽象装饰类的共同父类,声明了。3)抽象装饰(Decorator)角色 :它也是抽象构件类的子类,用于给具体构件增加。装饰模式(decorator pattern) 的原始定义是:动态的给一个对象添加一些额外的职责。的构建对象,实现了在抽象构建中声明的方法,装饰类可以给它增加额外的职责。定义的方法,并可以增加新的方法用于扩充对象的行为。

2024-10-06 22:11:41 2024

原创 设计模式之桥接模式(Bridge)

2)扩展抽象化(RefinedAbstraction)角色 :是抽象化角色的子类,实现父类中的业。3)实现化(Implementor)角色 :定义实现化角色的接口,包含角色必须的行为和属。1)型号是其固有的维度,所以抽象出一个毛笔类,而将各种型号的毛笔作为其子类,2)颜色是毛笔的另一个维度,它与毛笔之间存在一种设置的关系,因此可以提供一个。渠道作为抽象化角色,支付方式作为实现化角色,支付渠道*支付模式 = 相对应的支付组合;桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联来取代传统的多层继承,

2024-10-05 11:36:21 2886 3

Redis常用配置项信息

很详细的Redis配置文件

2025-04-25

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除