- 博客(61)
- 收藏
- 关注
原创 Cookie、Session、Token
是一种在Web应用服务器端维护用户状态的机制,用于存储用户的一些状态信息,如登录信息、购物车内容等。当用户访问一个网站时,网站会在服务器端创建一个Session,并分配一个唯一的Session ID,将这个Session ID通过Cookie等方式传递给客户端浏览器,下次用户访问该网站时,浏览器将这个Session ID带回服务器端,服务器会根据Session ID来查找相应的Session,以此来识别用户。服务器会验证用户信息,如果验证成功,则会生成一个Token并将其返回给客户端。
2024-05-02 23:13:06
228
原创 ShardingJDBC简单使用
其适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC。支持任意实现JDBC规范的数据库,目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。Sharding-JDBC可支持等号、between、in等多维度分片,也可支持多分片键。SQL解析功能完善,支持聚合、分组、排序、limit、or等查询,并支持Binding Table以及笛卡尔积表查询。
2024-01-03 23:10:18
827
原创 Canal的学习
Canal是一个基于MySQL数据库增量日志解析,提供增量数据订阅和消费,支持将增量数据投递到下游消费者(如Kafka、RocketMQ等)或者存储(如 Elasticsearch、HBase 等)的组件。MySQL master收到 dump 请求,推送binary log给slave(这里指Canal)Canal接收并解析Binlog 日志,得到变更的数据,执行操作。修改MySQL中的一条消息,Canal就会发送信息到RabbitMQ,就能从监听的RabbitMQ队列中得到该条消息。
2023-12-30 23:54:40
1417
原创 Caffeine--缓存组件
推荐使用cache.get(key, k -> value)操作来在缓存中不存在该key对应的缓存元素的时候进行计算生成并直接写入至缓存内,而当该key对应的缓存元素存在的时候将会直接返回存在的缓存值。一次 cache.put(key, value) 操作将会直接写入或者更新缓存里的缓存元素,在缓存中已经存在的该key对应缓存值都会直接被覆盖。在基于权重驱逐的策略下,一个缓存元素的权重计算是在其创建和更新时,此后其权重值都是静态存在的,在两个元素之间进行权重的比较的时候,并不会根据进行相对权重的比较。
2023-12-28 00:06:04
2085
原创 Rabbitmq延迟队列和惰性队列
当一个队列中的消息满足下列情况之一,可以成为(1)消费者使用或声明消费失败,并且消息的参数设置为false(2)消息是一个过期消息,超时无人消费(3)要投递的队列消息堆积满了,最早的消息可能成为死信如果该队列配置了属性,指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机称为死信交换机。如何给队列绑定死信交换机?(1)给队列设置dead-letter-exchange属性,指定一个交换机。
2023-12-25 00:01:47
723
原创 微服务项目遇到的小问题
将登陆客户端的端口15672写在了Springboot的配置文件中,修改配置文件中rabbitmq端口为5672。MySQL 8.0版本导致的问题,需要在后面加。
2023-12-24 00:07:05
499
原创 群组推荐模型---SoAGREE(Social-Enhanced Attentive Group Recommendation)
由于神经网络具有较强的数据拟合能力,因此NCF框架比传统的MF模型具有更强的通用性,后者简单地使用与数据无关的内积函数作为交互函数。此外,这可以增强用户-项目交互数据对组-项目交互功能的训练,反之亦然,有利于二者的相互强化。将社会关注者信息整合到关注用户表示学习中,将用户的关注者信息作为用户的属性,并以关注权值进行聚合。分别是将追随者嵌入和用户偏好嵌入转换为隐含层的注意网络的权值矩阵,b是隐含层的偏差向量。利用注意力机制的基本原理,动态学习用户关注对象的关注权重,用户关注对象对用户表示的贡献不均衡。
2023-12-23 00:34:18
1484
原创 Java时间类
代表日期和时间代表简单日期格式化,可以用来把日期对象、时间毫秒值格式化成想要的形式,例如:xxxx年xx月xx日。代表系统此刻时间对应的日历,通过它可以单独获取、修改时间中的年、月、日、时、分、秒等。
2023-12-21 17:33:03
947
原创 Java异常
所谓就是程序中出现了问题。异常可以作为方法内的一种特殊返回值,以便上层调用者知道底层的执行情况。:程序无法处理的错误,例如虚拟机内存不够(OOM):程序可以处理的错误,可以分为运行时异常和编译时异常及其子类,编译阶段不会出现错误提醒,运行时出现的异常。。:编译阶段就会出现错误提醒。。
2023-12-20 12:06:54
576
原创 正则表达式
String类提供了matches方法,判断字符串是否匹配正则表达式。,由一些特定的字符组成,代表的是一个规则。(2)在一段文本中查找满足要求的内容。(1)用来校验数据格式是否合法。(3)用于搜索替换、分割内容。
2023-12-19 18:46:30
615
原创 微服务组件Gateway的学习
API网关指系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑,可以在这里实现,诸如认证、鉴权、监控、路由转发等。路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。当请求gateway的时候, 使用断言对请求进行匹配, 如果匹配成功就路由转发, 如果匹配失败就返回404。Gateway内置许多的过滤器工厂,通过一些过滤器工厂可以进行一些业务逻辑处理器,比如添加剔除响应头,添加去除参数等。就是内置路由工厂之一。
2023-12-18 20:39:54
956
原创 微服务组件OpenFeign的学习
通过Options可以配置连接超时时间和读取超时时间,Options的第一个参数是连接的超时时间(ms),默认值是2s;:SpringBoot默认的日志级别是Info,Feign的日志级别是Debug不会输入,因此需要在配置文件中针对Feign接口进行日志级别设置。在遇到BUG时,比如接口调用失败、参数没有接收到等问题,或者需要查看调用性能时,可以通过Feign日志进行查看。:记录BASIC级别的基础上,记录请求和相应的header。:性能最佳,用于生产环境,不记录任何日志(默认)
2023-12-18 12:16:48
611
原创 群组推荐模型---AGREE(Attentive Group Recommendation)
群组推荐领域比较经典的论文便是AGREE(Attentive Group Recommendation),此文的主要贡献如下:(1)利用神经注意力网络从数据中动态学习聚合策略的群体推荐系统。进一步整合了用户-项目交互,提高了群组推荐的性能.(2)有效缓解项目推荐的用户冷启动问题。(3)在一个自建数据集和一个公共数据集上进行了大量的实验,以证明方法有效性。偏好获取群组划分偏好融合预测推荐。首先,在推荐算法中一般将偏好定义为用户对两个及以上项目的排序关系。
2023-12-17 00:26:47
1392
2
原创 Java---IO流
表示系统中的文件或者文件夹的路径。可以用来获取文件信息,判断文件类型,创建删除文件等。File类只能对文件本身进行操作。:用来读写文件中的数据(可读写文件或者网络中的数据)依据可分为:InputStream和OutputStream依据可分为:Reader和Writer。
2023-12-16 18:19:20
939
原创 微服务组件Sentinel的学习(3)
默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。@Component@OverrideString msg = "未知异常";msg = "请求被限流了";msg = "请求被热点参数限流";msg = "请求被降级了";msg = "没有权限访问";B站黑马学习视频。
2023-12-16 00:56:23
1194
原创 微服务组件Sentinel的学习(2)
代表的含义是:对sentinel_web_servlet_context这个资源的0号参数(第一个参数) 做统计,每1秒相同参数值的请求数不能超过5。这里的含义是对0号的long类型参数限流,每1秒相同参数的QPS不能超过5,有例外:如果参数值是100,则每1秒允许的QPS为10。:预热模式,对超出阈值的请求同样是拒绝并抛出异常。例如,设置QPS的threshld为15,预热时间为5秒,那么初始闻值就是 5,然后在5秒后逐渐增长到15。:统计当前资源的请求,触发闻值时对当前资源直接限流,也是默认的模式。
2023-12-15 20:40:09
988
原创 微服务组件Sentinel的学习(1)
和资源池隔离的方法不同,Sentinel通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。当调用链路中某个资源出现不稳定,例如,表现为timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。这样做的好处是资源和资源之间做到了最彻底的隔离。它可以是 ava应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。(1)资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
2023-12-15 00:01:55
1162
原创 深入理解Java虚拟机---线程安全与锁优化
如果这个更新动作成功了,那么这个线程就拥有了该对象的锁,并且对象Mark Word的锁标志位将转变为“00”,即表示此对象处于轻量级锁定状态,如果这个更新操作失败了,虚拟机首先会检查对象的Mark Word是否指向当前线程的栈帧,如果只说明当前线程已经拥有了这个对象的锁,那就可以直接进入同步块继续执行,否则说明这个锁对象已经被其他线程抢占了。这意味着相对线程安全来说, 可重入性是更为基础的特性, 它可以保证代码线程安全, 即所有可重入的代码都是线程安全的, 但并非所有的线程安全的代码都是可重入的。
2023-12-14 00:23:03
1596
原创 深入理解Java虚拟机---Java内存模型
Java 内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量(线程共享的变量)存储到内存和从内存中取出变量这样底层细节。每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用的变量的主内存副本。比如,线程A修改一个普通变量的值,然后向主内存进行回写,另外一条线程B在线程A回写完成了之后再对 主内存进行读取操作,新变量值才会对线程B可见。,普通的变量仅会保证在该方法的执行过程 中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序与程序代码中的执行顺序一致。
2023-12-14 00:01:04
1251
原创 深入理解Java虚拟机---类加载机制
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。在Java中,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为Java应用程序提高高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。
2023-12-13 18:51:57
1209
原创 深入理解Java虚拟机---内存分配
DefNew”、“[Tenured”、“[Perm”表示GC发生的区域,这里显示的区域名称与使用的GC收集器是密切相关的,例如上面样例所使用的Serial收集器中的新生代名为“Default New Generation”,所以显示的是“[DefNew”。对象晋升老年代的年龄阈值,可以通过参数-才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。
2023-12-13 00:01:26
1622
原创 微服务组件Nacos的学习(1)
(3)动态 DNS 服务:动态 DNS 服务支持权重路由,更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。(4)服务及其元数据管理:Nacos 能从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期等数据。(2)动态配置服务:动态配置服务可以以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。服务元数据是指包括服务端、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。一个易于构建云原生应用的动态。
2023-12-12 20:54:22
709
原创 深入理解Java虚拟机---垃圾收集算法
安全点机制保证了程序执行时,在不太长的时间内就会遇到可进入GC的安全点,但是程序没有被分配到CPU时间,典型的例子就是线程处于Sleep状态或者Blocked状态,这时候线程无法响应JVM的中断请求,“走”到安全的地方去中断挂起,JVM也显然不太可能等待线程重新被分配CPU时间。这里有两种方案可供选择:抢先式中断和主动式中断,其中抢先式中断不需要线程的执行代码主动去配合,在GC发生时,首先把所有的线程全部中断,如果发现有线程中断的地方不再安全点上,就恢复线程,让它“跑”到安全点上。
2023-12-11 23:55:51
911
原创 深入理解Java虚拟机---对象的创建和内存异常溢出
除如何划分可用空间之外,另外一个需要考虑的问题是对象创建在虚拟机中是非常频繁的行为,即使是仅仅修改一个指针所指向的位置,在并发情况下也并不是线程安全的,可能出现正在给对象A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况。这些信息存放在对象的对象头之中。如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错,虚拟机维护了一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为。
2023-12-11 21:29:07
1291
原创 深入理解Java虚拟机----内存区域的划分
方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。
2023-12-10 23:58:58
1072
原创 异步回调模式
所谓异步回调,本质上就是多线程中线程的通信,如今很多业务系统中,某个业务或者功能调用多个外部接口,通常这种调用就是异步的调用。如何得到这些异步调用的结果自然也就很重要了。FutureTask和Callable都是泛型类,泛型参数表示返回结果的类型。通过FutureTask获取异步线程的执行结果,但是其调用get()方法获取异步结果时,主线程也会被阻塞。属于异步阻塞模式。异步阻塞模式属于主动模式的异步调用,异步回调属于被动模式的异步调用。Java中回调模式的标准实现类为CompletableFuture。
2023-12-09 19:02:07
1322
原创 Redisson出现问题总结
出现此问题的原因为没有redis权限。解决方案在setAddress()后面加上setPassword()方法。Redisson中SortedSet不支持Lambda表达式的构造的Comparator。
2023-12-08 18:27:16
1747
原创 Redisson的基础使用(2)
主要原理是使用一组哈希函数,将元素映射成一组位数组中的索引位置。如果要检查某个元素是否在集合中时,将此元素通过所有的哈希函数,查看哈希值对应的位数组的值是否为1。如果对应的位数组的值都为1,这个元素可能在集合中,否则此元素一定不在集合中。简而言之就是:存在的元素可能存在,不存在的元素一定不存在。Redisson也提供了布隆过滤器的使用。在保证元素唯一性的前提下,通过比较器(Comparator)接口实现了对元素的排序。与java中的原子类相似,可以理解为让long保持原子性。
2023-12-08 18:26:54
503
原创 Redisson的基本使用
Redisson官网描述:Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端(In-Memory Data Grid)。它不仅提供了一系列的 redis 常用数据结构命令服务,还提供了许多分布式服务,例如分布式锁、分布式对象、分布式集合、分布式远程服务、分布式调度任务服务等等。每个Redisson对象实例都会有一个与之对应的Redis数据实例,可以通过调用getName方法来取得Redis数据实例的名称(key)。RList操作列表数据结构,其确保了元素插入时的顺序。
2023-12-08 00:01:58
1196
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人