知识点补充
文章平均质量分 71
康小庄
代码不停,思考不止
展开
-
对前端限流操作(Redis版本)4种算法
滑动时间窗口算法的核心思想是通过维护一个时间窗口内的请求计数器,并根据时间窗口的滑动来判断是否接受新的请求。具体来说,当一个新的请求到达时,算法会根据当前时间点判断该请求属于哪个时间窗口,并更新对应窗口的计数器。然而,漏桶算法也存在一些缺点,例如请求延迟,可能导致某些请求的响应时间变长;滑动时间窗口算法是一种限流算法,其原理是记录一段时间内的请求数量,并根据时间窗口的滑动来判断是否接受新的请求。在网络中,漏桶算法可以控制端口的流量输出速率,平滑网络上的突发流量,实现流量整形,从而为网络提供一个稳定的流量。原创 2024-02-18 15:09:20 · 1447 阅读 · 0 评论 -
切面实现自动填充必备字段
采用Aop切面编程实现数据库操作自动填充必备字段。注解传入类型,来判断填充几个字段。原创 2024-01-30 10:05:05 · 152 阅读 · 0 评论 -
PO VO DTO POJO的概念
PO (Persistent Object):持久化对象,通常是表示一个实体对象,与底层数据库表的结构一一对应。PO包含了与数据库存储相关的属性和方法,一般用于ORM(对象关系映射)过程中,用于映射数据库表的行。PO通常与数据库交互,并包含了持久化操作(例如增删改查)的方法。PO的设计目标是将数据库表结构映射到对象模型中,便于进行数据库操作和持久化,通常也称作DO(Data Object)原创 2024-01-30 09:59:43 · 506 阅读 · 0 评论 -
SpringBoot完整项目部署流程(软件安装-前后端部署)
使用XTFP工具将jdk的二进制发布包上传到Linux解压安装包解压完毕配置环境变量,使用vim命令修改文件,在文件末尾加入如下配置重新加载profile文件,使更改的配置立即生效,命令为检查安装是否成功,命令为。原创 2023-09-02 21:57:57 · 1375 阅读 · 0 评论 -
Redis高级——批处理优化
第二种方案:串行slot,简单来说,就是执行前,客户端先计算一下对应的key的slot,一样slot的key就放到一个组里边,不同的,就放到不同的组里边,然后对每个组执行pipeline的批处理,他就能串行执行各个组的命令,这种做法比第一种方法耗时要少,但是缺点呢,相对来说复杂一点,所以这种方案还需要优化一下。第三种方案:并行slot,相较于第二种方案,在分组完成后串行执行,第三种方案,就变成了并行执行各个命令,所以他的耗时就非常短,但是实现呢,也更加复杂。这个时候,我们可以找到4种解决方案。原创 2023-05-02 16:33:54 · 1712 阅读 · 1 评论 -
Redis高级——键值对设计
Key的最佳实践固定格式:[业务名]:[数据名]:[id]足够简短:不超过44字节不包含特殊字符Value的最佳实践:合理的拆分数据,拒绝BigKey选择合适数据结构Hash结构的entry数量不要超过1000设置合理的超时时间。原创 2023-05-01 17:12:20 · 1239 阅读 · 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 · 1040 阅读 · 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 · 1100 阅读 · 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 · 263 阅读 · 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 · 575 阅读 · 0 评论 -
Zookeeper源码分析——服务端Leader和Follow启动
Ctrl + n 全局查找Follower,然后ctrl + f 查找followLeader。点击PrepRequestProcessor,并查找它的run方法。原创 2023-04-19 09:26:51 · 160 阅读 · 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 · 621 阅读 · 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 · 350 阅读 · 0 评论 -
Zookeeper源码分析——ZK服务端初始化源码解析
zookeeper-jute代码是关于 Zookeeper序列化相关源码。可以启动定时任务,对过期的快照,执行删除。zkServer.sh start底层的实际执行内容。通信协议默认 NIO(可以支持 Netty。定义一个静态内部类实现定时删除快照的任务。Zookeeper 服务的启动命令是。跟进定时任务的start方法。查看具体清理过期数据的方法。通信初始化具体实现代码。原创 2023-04-16 16:17:38 · 611 阅读 · 0 评论 -
Zookeeper源码分析——算法基础
Zab 借鉴了Paxos 算法,是特别为Zookeeper 设计的支持崩溃恢复的原子广播协议。基于该协议,Zookeeper 设计为只有一台客户端(Leader)负责处理外部的写事务请求,然后Leader 客户端将数据同步到其他Follower 节点。即Zookeeper 只有一个Leader 可以发起提案。原创 2023-04-15 15:54:54 · 405 阅读 · 0 评论 -
Maven配置私服
团队开发现状分析(1)张三负责ssm_crm的开发,自己写了一个ssm_pojo模块,要想使用直接将ssm_pojo安装到本地仓库即可(2)李四负责ssm_order的开发,需要用到张三所写的ssm_pojo模块,这个时候如何将张三写的ssm_pojo模块交给李四呢?(3)如果直接拷贝,那么团队之间的jar包管理会非常混乱而且容器出错,这个时候我们就想能不能将写好的项目上传到中央仓库,谁想用就直接联网下载即可。原创 2023-04-10 08:41:29 · 616 阅读 · 3 评论 -
Zookeeper安装(Win和Linux)
1.1 下载安装下载好的文件进行解压缩得到apache-zookeeper-3.8.0-bin目录,创建zkdata及log目录,后续作为数据存放目录。原创 2023-04-09 15:17:31 · 406 阅读 · 0 评论 -
采用多种方式实现项目的查询多级缓存(六)
其实就是多了缓存时间参数,过期后nginx缓存会自动删除,下次访问即可更新缓存。现在,整个多级缓存中只差最后一环,也就是nginx的本地缓存了。的功能,可以在nginx的多个worker之间共享数据,实现缓存功能。因为库存更新频率较高,如果缓存时间过长,可能与数据库差异较大。这里给商品基本信息设置超时时间为30分钟,库存为1分钟。OpenResty为Nginx提供了。原创 2023-04-09 15:09:01 · 385 阅读 · 0 评论 -
采用多种方式实现项目的查询多级缓存(五)
在实际开发中,我们可以利用大数据统计用户访问的热点数据,在项目启动时将这些热点数据提前查询并保存到Redis中。:服务刚刚启动时,Redis中并没有缓存,如果所有商品数据都在第一次查询时添加缓存,可能会给数据库带来较大压力。现在,Redis缓存已经准备就绪,我们可以再OpenResty中实现查询Redis的逻辑了。我们数据量较少,并且没有数据统计相关功能,目前可以在启动时将所有数据都放入缓存中。接下来,我们就可以去修改item.lua文件,实现对Redis的查询了。3)配置Redis地址。原创 2023-04-08 11:41:57 · 254 阅读 · 0 评论 -
采用多种方式实现项目的查询多级缓存(四)
因为item-service中的接口都是/item开头,所以我们监听/item路径,代理到windows上的tomcat服务。你看,因为轮询的原因,第一次查询8081形成的JVM缓存并未生效,直到下一次再次访问到8081时才可以生效,缓存命中率太低了。nginx根据请求路径做hash运算,把得到的数值对tomcat服务的数量取余,余数是几,就访问第几个服务,实现负载均衡。只要id不变,每次hash运算结果也不会变,那就可以保证同一个商品,一直访问同一个tomcat服务,确保JVM缓存生效。原创 2023-04-07 23:03:50 · 284 阅读 · 0 评论 -
采用多种方式实现项目的查询多级缓存(三)
官方网站: https://openresty.org/cn/首先你的Linux虚拟机必须联网。原创 2023-04-06 20:58:16 · 240 阅读 · 0 评论 -
采用多种方式实现项目的查询多级缓存(二)
是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。:在默认情况下,当一个缓存元素过期的时候,Caffeine不会自动立即将其清理和驱逐。Caffeine既然是缓存的一种,肯定需要有缓存的清除策略,不然的话内存总会有耗尽的时候。首先,我们需要定义两个Caffeine的缓存对象,分别保存商品、库存的缓存数据。原创 2023-04-05 21:04:03 · 287 阅读 · 0 评论 -
采用多种方式实现项目的查询多级缓存(一)
在多级缓存架构中,Nginx内部需要编写本地缓存查询、Redis查询、Tomcat查询的业务逻辑,因此这样的nginx服务不再是一个。传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库。一个是在nginx中编写业务,实现nginx本地缓存、Redis、Tomcat的查询。其中Nginx编程则会用到OpenResty框架结合Lua这样的语言。•请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈。•Redis缓存失效时,会对数据库产生冲击。原创 2023-04-05 19:23:43 · 301 阅读 · 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 · 361 阅读 · 0 评论 -
Redis搭建哨兵集群
这里我们搭建一个三节点形成的Sentinel集群,来监管之前的Redis主从集群。原创 2023-04-04 09:47:06 · 398 阅读 · 0 评论 -
Redis安装主从集群
然后将课前资料提供的Redis安装包上传到虚拟机的任意目录:例如,我放到了/tmp目录:解压后:如果没有出错,应该就安装成功了。将中的改为修改(260行)文件将里面的改成yes,让服务在后台启动远程连接测试成功。原创 2023-04-03 23:10:53 · 131 阅读 · 0 评论 -
Linux防火墙相关操作
防火墙操作原创 2022-12-31 20:30:27 · 60 阅读 · 0 评论 -
C语言期末复习题(下)
0 };i < n;i < 10;} } printf("比avg%d大的数有%d个" , avgx , key);return 0;}原创 2022-11-12 22:47:34 · 730 阅读 · 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 · 1037 阅读 · 0 评论 -
Java中的ArrayList 重要方法补充
数组列表 的**retainall()**方法用于移除指定集合中未包含的所有数组列表元素,或者保留当前数组列表实例中所有匹配元素,这些元素匹配作为参数传递给该方法的集合列表中的所有元素。 语法:**参数:**C是包含要保留在列表中的元素的集合。 **返回值:**如果调用 else 导致列表发生变化,则该方法返回布尔值 true,否则返回 false。 例外:OutputJava 中的 ArrayList forEach()方法数组列表 的 forEach() 方法用于对数组列表中的每个元素执行一定的原创 2022-10-17 22:31:48 · 210 阅读 · 0 评论 -
Java复制(拷贝)数组的5种方法
所谓复制数组,是指将一个数组中的元素在另一个数组中进行复制。原创 2022-10-08 15:10:39 · 2839 阅读 · 0 评论 -
Java 创建流的10种方法
Java 8 中引入的,用于处理对象的集合。Stream 是一个对象序列,它支持许多不同的方法,这些方法可以通过管道排列来产生所需的结果。Java 流的特点是–原创 2022-10-07 14:04:51 · 1288 阅读 · 0 评论 -
C语言练习题(持续更新)
找出一个矩阵中的鞍点,即该位置元素的该行上最大,该列上最小,一个矩阵可能没有鞍点,如果没有输出对应的信息,如果有,则输出鞍点位置和值。求二位数组(五行五列)中最大的元素及其行列号。求二维数组(三行三列的对角线元素的和)原创 2022-09-30 13:28:20 · 756 阅读 · 0 评论 -
Java常用工具环境安装手册(持续更新)
双击下载的 exe,如 jdk-8u131-windows-x64.exe。进入安装向导点击确定下一步,开始安装安装 jre,可以更改 jre 安装路径。(过程同上述安装目录的选择) 注意:如果提示需要将 jre 安装在一个空目录下,那自己创建一个目录即可。原创 2022-09-05 19:07:09 · 1183 阅读 · 0 评论 -
Windows cmd方法杀死端口
netstat -ano | findstr 8080:查看8080端口状态taskkill /pid PID/f:杀掉占用8080端口的PID原创 2021-12-13 10:15:53 · 590 阅读 · 0 评论 -
自定义Typora代码块样式
对于代码的颜色自己喜欢比较瞎搞,今天分享如何让自定义Typora代码块颜色CodeMirror: Theme Demo在这个网站中选择自己想要的代码块主题Index of /theme/ (codemirror.net)在这个网站中找到对应的CSS文件,点击看图操作!在主题文件夹下新建一个CSS文件,将网站内容复制进去,最后替换指定内容,dracula为例,这里为其代码中所有的.cm-s-dracula改为.cm-s-inner最后在主题文件下引入CSS样式,重启Typora即可.原创 2021-12-01 17:13:59 · 4283 阅读 · 2 评论 -
Java中BigDecimal和BigInteger用法知识点补充
今天开发过程中遇到了数据库字段的属性为BigDecimal,对这个属性有点陌生,查看了下JavaAPI和阿里Java编码规范中和Mysql建表约束中明确规范,写几个BigDecimal类型的方法熟悉下用法,同时还遇到BigInteger的用法,一起特此记录下!BigDecimaljava.lang.Objectjava.lang.Numberjava.math.BigDecimalBigDecimal可以表示一个任意大小且精度完全准确的浮点数public static void mai原创 2021-11-30 15:03:27 · 374 阅读 · 0 评论 -
Git常用命令速查表
文章目录Git常用命令速查创建版本库修改和提交查看历史提交取消分支与标签合并与衍合远程操作Git常用命令速查创建版本库$ git clone <url> #克隆远程版本$ git init #初始化本地版本库$ git config --global user.name 用户名 #设置用户名$ git config --global user.email 邮箱 #设置邮箱修改和提交$ git status #查看状态$ git diff #查看便变更内容$ git原创 2021-11-25 13:23:33 · 88 阅读 · 0 评论 -
数据库Join联查操作知识点补充
最近在学习数据库的操作,遇到了Left join,Right join ,有点不太明白,写篇博客记录下不足的知识点从网上找到一张图,比较形象有四种写法LEFT JOINSELECT * FROM A LEFT JOIN B ON A.字段=B.字段A左连接B,以A表为主,显示的数据是A表数据以及AB表的交集数据RIGHT JOINSELECT * FROM A LEFT JOIN B ON A.字段=B.字段A右连接``B,以B表为主,关联查询B表的数据以及AB`表的交集数据INN原创 2021-11-24 16:22:00 · 4263 阅读 · 0 评论