
知识点补充
文章平均质量分 71
康小庄
代码不停,思考不止
展开
-
对前端限流操作(Redis版本)4种算法
滑动时间窗口算法的核心思想是通过维护一个时间窗口内的请求计数器,并根据时间窗口的滑动来判断是否接受新的请求。具体来说,当一个新的请求到达时,算法会根据当前时间点判断该请求属于哪个时间窗口,并更新对应窗口的计数器。然而,漏桶算法也存在一些缺点,例如请求延迟,可能导致某些请求的响应时间变长;滑动时间窗口算法是一种限流算法,其原理是记录一段时间内的请求数量,并根据时间窗口的滑动来判断是否接受新的请求。在网络中,漏桶算法可以控制端口的流量输出速率,平滑网络上的突发流量,实现流量整形,从而为网络提供一个稳定的流量。原创 2024-02-18 15:09:20 · 1598 阅读 · 0 评论 -
切面实现自动填充必备字段
采用Aop切面编程实现数据库操作自动填充必备字段。注解传入类型,来判断填充几个字段。原创 2024-01-30 10:05:05 · 228 阅读 · 0 评论 -
PO VO DTO POJO的概念
PO (Persistent Object):持久化对象,通常是表示一个实体对象,与底层数据库表的结构一一对应。PO包含了与数据库存储相关的属性和方法,一般用于ORM(对象关系映射)过程中,用于映射数据库表的行。PO通常与数据库交互,并包含了持久化操作(例如增删改查)的方法。PO的设计目标是将数据库表结构映射到对象模型中,便于进行数据库操作和持久化,通常也称作DO(Data Object)原创 2024-01-30 09:59:43 · 620 阅读 · 0 评论 -
SpringBoot完整项目部署流程(软件安装-前后端部署)
使用XTFP工具将jdk的二进制发布包上传到Linux解压安装包解压完毕配置环境变量,使用vim命令修改文件,在文件末尾加入如下配置重新加载profile文件,使更改的配置立即生效,命令为检查安装是否成功,命令为。原创 2023-09-02 21:57:57 · 2245 阅读 · 0 评论 -
Redis高级——批处理优化
第二种方案:串行slot,简单来说,就是执行前,客户端先计算一下对应的key的slot,一样slot的key就放到一个组里边,不同的,就放到不同的组里边,然后对每个组执行pipeline的批处理,他就能串行执行各个组的命令,这种做法比第一种方法耗时要少,但是缺点呢,相对来说复杂一点,所以这种方案还需要优化一下。第三种方案:并行slot,相较于第二种方案,在分组完成后串行执行,第三种方案,就变成了并行执行各个命令,所以他的耗时就非常短,但是实现呢,也更加复杂。这个时候,我们可以找到4种解决方案。原创 2023-05-02 16:33:54 · 1851 阅读 · 1 评论 -
Redis高级——键值对设计
Key的最佳实践固定格式:[业务名]:[数据名]:[id]足够简短:不超过44字节不包含特殊字符Value的最佳实践:合理的拆分数据,拒绝BigKey选择合适数据结构Hash结构的entry数量不要超过1000设置合理的超时时间。原创 2023-05-01 17:12:20 · 1696 阅读 · 0 评论 -
Redis基础——Java客户端Jedis
RedisTemplate可以接收任意Object作为值写入Redis:只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的:可读性差内存占用较大// 创建RedisTemplate对象 RedisTemplate < String , Object > template = new RedisTemplate < >();// 设置连接工厂 template . setConnectionFactory(connectionFactory);原创 2023-04-30 16:41:03 · 1126 阅读 · 0 评论 -
Redis基础——Redis常用命令
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。例如,需要存储用户、商品信息到redis,有一个用户id是1,有一个商品id恰好也是1,此时如果使用id作为key,那就会冲突了,该怎么办?从而避免了key的冲突问题。HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行。原创 2023-04-29 13:31:23 · 1207 阅读 · 0 评论 -
Zookeeper源码分析——客户端初始化源码解析
ctrl + alt +B 查找 doTransport实现类, ClientCnxnSocketNIO.java。ctrl + alt +B 查找 connect实现类, ClientCnxnSocketNIO.java。在ZkCli.sh启动 Zookeeper时,会调用 ZooKeeperMain.java。创建ZooKeeperAdmin对象。原创 2023-04-21 09:18:15 · 368 阅读 · 0 评论 -
Zookeeper源码分析——ZK服务端加载数据源码解析
(3)Zookeeper 集群中每个zk 节点中,数据在内存和磁盘中都有一份完整的数据。(1)zk 中的数据模型,是一棵树,DataTree,每个节点,叫做DataNode。回到FileTxnSnapLog.java类中的 restore方法。(2)zk 集群中的DataTree 时刻保持状态同步。加载磁盘数据到内存,恢复 DataTree的具体方法。⚫ 磁盘数据:快照文件 + 编辑日志。⚫ 内存数据:DataTree。点击具体的restore方法。查看具体实现反序列化的方法。查看数据恢复的具体方法。原创 2023-04-20 14:52:11 · 670 阅读 · 0 评论 -
Zookeeper源码分析——服务端Leader和Follow启动
Ctrl + n 全局查找Follower,然后ctrl + f 查找followLeader。点击PrepRequestProcessor,并查找它的run方法。原创 2023-04-19 09:26:51 · 213 阅读 · 0 评论 -
Zookeeper源码分析——Follower和Leader状态同步源码
所以 fh.start()执行的是 LearnerHandler中的 run()方法。所以 fh.start()执行的是 LearnerHandler中的 run()方法。当选举结束后,每个节点都需要根据自己的角色更新自己的状态。选举出的Leader更新自己状态为 Leader,其他节点更新自己状态为 Follower。当leader得知 follower的状态了,就确定需要做何种方式的数据同步 DIFF、 TRUNC、SNAP。Leader更新状态入口: leader.lead()原创 2023-04-18 08:29:07 · 812 阅读 · 0 评论 -
Zookeeper源码分析——ZK选举源码解析
当Zookeeper 启动后,首先都是Looking 状态,通过选举,让其中一台服务器成为Leader,就相当于执行QuorumPeer.java 类中的run()方法。点击 lookForLeader()的实现类 FastLeaderElection.java。点击QuorumCnxManager.Listener,找到对应的 run方法。点击 SendWorker,并查找 该类下的 run方法。点击 RecvWorker,并查找 该类下的 run方法。如果数据是发送给自己的,添加到自己的接收队列。原创 2023-04-17 12:35:21 · 420 阅读 · 0 评论 -
Zookeeper源码分析——ZK服务端初始化源码解析
zookeeper-jute代码是关于 Zookeeper序列化相关源码。可以启动定时任务,对过期的快照,执行删除。zkServer.sh start底层的实际执行内容。通信协议默认 NIO(可以支持 Netty。定义一个静态内部类实现定时删除快照的任务。Zookeeper 服务的启动命令是。跟进定时任务的start方法。查看具体清理过期数据的方法。通信初始化具体实现代码。原创 2023-04-16 16:17:38 · 727 阅读 · 0 评论 -
Zookeeper源码分析——算法基础
Zab 借鉴了Paxos 算法,是特别为Zookeeper 设计的支持崩溃恢复的原子广播协议。基于该协议,Zookeeper 设计为只有一台客户端(Leader)负责处理外部的写事务请求,然后Leader 客户端将数据同步到其他Follower 节点。即Zookeeper 只有一个Leader 可以发起提案。原创 2023-04-15 15:54:54 · 455 阅读 · 0 评论 -
Maven配置私服
团队开发现状分析(1)张三负责ssm_crm的开发,自己写了一个ssm_pojo模块,要想使用直接将ssm_pojo安装到本地仓库即可(2)李四负责ssm_order的开发,需要用到张三所写的ssm_pojo模块,这个时候如何将张三写的ssm_pojo模块交给李四呢?(3)如果直接拷贝,那么团队之间的jar包管理会非常混乱而且容器出错,这个时候我们就想能不能将写好的项目上传到中央仓库,谁想用就直接联网下载即可。原创 2023-04-10 08:41:29 · 713 阅读 · 3 评论 -
Zookeeper安装(Win和Linux)
1.1 下载安装下载好的文件进行解压缩得到apache-zookeeper-3.8.0-bin目录,创建zkdata及log目录,后续作为数据存放目录。原创 2023-04-09 15:17:31 · 458 阅读 · 0 评论 -
采用多种方式实现项目的查询多级缓存(六)
其实就是多了缓存时间参数,过期后nginx缓存会自动删除,下次访问即可更新缓存。现在,整个多级缓存中只差最后一环,也就是nginx的本地缓存了。的功能,可以在nginx的多个worker之间共享数据,实现缓存功能。因为库存更新频率较高,如果缓存时间过长,可能与数据库差异较大。这里给商品基本信息设置超时时间为30分钟,库存为1分钟。OpenResty为Nginx提供了。原创 2023-04-09 15:09:01 · 462 阅读 · 0 评论 -
采用多种方式实现项目的查询多级缓存(五)
在实际开发中,我们可以利用大数据统计用户访问的热点数据,在项目启动时将这些热点数据提前查询并保存到Redis中。:服务刚刚启动时,Redis中并没有缓存,如果所有商品数据都在第一次查询时添加缓存,可能会给数据库带来较大压力。现在,Redis缓存已经准备就绪,我们可以再OpenResty中实现查询Redis的逻辑了。我们数据量较少,并且没有数据统计相关功能,目前可以在启动时将所有数据都放入缓存中。接下来,我们就可以去修改item.lua文件,实现对Redis的查询了。3)配置Redis地址。原创 2023-04-08 11:41:57 · 350 阅读 · 0 评论 -
采用多种方式实现项目的查询多级缓存(四)
因为item-service中的接口都是/item开头,所以我们监听/item路径,代理到windows上的tomcat服务。你看,因为轮询的原因,第一次查询8081形成的JVM缓存并未生效,直到下一次再次访问到8081时才可以生效,缓存命中率太低了。nginx根据请求路径做hash运算,把得到的数值对tomcat服务的数量取余,余数是几,就访问第几个服务,实现负载均衡。只要id不变,每次hash运算结果也不会变,那就可以保证同一个商品,一直访问同一个tomcat服务,确保JVM缓存生效。原创 2023-04-07 23:03:50 · 336 阅读 · 0 评论 -
采用多种方式实现项目的查询多级缓存(三)
官方网站: https://openresty.org/cn/首先你的Linux虚拟机必须联网。原创 2023-04-06 20:58:16 · 275 阅读 · 0 评论 -
采用多种方式实现项目的查询多级缓存(二)
是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。:在默认情况下,当一个缓存元素过期的时候,Caffeine不会自动立即将其清理和驱逐。Caffeine既然是缓存的一种,肯定需要有缓存的清除策略,不然的话内存总会有耗尽的时候。首先,我们需要定义两个Caffeine的缓存对象,分别保存商品、库存的缓存数据。原创 2023-04-05 21:04:03 · 341 阅读 · 0 评论 -
采用多种方式实现项目的查询多级缓存(一)
在多级缓存架构中,Nginx内部需要编写本地缓存查询、Redis查询、Tomcat查询的业务逻辑,因此这样的nginx服务不再是一个。传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库。一个是在nginx中编写业务,实现nginx本地缓存、Redis、Tomcat的查询。其中Nginx编程则会用到OpenResty框架结合Lua这样的语言。•请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈。•Redis缓存失效时,会对数据库产生冲击。原创 2023-04-05 19:23:43 · 338 阅读 · 0 评论 -
Redis搭建分片集群
分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下:这里我们会在同一台虚拟机中开启6个redis实例,模拟分片集群,信息如下:删除之前的7001、7002、7003这几个目录,重新创建出7001、7002、7003、8001、8002、8003目录:在/tmp下准备一个新的redis.conf文件,内容如下:将这个文件拷贝到每个目录下:修改每个目录下的redis.conf,将其中的6379修改为与所在目录一致:启动原创 2023-04-05 12:49:29 · 395 阅读 · 0 评论 -
Redis搭建哨兵集群
这里我们搭建一个三节点形成的Sentinel集群,来监管之前的Redis主从集群。原创 2023-04-04 09:47:06 · 480 阅读 · 0 评论 -
Redis安装主从集群
然后将课前资料提供的Redis安装包上传到虚拟机的任意目录:例如,我放到了/tmp目录:解压后:如果没有出错,应该就安装成功了。将中的改为修改(260行)文件将里面的改成yes,让服务在后台启动远程连接测试成功。原创 2023-04-03 23:10:53 · 184 阅读 · 0 评论 -
Linux防火墙相关操作
防火墙操作原创 2022-12-31 20:30:27 · 85 阅读 · 0 评论 -
Java课程案例学习(3)
2.1 学生管理系统实现步骤案例需求针对目前我们的所学内容,完成一个综合案例:学生管理系统!该系统主要功能如下:添加学生:通过键盘录入学生信息,添加到集合中删除学生:通过键盘录入要删除学生的学号,将该学生对象从集合中删除修改学生:通过键盘录入要修改学生的学号,将该学生对象其他信息进行修改查看学生:将集合中的学生对象信息进行展示退出系统:结束程序实现步骤定义学生类Student成员变量:学号:sid姓名:name年龄:age生日:birthday构造方法:无参构造带四个参数的构造成员方法:每个成员变量对应给出原创 2022-12-06 13:58:20 · 173 阅读 · 0 评论 -
Java-多线程实验
.模拟一个简单的银行系统,使用两个不同的线程向同一个账户存钱。账户的初始余额是1000元,两个线程每次存储100元,分别各存储1000元,不允许出现错误数据。原创 2022-12-01 22:48:54 · 190 阅读 · 0 评论 -
Java-I/O流实验
1.编写文本文件复制程序,即把源文件复制到目标文件,运行时用参数方式输入源文件名和目标文件名,设入口主类为FileCopy,则运行方式为:java FileCopy 源文件名 目标文件名原创 2022-11-30 18:12:02 · 144 阅读 · 1 评论 -
Java-泛型实验
定义一个学生类Student,具有年龄age和姓名name两个属性,并通过实现Comparable接口提供比较规则(返回两个学生的年龄差), 定义测试类Test,在测试类中定义测试方法Comparable getMax(Comparable c1, Comparable c2)完成测试原创 2022-11-29 17:43:32 · 557 阅读 · 0 评论 -
Java实验-学生管理系统
针对目前我们的所学内容,完成一个综合案例:学生管理系统!修改学生:通过键盘录入要修改学生的学号,将该学生对象其他信息进行修改。删除学生:通过键盘录入要删除学生的学号,将该学生对象从集合中删除。添加学生:通过键盘录入学生信息,添加到集合中。查看学生:将集合中的学生对象信息进行展示。原创 2022-11-24 13:45:18 · 140 阅读 · 0 评论 -
Java集合使用实验
(2)使用put()方法将学号(“1”“2”“3”“4”“5”)和姓名(“张三”“李四”“王五”“小明”“小李”)存储到Map中,存的时候可以打乱顺序观察排序后的效果。首先打印集合的大小,然后删除集合中的第3个元素,并显示删除元素的内容,然后再打印目前集合中第3个元素的内容,并再次打印集合的大小。按顺序往集合中添加5个字符串对象:“张三”、“李四”、“王五”、“马六”、“赵七”;(2)分别使用addFirst()和addLast()方法向集合中添加元素;(1)创建TreeMap集合。原创 2022-11-17 22:00:30 · 440 阅读 · 0 评论 -
C语言期末复习题(下)
0 };i < n;i < 10;} } printf("比avg%d大的数有%d个" , avgx , key);return 0;}原创 2022-11-12 22:47:34 · 810 阅读 · 0 评论 -
C语言期末复习题(上)
输入用户的月用水量x(吨),计算并输出该用户应支付的水费y(元)(保留2位小数)。计算表达式的值,指定的算术运算符为加(+)、减(-)、乘(*)、除(/)。例如:2+22+222+2222+22222(n=5),n由键盘输入。居民应交水费y(元)与月用水量x(吨)的函数关系式如下(设x≥0)。操作数1 运算符op 操作数2。原创 2022-11-12 22:46:40 · 1162 阅读 · 0 评论 -
Java-日期类,正则实验
System . out . println("输入一个数,转为二进制字符串!");} /**** @Description: 数字转为二进制// 创建栈来存储余数 Deque < Integer > stack = new ArrayDeque < >();do {// 获取余数 mod = n % 2;// 获取商 n = n / 2;} }原创 2022-11-10 17:16:17 · 323 阅读 · 1 评论 -
Java-String常用类实验
编写程序,要求输入一个价格(必须是数值,值必须大于0),输入字符不合理重新输入,直到录入一个合理的价格为止,输出该价格。提示:使用异常处理使代码更稳健原创 2022-11-03 22:28:00 · 208 阅读 · 0 评论 -
Java异常处理实验
在主方法中得到命令行输入的三个整数,调用此方法,并捕获异常。2.模拟向货船上装载集装箱,每个集装箱有一定重量,货船总重大于每个集装箱,装载若干集装箱后,如果货船超重,那么货船认为这是一个异常,将拒绝装载集装箱,但无论是否发生异常,货船都需要正点启航。5.把第4题整除程序改为双精度型实数的除法运算程序,并更改有关提示信息,运行该程序若干次,每次输入不同的数据,观察分析程序的运行结果。1.从键盘输入一个整形数n,如果输入正确的话,输出10-n后的值,如果输入错误的话输出“not int”最后输出end。原创 2022-10-31 16:10:35 · 717 阅读 · 0 评论 -
Java面向抽象,接口编程实验
3.设计 3 个类 , 分别是学生类 Student, 本科生类 Undergaduate, 研究生类 Postgraduate, 其中 Student 类是一个抽象类 , 它包含一些基本的学生信息如姓名、所学课程、课程成绩等 , 而 Undergraduate 类和 Postgraduate 都是 Student 类的子类 , 它们之间的主要差别是计算课程成绩等级的方法有所不同 , 研究生的标准要比本科生的标准高一些 , 如下表所示。60-70 一般 70-80 一般。本科生标准 研究生标准。原创 2022-10-30 22:51:02 · 510 阅读 · 0 评论 -
Java面向对象实验
(1)Shape 接口中有一个抽象方法 area (),方法接收有一个 double 类型的参数,返回一个 double 类型的结果。(3) HourlyEmployee Employe的子类,按小时拿工资的员工,每月工作超出160h的部分按照1.5倍工资发放。(2)Square 和 Circle 中实现了 Shape 接口的 area()抽象方法,分别求正方形和圆形的面积并返回。1.某公司的员工分为5类,每类员工都有相应的封装类,这5个类的信息如下。① 属性:员工的姓名、员工的生日月份。原创 2022-10-24 18:19:31 · 843 阅读 · 0 评论